[qo-modules-dev] [33]

[ Thread Index | Date Index | More lists.tuxfamily.org/qo-modules-dev Archives ]


Revision: 33
Author:   mjlecomte
Date:     2008-12-02 04:45:15 +0100 (Tue, 02 Dec 2008)

Log Message:
-----------


Added Paths:
-----------
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/controller.js
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/delete/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/delete/Desktop.js
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/delete/PortalColumn.js
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/delete/Portlet.js
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/delete/desktop-old.html
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/delete/modules-preload.js
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/delete/portal.css
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/desktop.html
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/eos.jpg
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/accordian.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/bogus.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/desktop.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/desktop3.jpg
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/gears.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/gears.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/grid.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/grid32x32.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/grid48x48.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/grid48x48.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/hatch.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/hd-bg.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/hd-tb-bg.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/icon_padlock.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/icons-bg.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/im32x32.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/im48x48.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/im48x48.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/launcher-bg.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/launcher-btn.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/logout.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/logout.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/member.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/member.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/powered.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/powered.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/s.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/tabs.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/taskbar/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/taskbar/black/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/taskbar/black/item-over.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/taskbar/black/scroll-left.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/taskbar/black/scroll-right.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/taskbar/black/start-menu-left-corners.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/taskbar/black/start-menu-left-right.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/taskbar/black/start-menu-right-corners.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/taskbar/black/start-menu-right.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/taskbar/black/start-menu-top-bottom.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/taskbar/black/startbutton-icon.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/taskbar/black/startbutton.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/taskbar/black/taskbar-split-h.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/taskbar/black/taskbar-start-panel-bg.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/taskbar/black/taskbutton.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/taskbar/black/taskbuttons-panel-bg.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/winbar-bg.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/winbar-btn.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/windows-bg.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/ActiveApps.js
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/App.js
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/Appbar.js
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/Desktop.js
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/Launch.js
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/Module.js
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/RemoteLoader.js
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/StartMenu.js
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/TaskBar.js
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/TaskButton.js
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/View.js
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/archive/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/archive/App-old.js
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/archive/App-original.js
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/archive/App-remaining.js
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/archive/App-remaining2.js
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/archive/Buttonbar.js
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/archive/LaunchMgr.js
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/archive/Portal.js
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/archive/QuickStart.js
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/archive/garbage.js
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/layoutwindow.js
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/modules-preload.txt
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/override.js
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/css/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/css/desktop.css
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/css/eos.jpg
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/accordian.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/bogus.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/caution.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/clock.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/download.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/gears.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/grid.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/grid48x48.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/grid48x48.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/hourglass.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/icon_padlock.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/icons-bg.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/im48x48.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/im48x48.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/info.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/logout.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/member.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/quote.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/tabs.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/working.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/menu/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/menu/menu.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/s.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/startmenu/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/startmenu/app-item-over.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/startmenu/left-corners.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/startmenu/left-right.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/startmenu/right-corners.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/startmenu/right.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/startmenu/submenu16x16.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/startmenu/top-bottom.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/startmenu/vista-blue-window.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/taskbar/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/taskbar/quickstart-button.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/taskbar/quickstart-menubutton-icon.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/taskbar/quickstart-menubutton.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/taskbar/scroll-left.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/taskbar/scroll-right.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/taskbar/startbutton-icon.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/taskbar/startbutton.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/taskbar/taskbar-split-h.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/taskbar/taskbar-start-panel-bg.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/taskbar/taskbutton.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/taskbar/taskbuttons-panel-bg.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/css/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/css/xtheme-vistablack.css
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/button/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/button/btn-arrow.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/button/btn-sprite.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/grid/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/grid/grid-split.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/icons/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/icons/download.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/icons/pref-wallpapers.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/icons/pref-wallpapers.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/icons/preferences.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/panel/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/panel/header-bg.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/panel/tool-sprites.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/startmenu/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/startmenu/app-item-over.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/startmenu/left-corners.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/startmenu/left-right.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/startmenu/right-corners.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/startmenu/right.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/startmenu/tool.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/startmenu/top-bottom.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/tabs/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/tabs/tab-strip-bg.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/tabs/tabs-sprite.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/taskbar/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/taskbar/quickstart-button.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/taskbar/quickstart-menubutton-icon.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/taskbar/quickstart-menubutton.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/taskbar/scroll-left.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/taskbar/scroll-right.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/taskbar/startbutton-icon.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/taskbar/startbutton.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/taskbar/taskbar-split-h.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/taskbar/taskbar-start-panel-bg.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/taskbar/taskbutton.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/taskbar/taskbuttons-panel-bg.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/toolbar/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/toolbar/bg.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/toolbar/gray-bg.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/toolbar/tb-btn-sprite.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/tree/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/tree/elbow-end-minus-nl.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/tree/elbow-plus-nl.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/tree/folder.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/tree/plugin.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/window/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/window/left-corners.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/window/left-right.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/window/right-corners.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/window/side-panel-bluegreen.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/window/tool-sprites.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/window/tool-sprites.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/window/top-bottom.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/window/ux-tools.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/xtheme-vistablack.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/css/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/css/xtheme-vistablue.css
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/button/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/button/btn-arrow.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/button/btn-sprite.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/grid/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/grid/grid-split.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/icons/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/icons/download.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/panel/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/panel/header-bg.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/panel/tool-sprites.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/startmenu/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/startmenu/app-item-over.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/startmenu/left-corners.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/startmenu/left-right.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/startmenu/right-corners.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/startmenu/right.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/startmenu/tool.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/startmenu/tool.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/startmenu/top-bottom.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/tabs/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/tabs/tab-strip-bg.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/tabs/tabs-sprite.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/taskbar/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/taskbar/quickstart-button.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/taskbar/quickstart-menubutton-icon.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/taskbar/scroll-left.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/taskbar/scroll-right.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/taskbar/startbutton-icon.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/taskbar/startbutton.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/taskbar/taskbar-split-h.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/taskbar/taskbar-start-panel-bg.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/taskbar/taskbutton.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/taskbar/taskbuttons-panel-bg.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/toolbar/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/toolbar/bg.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/toolbar/gray-bg.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/toolbar/tb-btn-sprite.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/tree/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/tree/elbow-end-minus-nl.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/tree/elbow-plus-nl.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/tree/folder.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/window/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/window/left-corners.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/window/left-right.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/window/right-corners.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/window/tool-sprites.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/window/tool-sprites.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/window/top-bottom.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/window/ux-tools.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/xtheme-vistablue.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/css/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/css/xtheme-vistaglass.css
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/button/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/button/btn-arrow.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/button/btn-sprite.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/grid/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/grid/grid-split.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/icons/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/icons/download.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/icons/pref-wallpapers.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/icons/pref-wallpapers.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/icons/preferences.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/panel/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/panel/header-bg.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/panel/tool-sprites.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/startmenu/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/startmenu/app-item-over.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/startmenu/left-corners.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/startmenu/left-right.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/startmenu/old/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/startmenu/old/left-corners.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/startmenu/old/left-right.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/startmenu/old/right-corners.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/startmenu/old/right.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/startmenu/old/tool.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/startmenu/old/top-bottom.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/startmenu/right-corners.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/startmenu/right.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/startmenu/tool.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/startmenu/top-bottom.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/tabs/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/tabs/tab-close.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/tabs/tab-strip-bg.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/tabs/tabs-sprite.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/taskbar/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/taskbar/quickstart-button.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/taskbar/quickstart-menubutton-icon.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/taskbar/quickstart-menubutton.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/taskbar/scroll-left.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/taskbar/scroll-right.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/taskbar/startbutton-icon.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/taskbar/startbutton.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/taskbar/taskbar-split-h.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/taskbar/taskbar-start-panel-bg.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/taskbar/taskbutton.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/taskbar/taskbuttons-panel-bg.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/toolbar/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/toolbar/bg.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/toolbar/gray-bg.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/toolbar/tb-btn-sprite.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/tree/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/tree/elbow-end-minus-nl.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/tree/elbow-plus-nl.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/tree/folder.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/tree/plugin.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/window/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/window/left-corners.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/window/left-right.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/window/right-corners.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/window/side-panel-bluegreen.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/window/tool-sprites.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/window/tool-sprites.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/window/top-bottom.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/window/ux-tools.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/xtheme-vistaglass.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/blank.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/blue-curtain.jpg
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/blue-psychedelic.jpg
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/blue-swirl.jpg
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/colorado-farm.jpg
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/curls-on-green.jpg
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/emotion.jpg
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/eos.jpg
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/fields-of-peace.jpg
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/fresh-morning.jpg
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/ladybuggin.jpg
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/qwikioffice.jpg
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/summer.jpg
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/thumbnails/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/thumbnails/blank.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/thumbnails/blue-curtain.jpg
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/thumbnails/blue-psychedelic.jpg
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/thumbnails/blue-swirl.jpg
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/thumbnails/colorado-farm.jpg
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/thumbnails/curls-on-green.jpg
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/thumbnails/emotion.jpg
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/thumbnails/eos.jpg
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/thumbnails/fields-of-peace.jpg
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/thumbnails/fresh-morning.jpg
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/thumbnails/ladybuggin.jpg
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/thumbnails/qwikioffice.jpg
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/thumbnails/summer.jpg
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/sample.css
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/core/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/core/App.js
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/core/Desktop.js
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/core/DesktopWindow.js
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/core/HexField.js
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/core/Module.js
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/core/Notification.js
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/core/Shortcut.js
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/core/StartMenu.js
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/core/TaskBar.js
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/dialogs/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/dialogs/colorpicker/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/dialogs/colorpicker/ColorPicker.js
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/dialogs/colorpicker/colorpicker.css
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/dialogs/colorpicker/images/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/dialogs/colorpicker/images/hue.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/dialogs/colorpicker/images/mask.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/dialogs/colorpicker/images/slider-rgb.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/cookies.js
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/ext-login.js
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/forgot-password.css
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/forgot-password.js
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/images/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/images/bg-panel.jpg
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/images/blank.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/images/login-btn.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/images/logo.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/images/screenshot.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/images/send-btn.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/login.js
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/login.php
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/login.php.bak
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/shared.css
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/signup.css
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/signup.js
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/acc-win/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/acc-win/acc-win-override.js
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/acc-win/acc-win.css
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/acc-win/acc-win.js
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/acc-win/images/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/acc-win/images/connect.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/acc-win/images/im16x16.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/acc-win/images/im48x48.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/acc-win/images/user_add.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/acc-win/images/user_delete.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/bogus/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/bogus/bogus-win/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/bogus/bogus-win/bogus-win-override.js
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/bogus/bogus-win/bogus-win.css
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/bogus/bogus-win/bogus-win.js
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/bogus/bogus-win/images/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/bogus/bogus-win/images/bogus16x16.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/bogus/bogus-win/images/bogus48x48.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/grid-win/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/grid-win/grid-win-override.js
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/grid-win/grid-win.css
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/grid-win/grid-win.js
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/grid-win/images/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/grid-win/images/add.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/grid-win/images/delete.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/grid-win/images/grid16x16.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/grid-win/images/grid48x48.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/grid-win/images/plugin.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/layout-win/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/layout-win/images/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/layout-win/images/layout16x16.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/layout-win/images/layout48x48.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/layout-win/layout-win-override.js
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/layout-win/layout-win.css
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/layout-win/layout-win.js
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/images/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/images/appearance-icon.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/images/autorun-icon.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/images/bg-center-icon.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/images/bg-center-icon.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/images/bg-tile-icon.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/images/bg-tile-icon.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/images/form-collapse-icon.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/images/percent-icon.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/images/pref-icon.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/images/pref-shortcut-icon.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/images/quickstart-icon.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/images/quickstart-icon.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/images/wallpaper-icon.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/images/wallpaper-icon.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/qo-preferences-override.js
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/qo-preferences.css
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/qo-preferences.js
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/qo-preferences.js.bak
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/qo-preferences.php
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/tab-win/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/tab-win/images/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/tab-win/images/tab16x16.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/tab-win/images/tab48x48.png
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/tab-win/tab-win-override.js
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/tab-win/tab-win.css
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/tab-win/tab-win.js
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/os/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/os/config.php
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/os/config.php.bak
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/os/lib/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/os/lib/error.php
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/os/lib/group.php
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/os/lib/json.php
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/os/lib/launcher.php
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/os/lib/member.php
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/os/lib/module.php
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/os/lib/preference.php
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/os/lib/privilege.php
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/os/lib/session.php
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/os/lib/theme.php
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/os/os.php
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/wallpapers/
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/wallpapers/blue.jpg
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/wallpapers/desk.jpg
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/wallpapers/desktop.jpg
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/wallpapers/desktop2.jpg
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/wallpapers/ext.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/wallpapers/shiny.gif
    mickael/trunk/ext/v3.0.0-a1/learn/desktop/wallpapers/sky.jpg


Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/controller.js
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/controller.js	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/controller.js	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,111 @@
+//Ext.BLANK_IMAGE_URL = base_url + 'assets/images/' + 's.gif';//'resources/images/default/s.gif';
+Ext.BLANK_IMAGE_URL = '../../resources/images/default/s.gif'; 
+
+/**
+ * Application Controller
+ * This file is used to configure the application's main Controller Class.
+ * This class immediately creates an instance of our application, kicking
+ * of the application (some of the code execution to acquire remote resources
+ * etc. does NOT wait for Ext.onReady).
+ */ 
+Ext.app.controller = new Ext.ux.App({
+    
+    /**
+     * @cfg {Object} Start Menu configuration
+     */        
+    startConfig: {
+        // iconCls: 'user',
+        // title: get_cookie('memberName'),
+        toolPanelWidth: 200,
+        scope: this
+    },
+    
+    /**
+     * @cfg {Object} Start Menu's logout button configuration
+     */        
+    logoutConfig: {
+        text: 'Logout',
+        iconCls: 'logout',
+        handler: function () {
+            window.location = "logout.php";
+        },
+        scope: this
+    },
+
+    /**
+     * @cfg {Boolean}
+     */        
+    remoteLoad: true,
+    
+    /**
+     * @cfg {String} onFileLoad
+     * the method used to include remotely loaded javascript resources ('eval' or 'head').
+     * 'eval' will eval the remote resource upon retrieval, 'head' will include that
+     * source into the head element of the page.
+     */        
+    onFileLoad: 'head',//'head' or 'eval'
+    
+    urlConnect: 'connect.php',
+
+    /**
+     * @cfg {String} urlLoad
+     */        
+    urlLoad: 'modules-preload.txt',//'loader.php',
+
+    /**
+     * @cfg {String} paramsLoad
+     */        
+    paramsLoad: {
+        testing: 'Testing params'
+    },
+
+    /**
+     * this method called as last step in initPlatform()
+     */    
+    init: function () {
+        this.preventBackspace();
+        Ext.QuickTips.init();
+    },
+
+    /**
+     * getPlatform is an interface method that has two requirements:
+     * 1. set this.platformLoaded = true;
+     * 2. set this.modules (an array of module config objects)
+     * Can optionally specify additional platform configs, but the
+     * app will not do anything without the above 2 requirements satisfied.
+     */
+    getPlatform: function () {
+        this.loadPlatform();
+    },
+
+    /**
+     * loadPlatform implementation example 1.
+     */
+    loadPlatform: function () {
+        Ext.ux.RemoteLoader.load({
+            url:    this.urlLoad,
+            root:   'platform',
+            params: this.paramsLoad,
+            scope:  this
+        });
+    }
+
+    /**
+     * loadPlatform implementation example 2.
+     */
+/*
+    loadPlatform: function() {
+        this.platformLoaded = true;
+        
+        //send back an array of module config objects:
+        //return [
+        this.modules = [
+              new Ext.ux.Modules.grid_win()//,
+        //    new MyDesktop.TabWindow(),
+         //   new MyDesktop.AccordionWindow(),
+         //   new MyDesktop.BogusMenuModule(),
+          //  new MyDesktop.BogusModule()
+        ];
+    }
+*/
+});
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/delete/Desktop.js
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/delete/Desktop.js	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/delete/Desktop.js	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,144 @@
+/*
+ * Ext JS Library 2.2
+ * Copyright(c) 2006-2008, Ext JS, LLC.
+ * licensing@xxxxxxxxx
+ * 
+ * http://extjs.com/license
+ */
+
+Ext.Desktop = function(app){
+    this.taskbar = new Ext.ux.TaskBar(app);
+    var taskbar = this.taskbar;
+    
+    var desktopEl = Ext.get('x-desktop');
+    var taskbarEl = Ext.get('ux-taskbar');
+    var shortcuts = Ext.get('x-shortcuts');
+
+    //use window manager to create a group of windows
+    var windows = new Ext.WindowGroup();
+    var activeWindow;
+        
+    function minimizeWin(win){
+        win.minimized = true;
+        win.hide();
+    }
+
+    function markActive(win){
+        if(activeWindow && activeWindow != win){
+            markInactive(activeWindow);
+        }
+        taskbar.setActiveButton(win.taskButton);
+        activeWindow = win;
+        Ext.fly(win.taskButton.el).addClass('active-win');
+        win.minimized = false;
+    }
+
+    function markInactive(win){
+        if(win == activeWindow){
+            activeWindow = null;
+            Ext.fly(win.taskButton.el).removeClass('active-win');
+        }
+    }
+
+    function removeWin(win){
+        taskbar.removeTaskButton(win.taskButton);
+        layout();
+    }
+
+    function layout(){
+        desktopEl.setHeight(Ext.lib.Dom.getViewHeight()-taskbarEl.getHeight());
+    }
+    Ext.EventManager.onWindowResize(layout);
+
+    this.layout = layout;
+
+//    this.createWindow = function(config, cls){
+    this.createWindow = function(config, cls, module){
+        
+        var win = new (cls||Ext.Window)(
+            Ext.applyIf(config||{}, {
+                id: module.id,
+                iconCls: module.iconCls,
+                module: module,//helpful?
+                manager: windows,
+                minimizable: true,
+                maximizable: true
+            })
+        );
+        win.render(desktopEl);
+        
+        //add the module to the taskbar as a button:
+        win.taskButton = taskbar.addTaskButton(win);
+
+        win.cmenu = new Ext.menu.Menu({
+            items: [
+
+            ]
+        });
+
+        win.animateTarget = win.taskButton.el;
+        
+        win.on({
+            'activate': {
+                fn: markActive
+            },
+            'beforeshow': {
+                fn: markActive
+            },
+            'deactivate': {
+                fn: markInactive
+            },
+            'minimize': {
+                fn: minimizeWin
+            },
+            'close': {
+                fn: removeWin
+            }
+        });
+        
+        layout();
+        return win;
+    };
+
+    this.getManager = function(){
+        return windows;
+    };
+
+    this.getWindow = function(id){
+        return windows.get(id);
+    }
+    
+    this.getWinWidth = function(){
+        var width = Ext.lib.Dom.getViewWidth();
+        return width < 200 ? 200 : width;
+    }
+        
+    this.getWinHeight = function(){
+        var height = (Ext.lib.Dom.getViewHeight()-taskbarEl.getHeight());
+        return height < 100 ? 100 : height;
+    }
+        
+    this.getWinX = function(width){
+        return (Ext.lib.Dom.getViewWidth() - width) / 2
+    }
+        
+    this.getWinY = function(height){
+        return (Ext.lib.Dom.getViewHeight()-taskbarEl.getHeight() - height) / 2;
+    }
+
+    layout();
+    if(shortcuts){
+        shortcuts.on('click', function(e, t){
+            var target = e.getTarget('dt', shortcuts);
+            if(target){
+//            if(t = e.getTarget('dt', shortcuts)){
+                e.stopEvent();
+                var module = app.getModule(target.id.replace('-shortcut', ''));
+                if(module){
+//                    module.createWindow();
+                    module.show();//have show check if exists and then do createWindow
+                }
+            }
+        });
+    }
+};
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/delete/PortalColumn.js
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/delete/PortalColumn.js	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/delete/PortalColumn.js	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,15 @@
+/*
+ * Ext JS Library 2.2
+ * Copyright(c) 2006-2008, Ext JS, LLC.
+ * licensing@xxxxxxxxx
+ * 
+ * http://extjs.com/license
+ */
+
+Ext.ux.PortalColumn = Ext.extend(Ext.Container, {
+    layout: 'anchor',
+    autoEl: 'div',
+    defaultType: 'portlet',
+    cls:'x-portal-column'
+});
+Ext.reg('portalcolumn', Ext.ux.PortalColumn);
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/delete/Portlet.js
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/delete/Portlet.js	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/delete/Portlet.js	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,16 @@
+/*
+ * Ext JS Library 2.2
+ * Copyright(c) 2006-2008, Ext JS, LLC.
+ * licensing@xxxxxxxxx
+ * 
+ * http://extjs.com/license
+ */
+
+Ext.ux.Portlet = Ext.extend(Ext.Panel, {
+    anchor: '100%',
+    frame:true,
+    collapsible:false,//true,
+    draggable:true,
+    cls:'x-portlet'
+});
+Ext.reg('portlet', Ext.ux.Portlet);
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/delete/desktop-old.html
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/delete/desktop-old.html	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/delete/desktop-old.html	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,64 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<title>Ext 2.0 Desktop Sample App</title>
+
+    <link rel="stylesheet" type="text/css" href="../../resources/css/ext-all.css" />
+    <link rel="stylesheet" type="text/css" href="portal.css" />
+    <link rel="stylesheet" type="text/css" href="css/desktop.css" />
+
+    <!-- GC -->
+ 	<!-- LIBS -->
+ 	<script type="text/javascript" src="../../adapter/ext/ext-base.js"></script>
+ 	<!-- ENDLIBS -->
+
+    <script type="text/javascript" src="../../ext-all-detail.js"></script>
+
+
+    <script type="text/javascript" src="js/Portal.js"></script>
+    <script type="text/javascript" src="js/PortalColumn.js"></script>
+    <script type="text/javascript" src="js/Portlet.js"></script>
+
+
+    <!-- DESKTOP - ->
+    <script type="text/javascript" src="override.js"></script>
+    <script type="text/javascript" src="js/StartMenu.js"></script>
+    <script type="text/javascript" src="js/TaskBar.js"></script>
+    <script type="text/javascript" src="js/Desktop.js"></script>
+    <script type="text/javascript" src="js/App.js"></script>
+    <script type="text/javascript" src="js/Module.js"></script>
+-->
+    <script type="text/javascript" src="sample.js"></script>
+<!--    
+    <script type="text/javascript" src="modules.js"></script>
+-->
+</head>
+<body></body>
+ 	<!--  
+
+<body scroll="no">
+
+<div id="x-desktop">
+    <a href="http://extjs.com"; target="_blank" style="margin:5px; float:right;"><img src="images/powered.gif" /></a>
+
+    <dl id="x-shortcuts">
+        <dt id="grid-win-shortcut">
+            <a href="#"><img src="images/s.gif" />
+            <div>Grid Window</div></a>
+        </dt>
+        <dt id="acc-win-shortcut">
+            <a href="#"><img src="images/s.gif" />
+            <div>Accordion Window</div></a>
+        </dt>
+    </dl>
+</div>
+
+<div id="ux-taskbar">
+	<div id="ux-taskbar-start"></div>
+	<div id="ux-taskbuttons-panel"></div>
+	<div class="x-clear"></div>
+</div>
+
+</body>
+-->
+</html>

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/delete/modules-preload.js
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/delete/modules-preload.js	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/delete/modules-preload.js	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,479 @@
+Ext.ns('Ext.ux.Modules');
+
+/**
+ * Example of a Module config object
+ */
+Ext.ux.Modules.grid_win = Ext.extend(Ext.ux.Module, {
+    //A moduleConfig will have this minimum form if not preloaded:
+    
+    // id (required), must be unique for entire app
+    id: 'grid-win',
+
+    xtype : 'm_grid', // formerly 'moduleType'
+    iconCls: 'grid-icon',
+
+    // To signify that no additional configuration should be retrieved from the server
+    // just set the 'loaded' config property to true so that the component will not be
+    // retrieved from the server again.
+    //loaded : true,
+
+    launcher : {
+        defaults: {
+            iconCls: 'acc-icon',
+            shortcutIconCls: 'demo-acc-shortcut',
+            text: 'Accordion Window',
+            tooltip: '<b>Accordion Window</b><br />A window with an accordion layout'
+        },
+
+        //do not specify an id, this is managed by the class
+        //id: this.id+'_launcher',
+        
+        //if want launcher included in Start Menu specify the path
+        menuPath : 'StartMenu',
+        //an array of where launchers will be shown
+        menus: [
+
+            //specify a string for the name, and any defaults will be applied:
+            'autorun', 'context', 'quickstart',
+
+            //or specify a full config for finer control:
+            {
+                name: 'shortcut',
+                // notice that these are the same as used in 'defaults' config
+                // only need to specify in one location
+                iconCls: 'acc-icon',
+                shortcutIconCls: 'demo-acc-shortcut',
+                text: 'Accordion Window',
+                tooltip: '<b>Accordion Window</b><br />A window with an accordion layout'
+            }
+            //handler to launch this module, default is this.show
+//          handler : this.createWindow,
+            //handler : this.show,
+            
+            //scope for the handler, defaults to this Module
+            //scope: this
+        ]  
+    },
+
+    // end of required configs
+    // ======================
+    // optional configs:
+
+    //load configuration:
+    loader: {
+        url: 'loader.php', // so use loader.url || this.loader;
+        params: {
+            foo: 'bar'
+        }
+    },
+
+    //As with any class or xtype, specify as much additional configuration as you want may be preconfigured
+    foo : 'bar'
+});
+
+Ext.override(Ext.ux.Modules.grid_win, {
+
+    /**
+     * Creates the Module's GUI
+     * @param {Object} src the launcher
+     * @param {Object} e event object from the launcher being clicked
+     */
+    createWindow : function(src, e){
+//        var desktop = this.app.getDesktop();
+//        var win = desktop.getWindow('grid-win');
+//        if(!win){
+//            win = desktop.createWindow({
+
+        //optionally specify the class, defaults to Ext.Window (must be a class that has a render() method)
+        var cls = Ext.Window;
+
+        //config object for the class:
+        var config = {
+            //==============
+            //DEFAULTS BEGIN:
+                        
+            //do not specify an id, this is managed by the class
+            //id: this.id,
+            
+            //iconCls defaults to that specified by the launcher
+            //iconCls: 'icon-grid',
+            
+            //manager: windows, //default = windows; specify a new group if needed
+            //minimizable: true,//default = true
+            //maximizable: true,//default = true
+            //DEFAULTS END:
+            //==============
+            
+            title:'Grid Window',
+            width:740,
+            height:480,
+            
+            shim:false,
+            animCollapse:false,
+            constrainHeader:true,
+            layout: 'fit',
+            items:
+                new Ext.grid.GridPanel({
+                    id: this.id+'_gridpanel',
+                    border:false,
+                    ds: new Ext.data.Store({
+                        reader: new Ext.data.ArrayReader({}, [
+                           {name: 'company'},
+                           {name: 'price', type: 'float'},
+                           {name: 'change', type: 'float'},
+                           {name: 'pctChange', type: 'float'}
+                        ]),
+                        data: Ext.grid.dummyData
+                    }),
+                    cm: new Ext.grid.ColumnModel([
+                        new Ext.grid.RowNumberer(),
+                        {header: "Company", width: 120, sortable: true, dataIndex: 'company'},
+                        {header: "Price", width: 70, sortable: true, renderer: Ext.util.Format.usMoney, dataIndex: 'price'},
+                        {header: "Change", width: 70, sortable: true, dataIndex: 'change'},
+                        {header: "% Change", width: 70, sortable: true, dataIndex: 'pctChange'}
+                    ]),
+                    viewConfig: {
+                        forceFit:true
+                    },
+                    //autoExpandColumn:'company',
+                    tbar:[{
+                        text:'Add Something',
+                        tooltip:'Add a new row',
+                        iconCls:'add'
+                    }, '-', {
+                        text:'Options',
+                        tooltip:'Blah blah blah blaht',
+                        iconCls:'option'
+                    },'-',{
+                        text:'Remove Something',
+                        tooltip:'Remove the selected item',
+                        iconCls:'remove'
+                    }]
+                }) // end items
+        };
+        
+        //this.createWindow = function(config, cls){
+        return this.app.view.createWindow(config, cls, this);
+
+//        win.show();
+    }
+});
+
+
+/*
+Platform.TabWindow = Ext.extend(Ext.app.Module, {
+    id:'tab-win',
+    init : function(){
+        this.launcher = {
+            text: 'Tab Window',
+            iconCls:'tabs',
+//            handler : this.createWindow,
+            handler : this.show,
+            scope: this
+        }
+    },
+
+    createWindow : function(){
+//        var desktop = this.app.getDesktop();
+//        var win = desktop.getWindow('tab-win');
+//        if(!win){
+//            win = desktop.createWindow({
+            return this.app.view.createWindow({
+                id: 'tab-win',
+                title:'Tab Window',
+                width:740,
+                height:480,
+                iconCls: 'tabs',
+                shim:false,
+                animCollapse:false,
+                border:false,
+                constrainHeader:true,
+
+                layout: 'fit',
+                items:
+                    new Ext.TabPanel({
+                        activeTab:0,
+
+                        items: [{
+                            title: 'Tab Text 1',
+                            header:false,
+                            html : '<p>Something useful would be in here.</p>',
+                            border:false
+                        },{
+                            title: 'Tab Text 2',
+                            header:false,
+                            html : '<p>Something useful would be in here.</p>',
+                            border:false
+                        },{
+                            title: 'Tab Text 3',
+                            header:false,
+                            html : '<p>Something useful would be in here.</p>',
+                            border:false
+                        },{
+                            title: 'Tab Text 4',
+                            header:false,
+                            html : '<p>Something useful would be in here.</p>',
+                            border:false
+                        }]
+                    })
+            });
+//        }
+//        win.show();
+    }
+});
+
+
+
+Platform.AccordionWindow = Ext.extend(Ext.app.Module, {
+    id:'acc-win',
+    init : function(){
+        this.launcher = {
+            text: 'Accordion Window',
+            iconCls:'accordion',
+//            handler : this.createWindow,
+            handler : this.show,
+            scope: this
+        }
+    },
+
+    createWindow : function(){
+//        var desktop = this.app.getDesktop();
+//        var win = desktop.getWindow('acc-win');
+//        if(!win){
+//            win = desktop.createWindow({
+            return this.app.view.createWindow({
+                id: 'acc-win',
+                title: 'Accordion Window',
+                width:250,
+                height:400,
+                iconCls: 'accordion',
+                shim:false,
+                animCollapse:false,
+                constrainHeader:true,
+
+                tbar:[{
+                    tooltip:{title:'Rich Tooltips', text:'Let your users know what they can do!'},
+                    iconCls:'connect'
+                },'-',{
+                    tooltip:'Add a new user',
+                    iconCls:'user-add'
+                },' ',{
+                    tooltip:'Remove the selected user',
+                    iconCls:'user-delete'
+                }],
+
+                layout:'accordion',
+                border:false,
+                layoutConfig: {
+                    animate:false
+                },
+
+                items: [
+                    new Ext.tree.TreePanel({
+                        id:'im-tree',
+                        title: 'Online Users',
+                        loader: new Ext.tree.TreeLoader(),
+                        rootVisible:false,
+                        lines:false,
+                        autoScroll:true,
+                        tools:[{
+                            id:'refresh',
+                            on:{
+                                click: function(){
+                                    var tree = Ext.getCmp('im-tree');
+                                    tree.body.mask('Loading', 'x-mask-loading');
+                                    tree.root.reload();
+                                    tree.root.collapse(true, false);
+                                    setTimeout(function(){ // mimic a server call
+                                        tree.body.unmask();
+                                        tree.root.expand(true, true);
+                                    }, 1000);
+                                }
+                            }
+                        }],
+                        root: new Ext.tree.AsyncTreeNode({
+                            text:'Online',
+                            children:[{
+                                text:'Friends',
+                                expanded:true,
+                                children:[{
+                                    text:'Jack',
+                                    iconCls:'user',
+                                    leaf:true
+                                },{
+                                    text:'Brian',
+                                    iconCls:'user',
+                                    leaf:true
+                                },{
+                                    text:'Jon',
+                                    iconCls:'user',
+                                    leaf:true
+                                },{
+                                    text:'Tim',
+                                    iconCls:'user',
+                                    leaf:true
+                                },{
+                                    text:'Nige',
+                                    iconCls:'user',
+                                    leaf:true
+                                },{
+                                    text:'Fred',
+                                    iconCls:'user',
+                                    leaf:true
+                                },{
+                                    text:'Bob',
+                                    iconCls:'user',
+                                    leaf:true
+                                }]
+                            },{
+                                text:'Family',
+                                expanded:true,
+                                children:[{
+                                    text:'Kelly',
+                                    iconCls:'user-girl',
+                                    leaf:true
+                                },{
+                                    text:'Sara',
+                                    iconCls:'user-girl',
+                                    leaf:true
+                                },{
+                                    text:'Zack',
+                                    iconCls:'user-kid',
+                                    leaf:true
+                                },{
+                                    text:'John',
+                                    iconCls:'user-kid',
+                                    leaf:true
+                                }]
+                            }]
+                        })
+                    }), {
+                        title: 'Settings',
+                        html:'<p>Something useful would be in here.</p>',
+                        autoScroll:true
+                    },{
+                        title: 'Even More Stuff',
+                        html : '<p>Something useful would be in here.</p>'
+                    },{
+                        title: 'My Stuff',
+                        html : '<p>Something useful would be in here.</p>'
+                    }
+                ]
+            });
+//        }
+//        win.show();
+    }
+});
+
+// for example purposes
+var windowIndex = 0;
+
+Platform.BogusModule = Ext.extend(Ext.app.Module, {
+    init : function(){
+        this.launcher = {
+            text: 'Window '+(++windowIndex),
+            iconCls:'bogus',
+//            handler : this.createWindow,
+            handler : this.show,
+            scope: this,
+//            windowId:windowIndex
+            id:'bogus'+windowIndex
+        }
+    },
+
+    createWindow : function(src){
+//        var desktop = this.app.getDesktop();
+//        var win = desktop.getWindow('bogus'+src.windowId);
+//        if(!win){
+//            win = desktop.createWindow({
+            return this.app.view.createWindow({
+                id: 'bogus'+src.windowId,//
+                title:src.text,
+                width:640,
+                height:480,
+                html : '<p>Something useful would be in here.</p>',
+                iconCls: 'bogus',
+                shim:false,
+                animCollapse:false,
+                constrainHeader:true
+            });
+//        }
+//        win.show();
+    }
+});
+
+
+Platform.BogusMenuModule = Ext.extend(Platform.BogusModule, {
+    init : function(){
+        this.launcher = {
+            text: 'Bogus Submenu',
+            iconCls: 'bogus',
+            handler: function() {
+                return false;
+            },
+            menu: {
+                items:[{
+                    text: 'Bogus Window '+(++windowIndex),
+                    iconCls:'bogus',
+//                    handler : this.createWindow,
+                    handler : this.show,
+                    scope: this,
+                    windowId: windowIndex
+                    },{
+                    text: 'Bogus Window '+(++windowIndex),
+                    iconCls:'bogus',
+//                    handler : this.createWindow,
+                    handler : this.show,
+                    scope: this,
+                    windowId: windowIndex
+                    },{
+                    text: 'Bogus Window '+(++windowIndex),
+                    iconCls:'bogus',
+//                    handler : this.createWindow,
+                    handler : this.show,
+                    scope: this,
+                    windowId: windowIndex
+                    },{
+                    text: 'Bogus Window '+(++windowIndex),
+                    iconCls:'bogus',
+//                    handler : this.createWindow,
+                    handler : this.show,
+                    scope: this,
+                    windowId: windowIndex
+                    },{
+                    text: 'Bogus Window '+(++windowIndex),
+                    iconCls:'bogus',
+//                    handler : this.createWindow,
+                    handler : this.show,
+                    scope: this,
+                    windowId: windowIndex
+                }]
+            }
+        }
+    }
+});
+*/
+
+// Array data for the grid
+Ext.grid.dummyData = [
+    ['3m Co',71.72,0.02,0.03,'9/1 12:00am'],
+    ['Alcoa Inc',29.01,0.42,1.47,'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'],
+    ['Caterpillar Inc.',67.27,0.92,1.39,'9/1 12:00am'],
+    ['Citigroup, Inc.',49.37,0.02,0.04,'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'],
+    ['Johnson & Johnson',64.72,0.06,0.09,'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'],
+    ['The Coca-Cola Company',45.07,0.26,0.58,'9/1 12:00am'],
+    ['The Procter & Gamble Company',61.91,0.01,0.02,'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']
+];

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/delete/portal.css
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/delete/portal.css	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/delete/portal.css	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,42 @@
+/*
+ * Ext JS Library 2.2
+ * Copyright(c) 2006-2008, Ext JS, LLC.
+ * licensing@xxxxxxxxx
+ * 
+ * http://extjs.com/license
+ */
+
+.x-portal .x-panel-dd-spacer {
+    margin-bottom:10px;
+}
+
+.x-portlet {
+    margin-bottom:10px;
+}
+
+/* Clean up the look of the portlets */
+.x-portlet .x-panel-ml {
+    padding-left:2px;
+}
+.x-portlet .x-panel-mr {
+    padding-right:2px;
+}
+.x-portlet .x-panel-bl {
+    padding-left:2px;
+}
+
+.x-portlet .x-panel-br {
+    padding-right:2px;
+}
+.x-portlet .x-panel-body {
+    background:white;
+}
+.x-portlet .x-panel-mc {
+    padding-top:2px;
+}
+.x-portlet .x-panel-bc .x-panel-footer {
+    padding-bottom:2px;
+}
+.x-portlet .x-panel-nofooter .x-panel-bc {
+    height:2px;
+}
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/desktop.html
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/desktop.html	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/desktop.html	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,78 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+  <title>Desktop Sample App</title>
+
+    <!-- CSS -->
+	<link rel="stylesheet" type="text/css" href="../../resources/css/ext-all.css" />
+    <link rel="stylesheet" type="text/css" href="./resources/css/desktop.css" />
+    <link rel="stylesheet" type="text/css" href="sample.css" />
+
+
+    <link rel="stylesheet" type="text/css" href="./system/modules/acc-win/acc-win.css" />
+
+
+ 	<!-- LIBS -->
+ 	<script type="text/javascript" src="../../adapter/ext/ext-base.js"></script>
+<!--
+    <script type="text/javascript" src="../../ext-all.js"></script>
+-->    
+    <script type="text/javascript" src="../../ext-all.js"></script>
+
+ 	<!-- OVERRIDES -->       <!-- Destroy context menus -->
+    <script type="text/javascript" src="override.js"></script>
+
+    <!-- APPLICATION -->     <!-- These must be loaded immediately (logic to get modules, etc.) -->
+    <script type="text/javascript" src="js/Module.js"></script>
+    <script type="text/javascript" src="js/RemoteLoader.js"></script>
+    <script type="text/javascript" src="js/Launch.js"></script>
+    <script type="text/javascript" src="js/App.js"></script>
+
+    <!-- MODEL (Sample Modules) -->  <!-- Flat file for module configuration, could serve this content via php/mySQL -->
+<!-- include this file if testing 
+    <script type="text/javascript" src="modules-preload.js"></script>
+-->    
+
+    <!-- CONTROLLER -->      <!-- All or majority of configuration goes in this file -->
+	<script type="text/javascript" src="controller.js"></script>
+
+    <!-- VIEW RELATED -->    <!-- These files not needed until onReady -->
+    <script type="text/javascript" src="js/StartMenu.js"></script>
+    <script type="text/javascript" src="js/Appbar.js"></script>
+    <script type="text/javascript" src="js/ActiveApps.js"></script>
+    <script type="text/javascript" src="js/TaskBar.js"></script>
+    <script type="text/javascript" src="js/TaskButton.js"></script>
+
+	<script type="text/javascript" src="js/View.js"></script>
+    <script type="text/javascript" src="js/Desktop.js"></script>
+
+</head>
+<body>
+</body>
+<!--  
+<body scroll="no">
+
+<div id="x-desktop">
+    <a href="http://extjs.com"; target="_blank" style="margin:5px; float:right;"><img src="images/powered.gif" /></a>
+
+    <dl id="x-shortcuts">
+        <dt id="grid-win-shortcut">
+            <a href="#"><img src="images/s.gif" />
+            <div>Grid Window</div></a>
+        </dt>
+        <dt id="acc-win-shortcut">
+            <a href="#"><img src="images/s.gif" />
+            <div>Accordion Window</div></a>
+        </dt>
+    </dl>
+</div>
+
+<div id="ux-taskbar">
+	<div id="ux-taskbar-start"></div>
+	<div id="ux-taskbuttons-panel"></div>
+	<div class="x-clear"></div>
+</div>
+
+</body>
+-->
+</html>
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/eos.jpg
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/eos.jpg
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/accordian.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/accordian.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/bogus.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/bogus.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/desktop.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/desktop.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/desktop3.jpg
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/desktop3.jpg
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/gears.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/gears.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/gears.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/gears.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/grid.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/grid.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/grid32x32.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/grid32x32.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/grid48x48.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/grid48x48.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/grid48x48.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/grid48x48.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/hatch.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/hatch.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/hd-bg.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/hd-bg.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/hd-tb-bg.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/hd-tb-bg.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/icon_padlock.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/icon_padlock.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/icons-bg.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/icons-bg.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/im32x32.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/im32x32.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/im48x48.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/im48x48.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/im48x48.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/im48x48.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/launcher-bg.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/launcher-bg.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/launcher-btn.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/launcher-btn.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/logout.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/logout.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/logout.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/logout.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/member.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/member.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/member.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/member.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/powered.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/powered.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/powered.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/powered.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/s.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/s.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/tabs.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/tabs.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/taskbar/black/item-over.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/taskbar/black/item-over.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/taskbar/black/scroll-left.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/taskbar/black/scroll-left.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/taskbar/black/scroll-right.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/taskbar/black/scroll-right.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/taskbar/black/start-menu-left-corners.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/taskbar/black/start-menu-left-corners.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/taskbar/black/start-menu-left-right.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/taskbar/black/start-menu-left-right.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/taskbar/black/start-menu-right-corners.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/taskbar/black/start-menu-right-corners.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/taskbar/black/start-menu-right.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/taskbar/black/start-menu-right.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/taskbar/black/start-menu-top-bottom.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/taskbar/black/start-menu-top-bottom.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/taskbar/black/startbutton-icon.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/taskbar/black/startbutton-icon.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/taskbar/black/startbutton.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/taskbar/black/startbutton.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/taskbar/black/taskbar-split-h.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/taskbar/black/taskbar-split-h.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/taskbar/black/taskbar-start-panel-bg.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/taskbar/black/taskbar-start-panel-bg.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/taskbar/black/taskbutton.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/taskbar/black/taskbutton.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/taskbar/black/taskbuttons-panel-bg.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/taskbar/black/taskbuttons-panel-bg.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/winbar-bg.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/winbar-bg.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/winbar-btn.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/winbar-btn.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/windows-bg.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/images/windows-bg.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/ActiveApps.js
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/ActiveApps.js	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/ActiveApps.js	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,252 @@
+/**
+ * @class Ext.ux.ActiveAppsPanel
+ * @extends Ext.ux.Appbar
+ */
+Ext.ux.ActiveAppsPanel = Ext.extend(Ext.ux.Appbar, {
+    activeButton: null,
+    enableScroll: true,
+    scrollIncrement: 0,
+    scrollRepeatInterval: 400,
+    scrollDuration: 0.35,
+    animScroll: true,
+    resizeButtons: true,
+    buttonWidth: 168,
+    minButtonWidth: 118,
+    buttonMargin: 2,//2,
+    buttonWidthSet: false,
+    toggleGroup: 'taskbuttons',
+
+    baseCls: 'ux-taskbuttons',
+
+    afterAdd: function (btn) {
+        if (!this.buttonWidthSet) {
+            this.lastButtonWidth = btn.container.getWidth();
+        }
+        this.setActiveButton(btn);
+    },
+
+    delegateUpdates: function () {
+        /*if(this.suspendUpdates){
+            return;
+        }*/
+
+        if (this.rendered && this.items) {
+            if (this.resizeButtons) {
+                //this.autoSize();
+            }
+            if (this.enableScroll) {
+                //this.autoScroll();
+            }
+        }       
+    },
+
+    createButton: function (win, el) {
+        var btn = new Ext.ux.TaskBar.TaskButton(win, el);
+        return btn;
+    },
+
+    removeButton: function (btn) {
+
+        btn.destroy();
+        
+        var s = [];
+        for (var i = 0, len = this.items.length; i < len; i++) {
+            if (this.items[i] !== btn) {
+                s.push(this.items[i]);
+            }
+        }
+        this.items = s;
+        this.delegateUpdates();
+    },
+    
+    setActiveButton: function (btn) {
+        this.activeButton = btn;
+        this.delegateUpdates();
+    },
+    
+    autoSize: function () {
+        var count, ow, aw, each, btns, btn, tw, iw;
+       // if (!this.items) return;
+        count = this.items.length;
+        ow = this.el.dom.offsetWidth;
+        aw = this.el.dom.clientWidth;
+
+        if (!this.resizeButtons || count < 1 || !aw) { // !aw for display:none
+            return;
+        }
+        
+        each = Math.max(Math.min(Math.floor((aw - 4) / count) - this.buttonMargin, this.buttonWidth), this.minButtonWidth); // -4 for float errors in IE
+        btns = this.stripWrap.dom.getElementsByTagName('button');
+        
+        this.lastButtonWidth = Ext.get(btns[0].id).findParent('li').offsetWidth;
+        
+        for (var i = 0, len = btns.length; i < len; i++) {            
+            btn = btns[i];
+            
+            tw = Ext.get(btns[i].id).findParent('li').offsetWidth;
+            iw = btn.offsetWidth;
+            
+            btn.style.width = (each - (tw - iw)) + 'px';
+        }
+    },
+    
+    autoScroll: function () {
+        var count, ow, tw, wrap, cw, pos, l;
+        count = this.items.length;
+        ow = this.el.dom.offsetWidth;
+        tw = this.el.dom.clientWidth;
+
+        wrap = this.stripWrap;
+        cw = wrap.dom.offsetWidth;
+        pos = this.getScrollPos();
+        l = this.edge.getOffsetsTo(this.stripWrap)[0] + pos;
+        
+        if (!this.enableScroll || count < 1 || cw < 20) { // 20 to prevent display:none issues
+            return;
+        }
+        
+        wrap.setWidth(tw); // moved to here because of problem in Safari
+        
+        if (l <= tw) {
+            wrap.dom.scrollLeft = 0;
+            //wrap.setWidth(tw); moved from here because of problem in Safari
+            if (this.scrolling) {
+                this.scrolling = false;
+                this.el.removeClass('x-taskbuttons-scrolling');
+                this.scrollLeft.hide();
+                this.scrollRight.hide();
+            }
+        } else {
+            if (!this.scrolling) {
+                this.el.addClass('x-taskbuttons-scrolling');
+            }
+            tw -= wrap.getMargins('lr');
+            wrap.setWidth(tw > 20 ? tw : 20);
+            if (!this.scrolling) {
+                if (!this.scrollLeft) {
+                    this.createScrollers();
+                } else {
+                    this.scrollLeft.show();
+                    this.scrollRight.show();
+                }
+            }
+            this.scrolling = true;
+            if (pos > (l - tw)) { // ensure it stays within bounds
+                wrap.dom.scrollLeft = l - tw;
+            } else { // otherwise, make sure the active button is still visible
+                this.scrollToButton(this.activeButton, true); // true to animate
+            }
+            this.updateScrollButtons();
+        }
+    },
+
+    createScrollers: function () {
+        var h, sl, sr;
+        h = this.el.dom.offsetHeight; //var h = this.stripWrap.dom.offsetHeight;
+        
+        // left
+        sl = this.el.insertFirst({
+            cls: 'ux-taskbuttons-scroller-left'
+        });
+        sl.setHeight(h);
+        sl.addClassOnOver('ux-taskbuttons-scroller-left-over');
+        this.leftRepeater = new Ext.util.ClickRepeater(sl, {
+            interval: this.scrollRepeatInterval,
+            handler: this.onScrollLeft,
+            scope: this
+        });
+        this.scrollLeft = sl;
+
+        // right
+        sr = this.el.insertFirst({
+            cls: 'ux-taskbuttons-scroller-right'
+        });
+        sr.setHeight(h);
+        sr.addClassOnOver('ux-taskbuttons-scroller-right-over');
+        this.rightRepeater = new Ext.util.ClickRepeater(sr, {
+            interval: this.scrollRepeatInterval,
+            handler: this.onScrollRight,
+            scope: this
+        });
+        this.scrollRight = sr;
+    },
+    
+    getScrollWidth: function () {
+        return this.edge.getOffsetsTo(this.stripWrap)[0] + this.getScrollPos();
+    },
+
+    getScrollPos: function () {
+        return parseInt(this.stripWrap.dom.scrollLeft, 10) || 0;
+    },
+
+    getScrollArea: function () {
+        return parseInt(this.stripWrap.dom.clientWidth, 10) || 0;
+    },
+
+    getScrollAnim: function () {
+        return {
+            duration: this.scrollDuration,
+            callback: this.updateScrollButtons,
+            scope: this
+        };
+    },
+
+    getScrollIncrement: function () {
+        return (this.scrollIncrement || this.lastButtonWidth + 2);
+    },
+    
+    /* getBtnEl : function(item){
+        return document.getElementById(item.id);
+    }, */
+    
+    scrollToButton : function (item, animate) {
+        var el, pos, area, right, left;
+        item = item.el.dom.parentNode; // li
+        if (!item) {
+            return;
+        }
+        el = item; //this.getBtnEl(item);
+        pos = this.getScrollPos();
+        area = this.getScrollArea();
+        left = Ext.fly(el).getOffsetsTo(this.stripWrap)[0] + pos;
+        right = left + el.offsetWidth;
+        if (left < pos) {
+            this.scrollTo(left, animate);
+        } else if (right > (pos + area)) {
+            this.scrollTo(right - area, animate);
+        }
+    },
+    
+    scrollTo: function (pos, animate) {
+        this.stripWrap.scrollTo('left', pos, animate ? this.getScrollAnim() : false);
+        if (!animate) {
+            this.updateScrollButtons();
+        }
+    },
+    
+    onScrollRight: function () {
+        var sw, pos, s;
+        sw = this.getScrollWidth() - this.getScrollArea();
+        pos = this.getScrollPos();
+        s = Math.min(sw, pos + this.getScrollIncrement());
+        if (s !== pos) {
+            this.scrollTo(s, this.animScroll);
+        }        
+    },
+
+    onScrollLeft: function () {
+        var pos, s;
+        pos = this.getScrollPos();
+        s = Math.max(0, pos - this.getScrollIncrement());
+        if (s !== pos) {
+            this.scrollTo(s, this.animScroll);
+        }
+    },
+    
+    updateScrollButtons: function () {
+        var pos = this.getScrollPos();
+        this.scrollLeft[pos === 0 ? 'addClass' : 'removeClass']('ux-taskbuttons-scroller-left-disabled');
+        this.scrollRight[pos >= (this.getScrollWidth() - this.getScrollArea()) ? 'addClass' : 'removeClass']('ux-taskbuttons-scroller-right-disabled');
+    }
+});
+Ext.reg('activeAppsPanel', Ext.ux.ActiveAppsPanel);
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/App.js
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/App.js	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/App.js	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,330 @@
+// Declare namespace for the application's modules
+Ext.ns('Ext.app.module');
+
+/**
+ * This is the application's main controller Class.
+ * This Class may be customized via it's object instance found in controller.js
+ * @class Ext.ux.App
+ * @extends Ext.util.Observable
+ */
+Ext.ux.App = Ext.extend(Ext.util.Observable, {
+
+    /* @private */
+    constructor: function (config) {
+    
+        Ext.apply(this, config);
+        
+        // abstract method that shall be implemented by the instance of this app.
+        // This method will typically load the platform (modules, settings, etc.).  
+        // The getPlatform() method shall set this.platformLoaded = true to
+        // signify that the system can be initialized (this is required in order
+        // to handle a possible race condition with Ext.isReady.
+        this.getPlatform();
+        
+        //add events
+        this.addEvents(
+            /**
+             * @event beforecreate
+             * Fires before a module is created.  Return false to disable creation of another module instance.
+             * @param {Ext.ux.App} this
+             */
+            'beforecreate',
+            /**
+             * @event beforeunload
+             * Fires before the window is unloaded (after the browser window beforeunload event).
+             * @param {Ext.ux.App} this
+             */
+            'beforeunload',
+            /**
+             * @event changecount
+             * Fires when the module count changes.
+             * @param {Ext.ux.App} this
+             */
+            'changecount',
+            /**
+             * @event ready
+             * Fires when the app is ready.
+             * @param {Ext.ux.App} this
+             */
+            'ready');
+        
+        Ext.onReady(this.initApp, this);
+        
+        this.onAppReady(this.initAutoRun, this);
+        this.on({
+            beforecreate: this.onBeforeCreate,
+            changecount: this.onChangeCount
+        });
+    },
+
+    /* @private */
+    createModule: function (m) {
+        if (typeof m === 'string') {
+            Ext.ComponentMgr.get(m);
+        } else if (!m.events) {
+
+            if (this.fireEvent('beforecreate', this, m) !== false) {
+                var n = {};
+                Ext.ComponentMgr.create(Ext.apply(n, {
+                    id: this.getModId(m)
+                }, m));
+                this.fireEvent('changecount', this, m, 1);
+            }
+        }
+        return m;
+    },
+
+    /* @private */
+    getModId: function (m) {
+        var i, id, k, n = m.instances;
+        //need to loop through instances array to make sure not reusing an id
+        //this step is needed because a module instance may have been destroyed
+        for (i = 0; i < m.limit; i++) {
+            id = m.id + '_' + i;
+            // does the id exist in the array?
+            if (n.indexOf(id) > -1) {
+                //there is a match
+                continue;
+            }
+            break;
+        }
+        n.push(id);
+        return id;
+    },
+
+    /* @private */
+    onBeforeCreate: function (scope, m) {
+        // check if the number of instances are within the number permitted
+        if (m.instances.length < m.limit) {
+            return true;
+        }
+        return false;
+    },
+
+    onLoad: function (m) {
+        // Point launcher's handler at createModule once loaded
+        var item = Ext.ux.Launch.get(m.id);
+        item.handler = this.createModule.createDelegate(this, [m]);
+    },
+
+    /* @private */
+    onChangeCount: function (scope, m, change) {
+//      Ext.each(launchers, function (item, index, allItems){
+        var n, item = Ext.ux.Launch.get(m.id);
+        n = m.instances;
+        if (n.length >= m.limit) {
+            var k, last, launchers;
+            // if limit has been met, change the handler to show the last instance created
+            k = n[m.limit - 1];
+            last = Ext.getCmp(k);
+            launchers = Ext.ux.Launch.filter('id', m.id, true);
+            item.handler = last.show.createDelegate(last);
+        } else {
+            item.handler = this.createModule.createDelegate(this, [m]);
+        }
+//      });
+    },
+
+    getHandler: function (m) {
+        var handler;
+        if (m.loaded === true) {
+            // Point launcher's handler at createModule if already loaded
+            handler = this.createModule.createDelegate(this, [m]);
+        } else {
+            // At this point the module has not been loaded yet.
+            // Point launcher's handler at requestModule:
+            handler = Ext.ux.RemoteLoader.requestModule.createDelegate(Ext.ux.RemoteLoader, [m, this]);
+        }
+        return handler;
+    },
+
+    getLaunchers: function (val) {
+        return Ext.ux.Launch.filter('type', val);
+    },
+
+    getModule: function (m) {
+        return Ext.ux.ModuleMgr.get(m.id);
+    },
+
+    //abstract method to be overridden if needed
+    getViewConfig: Ext.emptyFn,
+
+    /* @private */
+    initApp: function () {
+        // This method is called from onReady.
+        // Only initialize the platform if it is loaded (the call to getPlatform()
+        // is expected to set platformLoaded to true).
+        if (this.platformLoaded) {
+            this.initPlatform();
+        }
+    },
+
+    /**
+     * @private
+     * Runs when this app is ready
+     */
+    initAutoRun: function () {
+        var m, items = this.getLaunchers('autorun');
+        if (items) {
+            for (var i = 0, len = items.length; i < len; i++) {
+                m = this.getModule(items[i]);
+                // call the module's handler
+                this.getHandler(m).call();
+            }
+        }
+    },
+    
+    /**
+     * Initialize the module's launchers
+     * @param {Object} m the module
+     */
+    initLaunchers: function (m) {
+        if (!m.launchers) {
+            return;
+        }
+        
+        var k = {};
+        var l = m.launchers; 
+
+        for (var i = 0, len = l.length; i < len; i++) {
+            k = {};
+            if (typeof l[i] === "string") {
+                k.type = l[i];
+            } else {
+                k = l[i];
+            }
+            // apply any defaults not already configured
+            l[i] = Ext.applyIf(k, m.launchDefaults);
+
+            // assign id
+            l[i].launchId = k.type + '_' + m.id;
+            l[i].id = m.id;
+
+            // set up the handler
+            l[i].handler = new Ext.ux.Launch({
+                handler: this.getHandler(m),
+                id: m.id
+            });
+
+            l[i].scope = l[i].scope || m;
+        }
+// add to the launch manager
+// TODO: this should be removed and added to the constructor for the handler
+        Ext.ux.Launch.manager.addAll(l);
+    },
+
+    /* @private */
+    initModules: function () {
+        var id, m, ms = this.modules;
+        if (!ms) {
+            return false;
+        }
+
+        // add all modules to the mixed collection manager
+        Ext.ux.ModuleMgr.addAll(ms);
+
+        // loop through each module
+        for (var i = 0, len = ms.length; i < len; i++) {
+            m = ms[i]; // the module
+            
+            // give each module a reference to this app
+            m.app = this;
+            // initialize array to track module instances
+            m.instances = [];
+            // Initialize launchers for the module
+            this.initLaunchers(m);
+        }
+        return true;
+    },
+
+    /* @private */
+    initPlatform: function () {
+
+        if (!Ext.isReady) {
+            return;
+        }
+
+        // Modules array        
+        this.initModules();
+        
+        // generalized view class 
+        this.initView();
+        
+        // Set any styles if defined (background color, wallpaper, fontcolor, etc.)
+        // initStyles() uses this.desktop, so this.desktop must be instanciated already        
+        this.view.initStyles.createDelegate(this.view, [this.styles, this]);
+
+        this.init();
+        
+        Ext.EventManager.on(window, 'beforeunload', this.onBeforeUnload, this);
+        this.isReady = true;
+        this.fireEvent('ready', this);
+    },
+
+    /* @private */
+    initView: function () {
+
+        this.viewConfig = this.viewConfig || this.getViewConfig();
+        Ext.applyIf(this.viewConfig, {
+            app: this,
+            //if logoutConfig not specified by viewConfig set by server then
+            //we need to specify it here
+            logoutConfig: this.logoutConfig
+        });
+
+        //developer should inject any startmenu config alterations here
+        //and apply them to the viewConfig object
+
+        var view = this.viewConfig.gui;
+        if (typeof view === 'string') {
+            this.view = new Ext.ux.View.GUIS[view.toLowerCase()](this.viewConfig);
+        }
+    },
+
+    /**
+     * Methods to call once this.isReady is true
+     * @param {Object} fn function to call
+     * @param {Object} scope scope for the function call
+     */
+    onAppReady: function (fn, scope) {
+        if (!this.isReady) {
+            this.on('ready', fn, scope);
+        }
+        else {
+            fn.call(scope, this);
+        }
+    },
+
+    onBeforeUnload: function (e) {
+        if (this.fireEvent('beforeunload', this) === false) {
+            e.stopEvent();
+        }
+    },
+
+    /**
+     * Prevent the backspace (history -1) shortcut
+     */
+    preventBackspace: function () {
+        var map = new Ext.KeyMap(document, [{
+            key: Ext.EventObject.BACKSPACE,
+            fn: function (key, e) {
+                var t = e.target.tagName;
+                if (t !== "INPUT" && t !== "TEXTAREA") {
+                    e.stopEvent();
+                }
+            }
+        }]);
+    },
+
+    /**
+     * Dynamically remove external JavaScript files from appearing in the head section.
+     */
+    removeAlljs: function () {
+        var f = document.getElementsByTagName('script');
+        //search backwards within nodelist for matching elements to remove
+        for (var i = f.length; i > 0; i--) {
+            //remove element by calling parentNode.removeChild()
+            f[0].parentNode.removeChild(f[0]);
+        }
+    }
+});
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/Appbar.js
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/Appbar.js	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/Appbar.js	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,43 @@
+/**
+ * A specialized Toolbar implementation for the Start Menu
+ * @class Ext.ux.Appbar
+ * @extends Ext.Toolbar
+ */
+Ext.ux.Appbar = Ext.extend(Ext.Toolbar, {
+
+    //prevent a border from being applied
+    border: false,
+    
+    /* @private */
+    constructor: function (config) {
+
+        this.app = Ext.app.controller;         
+
+        Ext.apply(this, config);
+        if (config.launchers) {
+            config.buttons = this.initButtons(config.launchers);
+        }
+        if (!this.items) this.autoEl = {};
+        Ext.ux.Appbar.superclass.constructor.apply(this, arguments);
+    },
+
+    /**
+     * //Initialize any buttons 
+     * @param {String} l launch menu type
+     */
+    initButtons: function (l) {
+        var qItems = this.app.getLaunchers(l);        
+        if(qItems){
+            var btns = [];
+            var b = {};  
+            Ext.each(qItems, function(item, index, allItems){
+                b.iconCls = item.iconCls;
+                b.handler = item.handler;
+                // do not display text
+                btns.push(b);
+            })
+        }
+        return btns;
+    }
+});
+Ext.reg('appbar', Ext.ux.Appbar);
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/Desktop.js
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/Desktop.js	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/Desktop.js	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,112 @@
+Ext.ns('Ext.ux.gui');
+
+/**
+ * <p>This GUI mimics a Windows OS desktop appliction.</p>
+ * @class Ext.ux.gui.Desktop
+ * @extends Ext.ux.View
+ */
+Ext.ux.gui.Desktop = Ext.extend(Ext.ux.View, {
+
+    activeWindow: null,
+
+    initComponent: function () {
+
+        // window manager
+        this.windows = new Ext.WindowGroup();
+        
+        var desktopBody = {
+            region: 'center',
+            id: 'x-desktop',
+            xtype: 'panel',
+            bodyStyle: "background-image:url(eos.jpg) !important",
+            autoEl: {}
+        };
+
+        var taskbar = {
+            xtype: 'taskbar',
+            region: 'south',//if make this north, need to change the origin of menus so they don't go off the page
+            collapsible: true,
+            collapseMode: 'mini',
+            split: true,
+            view: this
+        };
+        
+        Ext.apply(this, {
+            id: 'app-viewport',
+            layout: 'border',
+//          bodyBorder: false
+            defaults: {
+                border: false,
+                cmargins: '0 0 0 0', // only used by border layout
+                margins: '0 0 0 0'
+            },
+            items: [desktopBody, taskbar]
+        });
+        
+        Ext.ux.gui.Desktop.superclass.initComponent.call(this);
+    },
+
+    getManager: function () {
+        return this.windows;
+    },
+
+    getWindow: function (id) {
+        return this.windows.get(id);
+    },
+
+    setTickSize: function (xTickSize, yTickSize) {
+        this.xTickSize = xTickSize;
+        if (arguments.length === 1) {
+            this.yTickSize = xTickSize;
+        } else {
+            this.yTickSize = yTickSize;
+        }
+        this.windows.each(function (win) {
+            win.dd.xTickSize = this.xTickSize;
+            win.dd.yTickSize = this.yTickSize;
+            win.resizer.widthIncrement = this.xTickSize;
+            win.resizer.heightIncrement = this.yTickSize;
+        }, this);
+    },
+
+    cascade: function () {
+        var x, y, xTick, yTick;
+        xTick = Math.max(this.xTickSize, 20);
+        yTick = Math.max(this.yTickSize, 20);
+        x = xTick;
+        y = yTick;
+        this.windows.each(function (win) {
+            if (win.isVisible() && !win.maximized) {
+                win.setPosition(x, y);
+                x += xTick;
+                y += yTick;
+            }
+        }, this);
+    },
+
+    tile: function () {
+        var availWidth, nextY, w, x, y;
+        availWidth = this.getEl().getWidth(true);
+        x = this.xTickSize;
+        y = this.yTickSize;
+        nextY = y;
+        this.windows.each(function (win) {
+            if (win.isVisible() && !win.maximized) {
+                w = win.el.getWidth();
+
+//              Wrap to next row if we are not at the line start and this Window will go off the end
+                if ((x > this.xTickSize) && (x + w > availWidth)) {
+                    x = this.xTickSize;
+                    y = nextY;
+                }
+
+                win.setPosition(x, y);
+                x += w + this.xTickSize;
+                nextY = Math.max(nextY, y + win.el.getHeight() + this.yTickSize);
+            }
+        }, this);
+    }
+    
+});
+
+Ext.ux.View.GUIS['desktop'] = Ext.ux.gui.Desktop;
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/Launch.js
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/Launch.js	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/Launch.js	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,74 @@
+/**
+ * <p>This class is used to manage handlers for buttons, menus, shortcuts, etc.</p>
+ * <p>
+ * Usage:
+ * <pre><code>
+var alert1 = function(){alert(1);};
+var alert2 = function(){alert(2);};
+
+var myHandler = new Ext.ux.Launch({
+	handler: alert1,
+    id: 'testHandler'
+});
+
+Ext.onReady(function(){
+    Ext.get("elementId").on("click", myHandler);
+});
+
+//then later use function that we added to the constructor:
+var test = Ext.ux.Launch.get('testHandler');
+test.handler = alert2;
+</code></pre></p>
+ * @class Ext.ux.Launch
+ * @author MJ (<a href="http://extjs.com/forum/member.php?u=6834";>mjlecomte</a>) with significant help from Nige (aka Animal)
+ * @license <a href="http://www.gnu.org/licenses/lgpl.html";>LGPL 3.0</a>
+ * @version 0.01 - Nov 28, 2008 
+ * @singleton
+ */
+Ext.ux.Launch = (function(){
+    //  Only the object *returned* from this function can access this.
+    var LaunchMgr = new Ext.util.MixedCollection(false, function(h){
+        return h.launchId || h.id;
+    });
+    
+    /**
+     * constructor
+     * @private
+     */
+    var result = Ext.extend(Object, {
+        constructor: function(config){
+            Ext.apply(this, config);
+            if (this.launchId || this.id) {
+                LaunchMgr.add(this);
+            }
+        },
+        call: function(){
+            this.handler.apply(this.scope || arguments[0], Array.prototype.slice.call(arguments, 1));
+        },
+        /**
+         * apply is part of the Function interface.
+         * If our new class is "being" a Function, we need to be able it to be
+         * used as a Function in every way anyone might use one. So we must
+         * implement the apply method.
+         * https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Function#Methods
+         * @param {Object} scope
+         * @param {Object} a
+         */
+        apply: function(scope, a){
+            this.handler.apply(this.scope || a[0], Array.prototype.slice.call(a, 1));
+        }
+    });
+
+    // additional methods attached to constructor object for ease of access later
+    result.get = function(id){
+        return LaunchMgr.get(id);
+    };
+
+    result.filter = function(by, val){
+        return LaunchMgr.filter(by, val).items;
+    };
+
+    result.manager = LaunchMgr;
+    
+    return result;
+})();
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/Module.js
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/Module.js	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/Module.js	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,260 @@
+/**
+ * Mixed Collection implementation for module management.
+ * TODO: implement an onAvailable method similar to Component Manager 
+ * @class Ext.ux.ModuleMgr
+ */
+Ext.ux.ModuleMgr = Ext.apply(new Ext.util.MixedCollection(), {
+    register : function () {
+        for (var i = 0, s; s = arguments[i]; i++) {
+            this.add(s);
+        }
+    },
+    unregister : function () {
+        for (var i = 0, s; s = arguments[i]; i++) {
+            this.remove(this.lookup(s));
+        }
+    },
+    lookup : function (id) {
+        return typeof id === "object" ? id : this.get(id);
+    },
+    // getKey implementation for MixedCollection
+    getKey : function (o) {
+        return o.moduleId || o.id;
+    }
+});
+
+/**
+ * Custom implemenation of Ext.Window to contain Modules.  Modules should inherit from this class.
+ * @class Ext.ux.Module
+ * @extends Ext.Window
+ */
+Ext.ux.Module = Ext.extend(Ext.Window, {
+    /**
+     * @cfg {Boolean} closable
+     * <p>True to display the 'close' tool button and allow the user to close the window, false to
+     * hide the button and disallow closing the window (default to true).</p>
+     * <p>By default, when close is requested by either clicking the close button in the header
+     * or pressing ESC when the Window has focus, the {@link #close} method will be called. This
+     * will <i>destroy</i> the Window and its content meaning that it may not be reused.</p>
+     * <p>To make closing a Window <i>hide</i> the Window so that it may be reused, set
+     * {@link #closeAction} to 'hide'.
+     */
+    closable : true,
+
+    /**
+     * @cfg {String} closeAction
+     * The action to take when the close button is clicked.  The default action is 'close' which will actually remove
+     * the window from the DOM and destroy it.  The other valid option is 'hide' which will simply hide the window
+     * by setting visibility to hidden and applying negative offsets, keeping the window available to be redisplayed
+     * via the {@link #show} method.
+     */
+    closeAction: 'close',
+
+    /**
+     * @cfg {Boolean} constrain
+     * True to constrain the window to the viewport, false to allow it to fall outside of
+     * the viewport (defaults to true).  Optionally the header only can be constrained using
+     * {@link #constrainHeader}.
+     */
+    constrain: true,
+
+    /**
+     * @cfg {Boolean} constrainHeader
+     * True to constrain the window header to the viewport, allowing the window body to fall
+     * outside of the viewport, false to allow the header to fall outside the viewport (defaults
+     * to true).  Optionally the entire window can be constrained using {@link #constrain}.
+     */
+    constrainHeader: true,
+    /**
+     * @cfg {Ext.WindowGroup} manager
+     * A reference to the WindowGroup that should manage this window (defaults to {@link Ext.WindowMgr}).
+     * Specify a reference to an instance unless you want a new manager for each instance:
+     * <pre><code>
+     * var group2 = new Ext.window.WindowGroup({
+     *     //override any defaults or add to base class instance
+     *     groupId: 2, //groupId not implemented at this time
+     *     zseed: 2000 //change the zseed (default = 9000)
+     * });
+     * var lw1 = new Ext.app.window.LayoutWindow({
+     *     manager: group2//specify the WindowGroup manager (instead of using default manager)
+     * });
+     * var lw2 = new Ext.app.window.LayoutWindow({
+     *     //will use default manager
+     * });
+     * </pre></code>
+     */
+
+    /**
+     * @cfg {Function} handleHelp
+     * Handler function when the help tool is clicked (defaults to {@link Ext#emptyFn}). 
+     * @param {Object} event The click event.
+     * @param {Object} toolEl The tool Element.
+     * @param {Object} panel The host Panel.
+     */
+    handleHelp: Ext.emptyFn,
+
+    /**
+     * @cfg {Boolean} help
+     * True to display tools for help.  Defaults to true.
+     */
+    help: true,
+
+    /**
+     * @cfg {Boolean} loaded
+     * Whether or not the module will be loaded when this code is applied
+     */
+    loaded: false,
+
+    /**
+     * @cfg {Boolean} maximizable
+     * True to display the 'maximize' tool button and allow the user to maximize the window, false to hide the button
+     * and disallow maximizing the window (defaults to true).  Note that when a window is maximized, the tool button
+     * will automatically change to a 'restore' button with the appropriate behavior already built-in that will
+     * restore the window to its previous size.
+     */
+    maximizable: true,
+
+    /**
+     * @cfg {Boolean} minimizable
+     * True to display the 'minimize' tool button and allow the user to minimize the window, false to hide the button
+     * and disallow minimizing the window (defaults to true).  Note that this button provides no implementation --
+     * the behavior of minimizing a window is implementation-specific, so the minimize event must be handled and a
+     * custom minimize behavior implemented for this option to be useful.
+     */
+    minimizable: true,
+
+    /**
+     * @cfg {Number} minHeight
+     * The minimum height in pixels allowed for this window (defaults to 100).  Only applies when resizable = true.
+     */
+
+    /**
+     * @cfg {Number} minWidth
+     * The minimum width in pixels allowed for this window (defaults to 200).  Only applies when resizable = true.
+     */
+
+    /**
+     * @cfg {Function} onEsc
+     * Allows override of the built-in processing for the escape key. Default action
+     * is to close the Window (performing whatever action is specified in {@link #closeAction}.
+     * To prevent the Window closing when the escape key is pressed, specify this as
+     * Ext.emptyFn (See {@link Ext#emptyFn}).
+     */
+    onEsc: Ext.emptyFn,
+
+    /**
+     * @cfg {String} textHelp
+     * Qtip text to display for help tool (defaults to 'Get help').  Only applicable if help = true. 
+     */
+    textHelp: 'Get help',
+
+    constructor: function (config) {
+
+        Ext.apply(this, config);
+        //this.renderTo = Ext.get('x-desktop');
+        this.renderTo = Ext.getCmp('x-desktop').getEl();
+        
+        this.manager = this.app.view.getManager();
+
+        this.cmenu = new Ext.menu.Menu({
+            items: [
+
+            ]
+        });
+
+        Ext.ux.Module.superclass.constructor.call(this);
+    },
+
+    /* @private */
+    initComponent : function () {
+        Ext.ux.Module.superclass.initComponent.apply(this, arguments);
+
+        if (this.help) {
+            this.tools = [{
+                id: 'help',
+                handler: this.handleHelp,
+                qtip: this.textHelp,
+                scope: this
+            }];
+        }
+
+        this.on({
+            scope: this,
+            'activate':   this.markActive, //TODO: why call same method twice
+            'beforeshow': this.markActive, //it ends up getting called for both methods
+            'deactivate': this.markInactive,
+            'minimize':   this.minimizeWin,
+            'close':      this.removeWin
+        });
+    },
+
+    /* @private */
+    afterRender : function () {
+        Ext.ux.Module.superclass.afterRender.call(this);
+//////////////////////////=================================================
+
+        this.xTickSize = this.yTickSize = 1;
+        this.dd.xTickSize = this.xTickSize;
+        this.dd.yTickSize = this.yTickSize;
+        this.resizer.widthIncrement = this.xTickSize;
+        this.resizer.heightIncrement = this.yTickSize;
+        
+//////////////////////////=================================================        
+
+        //add the module to the taskbar as a button:
+        this.addTaskButton();
+        this.show();
+    },
+
+    //add the module to the taskbar as a button:
+    addTaskButton: function () {
+        this.taskButton = this.app.view.taskbar.addTaskButton(this);
+        this.animateTarget = this.taskButton.el;
+    },
+
+    /* @private */
+    onDestroy: function () {
+        var id = this.id, m, a, i;
+        
+        //TODO: check for any context menus and destroy them
+        Ext.ux.Module.superclass.onDestroy.call(this);
+        m = Ext.ux.ModuleMgr.filter('xtype', this.xtype).items[0];
+
+        // update the modules instances:
+        a = m.instances;
+        i = a.indexOf(id);
+        delete a[i];//delete the element corresponding to this.id
+        a.sort();//moves undefined elements to end of array
+        a.pop(); //remove the last element from the array
+        this.app.fireEvent('changecount', this.app, m, -1);
+    },
+
+    removeWin: function () {
+        this.taskButton.destroy();
+    },
+
+    markActive: function (win) {
+        this.app.fireEvent('activate', this);
+        
+        if (this.activeWindow && this.activeWindow !== win) {
+            this.markInactive(this.activeWindow);
+        }
+        this.app.view.taskbar.setActiveButton(win.taskButton);
+        this.activeWindow = win;
+        Ext.fly(win.taskButton.el).addClass('active-win');
+        win.minimized = false;
+    },
+
+    markInactive: function (win) {
+        if (win === this.activeWindow) {
+            this.activeWindow = null;
+            Ext.fly(win.taskButton.el).removeClass('active-win');
+        }
+    },
+
+    minimizeWin: function (win) {
+        win.minimized = true;
+        win.hide();
+    }
+});
+Ext.reg('module', Ext.ux.Module);
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/RemoteLoader.js
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/RemoteLoader.js	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/RemoteLoader.js	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,173 @@
+Ext.namespace('Ext.ux');
+
+/**
+ * A specialized implemenations of Ext.data.Connection to load remote components dynamically.
+ * Remotely loaded components should have an id so that Ext.ComponentMgr's onAvailable
+ * function can be utilized to manipulate the components as they are added.
+ * @class Ext.ux.RemoteLoader
+ * @extends Ext.data.Connection
+ * @singleton
+ */
+Ext.ux.RemoteLoader = function () {
+    var cm = Ext.ComponentMgr, // TODO: not currently used
+    conn = new Ext.data.Connection(),
+    method = 'POST';
+    return {
+        /*
+         * default root (read only) 
+         */
+        root: 'platform',
+        /*
+         * Dynamically load components from a server resource
+         * config options include anything available in @link Ext.data.Connection#request
+         */
+        load : function (config) {
+            this.root = config.root || this.root;
+            // append the config.callback to the default parameters
+            var cb = config.callback || this.onLoad.createDelegate(this, [config.callback], true);
+            Ext.apply(config, {
+                method: method,
+                callback: cb,
+                scope: this
+            });	
+            if (config.container) {
+                Ext.apply(config.params, {
+                    container: config.container
+                });
+            }
+            // submit ajax request to server
+            // save id of the server transaction in case we want to cancel the request
+            this.transId = conn.request(config);
+        },
+        
+        /* @private */
+        onLoad : function (opts, success, response, ct) {			
+            try {
+                // use Ext.util.JSON.decode to decode the responseText
+                var o = Ext.decode(response.responseText);
+            }
+            catch (e) {
+                this.onFailure(opts, success, response, ct);
+                return;
+            }
+            
+            if (o.platform) {
+                this.handlePlatform(o);
+                return;
+
+            } else {
+                this.onFailure();
+            }
+        },
+
+        /* @private */
+        onFailure: function (opts, success, response, ct) {
+            Ext.Msg.alert('Load failure.');
+        },
+
+        /* @private */
+        handlePlatform: function (o) {
+            // TODO: refactor to use events so can more easily
+            // do things like notification messages, etc.
+            Ext.app.controller.platformLoaded = o.success;
+    
+            if (true !== o.success) {
+                this.onFailure();
+            } else {
+                //Apply the platform configs to the platform
+                Ext.apply(Ext.app.controller, o[this.root]);
+                //Ext.app.controller.initPlatform();
+            }
+        },
+
+        /**
+         * Requests the module's javascript code and loads it according to the
+         * configured onFileLoad method ('eval' or 'head').
+         * @param {Object} m
+         * @param {Object} cb
+         * @param {Object} scope
+         */
+        requestModule: function (m, scope) {
+            var cb, url = m.loader.url;
+    
+            cb = this.onModuleLoad.createDelegate(scope, [m, this], true);
+            if (this.onFileLoad === 'eval') {
+                this.loadLocalFile(url, m, cb, scope);
+            } else {
+                this.loadRemoteFile(url, m, cb, scope, 'js');
+            }
+        },
+            
+        /**
+         * Use this method to load a file from your own site (same domain).
+         * This method usese AJAX ( responseText ) to retrieve JSON formated data
+         * or Javascript off your own site instead of dynamic <script> attachment.
+         * After retrieving the object via ajax, it is pass through the eval
+         * command (which is basically just the javascript compiler). After this
+         * is done the functions and variables will be available to the other
+         * functions in your web page. 
+         * @param {Object} filename
+         * @param {Object} filetype
+         * @param {Object} cb
+         */
+        loadLocalFile: function (url, m, cb, scope) {
+            this.load({
+                url:    url,
+                callback: cb,
+                root:   null,
+                params: m.loader.params,
+                scope:  scope
+            });
+        },
+    
+        /**
+         * This method makes it possible to load a remote file from another domain.
+         * Importing cross-domain javascript in this manner with caution as you are
+         * giving the site you are connecting to, total, perfect control over your
+         * web page. Use caution when deciding to cross-connect domains in this fashion. 
+         * @param {Object} filename name (and path) of resource to include)
+         * @param {Object} filetype type of file to load ('js', 'css')
+         * @param {Object} cb callback function
+         */
+        loadRemoteFile: function (filename, m, cb, scope, filetype) {
+            var fileref;
+            if (filetype === "js") { //if filename is a external JavaScript file
+                //create a new 'script' document element
+                fileref = document.createElement('script');
+                //assign the proper attributes
+                fileref.setAttribute("type", "text/javascript");
+                fileref.setAttribute("src", filename);
+            }
+            if (filetype === "css") { //if filename is an external CSS file
+                fileref = document.createElement("link");
+                fileref.setAttribute("rel", "stylesheet");
+                fileref.setAttribute("type", "text/css");
+                fileref.setAttribute("href", filename);
+            }
+            if (typeof fileref !== "undefined") {
+                //call the callback when it's loaded
+                //fileref.onload = cb;
+                fileref.onload = cb.createDelegate(this, [m, this], true);
+            }
+            //get a reference to the head element and append the new element to the very end of the HEAD section
+            document.getElementsByTagName("head")[0].appendChild(fileref);
+        },
+    
+        /* @private */
+        onModuleLoad: function (opts, success, response, m, scope) {
+            if (this.onFileLoad === 'eval') {
+                //eval() the response (safe for same domain ajax requests?)
+                try {
+                    eval(response.responseText);
+                }
+                catch (e) {
+                    return;
+                }
+            }
+            // module is now loaded
+            m.loaded = true;
+            this.onLoad(m);
+            this.createModule(m);
+        }
+    };
+}();
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/StartMenu.js
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/StartMenu.js	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/StartMenu.js	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,443 @@
+/**
+ * Creates a new StartMenu
+ * @class Ext.ux.StartMenu
+ * @extends Ext.menu.Menu
+ */
+Ext.ux.StartMenu = Ext.extend(Ext.menu.Menu, {
+
+    /* @private */
+    constructor: function (config) {
+        Ext.apply(this, config);
+    
+        // Start Menu
+        var defaults = {
+            iconCls: 'user',
+            id: 'TaskBarStartMenu',
+            height: 300,
+            shadow: true,
+            title: 'Start Menu',
+            width: 300
+        };
+        Ext.applyIf(config, defaults);
+
+        // config for start menu
+        this.startConfig = this.startConfig || this.getStartConfig();
+        this.startItemsConfig = this.startItemsConfig || this.getStartItemsConfig();
+        Ext.apply(config, this.startConfig, this.startItemsConfig);
+        Ext.ux.StartMenu.superclass.constructor.call(this, config);
+        
+        var tools = this.toolItems;
+        this.toolItems = new Ext.util.MixedCollection();
+        if (tools) {
+            this.addTool.apply(this, tools);
+        }
+
+        // Start Menu's logout button
+        if (this.logoutConfig) {
+            this.addTool(this.logoutConfig);
+        }
+    },
+
+    /* @private */
+    render: function () {
+        if (this.el) {
+            return;
+        }
+        var el, header, headerText, tl, tr, tc, ml, mc, bwrap, bc, br, bl, ul, toolsUl, ulListeners;
+        
+        this.el = new Ext.Layer({
+            cls: "x-menu ux-start-menu", // this might affect item click
+            shadow: this.shadow,
+            constrain: false,
+            parentEl: this.parentEl || document.body,
+            zindex: 15000
+        });
+
+        el = this.el;
+
+        header = el.createChild({
+            tag: "div",
+            cls: "x-window-header x-unselectable x-panel-icon " + this.iconCls
+        });
+        this.header = header;
+        headerText = header.createChild({
+            tag: "span",
+            cls: "x-window-header-text"
+        });
+        tl = header.wrap({
+            cls: "ux-start-menu-tl"
+        });
+        tr = header.wrap({
+            cls: "ux-start-menu-tr"
+        });
+        tc = header.wrap({
+            cls: "ux-start-menu-tc"
+        });
+        
+        this.menuBWrap = el.createChild({
+            tag: "div",
+            cls: "x-window-body x-border-layout-ct ux-start-menu-body"
+        });
+        ml = this.menuBWrap.wrap({
+            cls: "ux-start-menu-ml"
+        });
+        mc = this.menuBWrap.wrap({
+            cls: "x-window-mc ux-start-menu-bwrap"
+        });
+        
+        this.menuPanel = this.menuBWrap.createChild({
+            tag: "div",
+            cls: "x-panel x-border-panel ux-start-menu-apps-panel"
+        });
+        this.toolsPanel = this.menuBWrap.createChild({
+            tag: "div",
+            cls: "x-panel x-border-panel ux-start-menu-tools-panel"
+        });
+        
+        bwrap = ml.wrap({cls: "x-window-bwrap"});
+        bc = bwrap.createChild({
+            tag: "div",
+            cls: "ux-start-menu-bc"
+        });
+        bl = bc.wrap({
+            cls: "ux-start-menu-bl x-panel-nofooter"
+        });
+        br = bc.wrap({
+            cls: "ux-start-menu-br"
+        });
+        
+        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"
+        });
+
+        ul = this.menuPanel.createChild({
+            tag: "ul",
+            cls: "x-menu-list"
+        });
+
+        toolsUl = this.toolsPanel.createChild({
+            tag: "ul",
+            cls: "x-menu-list"
+        });
+        
+        ulListeners = {
+            "click": {
+                fn: this.onClick,
+                scope: this
+            },
+            "mouseover": {
+                fn: this.onMouseOver,
+                scope: this
+            },
+            "mouseout": {
+                fn: this.onMouseOut,
+                scope: this
+            }
+        };
+        
+        ul.on(ulListeners);
+        
+        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.doAutoSize();//this.autoWidth();
+
+        toolsUl.on(ulListeners);
+        
+        this.toolItems.each(
+            function (item) {
+                var li = document.createElement("li");
+                li.className = "x-menu-list-item";
+                toolsUl.dom.appendChild(li);
+                item.render(li, this);
+            }, this);
+            
+        this.toolsUl = toolsUl;
+        this.doAutoSize();//this.autoWidth();
+             
+        this.menuBWrap.setStyle('position', 'relative');  
+        this.menuBWrap.setHeight(this.height);
+        
+        this.menuPanel.setStyle({
+            padding: '2px',
+            position: 'absolute',
+            overflow: 'auto'
+        });
+        
+        this.toolsPanel.setStyle({
+            padding: '2px 4px 2px 2px',
+            position: 'absolute',
+            overflow: 'auto'
+        });
+        
+        this.setTitle(this.title);
+    },
+    
+    /* @private */
+    findTargetItem: function (e) {
+        var t = e.getTarget(".x-menu-list-item", this.ul,  true);
+        if (t && t.menuItemId) {
+            if (this.items.get(t.menuItemId)) {
+                return this.items.get(t.menuItemId);
+            } else {
+                return this.toolItems.get(t.menuItemId);
+            }
+        }
+    },
+
+    /**
+     * Displays this menu relative to another element
+     * @param {Mixed} 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.ux.StartMenu} parentMenu (optional) This menu's parent menu, if applicable (defaults to undefined)
+     */
+    show: function (el, pos, parentMenu) {
+        var tPanelWidth, box;
+        this.parentMenu = parentMenu;
+        if (!this.el) {
+            this.render();
+        }
+
+        this.fireEvent("beforeshow", this);
+        this.showAt(this.el.getAlignToXY(el, pos || this.defaultAlign), parentMenu, false);
+        
+        tPanelWidth = 100;      
+        box = this.menuBWrap.getBox();
+        this.menuPanel.setWidth(box.width - tPanelWidth);
+        this.menuPanel.setHeight(box.height);
+        
+        this.toolsPanel.setWidth(tPanelWidth);
+        this.toolsPanel.setX(box.x + box.width - tPanelWidth);
+        this.toolsPanel.setHeight(box.height);
+    },
+    
+    addTool: function () {
+        var a = arguments, l = a.length, item, el;
+        for (var i = 0; i < l; i++) {
+            el = a[i];
+            if (el.render) { // some kind of Item
+                item = this.addToolItem(el);
+            } else if (typeof el === "string") { // string
+                if (el === "separator" || el === "-") {
+                    item = this.addToolSeparator();
+                } 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.addToolMenuItem(el);
+            }
+        }
+        return item;
+    },
+    
+    /**
+     * Adds a separator bar to the Tools
+     * @return {Ext.menu.Item} The menu item that was added
+     */
+    addToolSeparator: function () {
+        return this.addToolItem(new Ext.menu.Separator({itemCls: 'ux-toolmenu-sep'}));
+    },
+
+    addToolItem: function (item) {
+        this.toolItems.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;
+    },
+
+    addToolMenuItem: function (config) {
+        if (!(config instanceof Ext.menu.Item)) {
+            if (typeof config.checked === "boolean") { // must be check menu item config?
+                config = new Ext.menu.CheckItem(config);
+            } else {
+                config = new Ext.menu.Item(config);
+            }
+        }
+        return this.addToolItem(config);
+    },
+
+    setTitle: function (title, iconCls) {
+        this.title = title;
+        this.header.child('span').update(title);
+        return this;
+    },
+
+    //abstract method to be overridden if needed
+    getStartConfig: Ext.emptyFn,
+
+    /**
+     * Returns the Start Menu items and toolItems configs
+     * @param {array} ms An array of the modules.
+     */
+	getStartItemsConfig: function () {
+		var ms = this.startItems;
+		var sortFn = this.startMenuSortFn;
+		/**
+		 * Creates nested arrays that represent the Start Menu.
+		 * 
+		 * @param {array} pMenu The Start Menu
+		 * @param {array} texts The menu texts
+		 * @param {object} launcher The launcher config
+		 */
+		var simplify = function (pMenu, paths, launcher) {
+			var newMenu;
+			var foundMenu;
+			
+			for (var i = 1, len = paths.length; i < len; i++) { // ignore the root (StartMenu, ToolMenu)
+				foundMenu = findMenu(pMenu.items, paths[i]); // text exists?
+				
+				if (!foundMenu) {
+					newMenu = {
+						iconCls: 'ux-start-menu-submenu',
+						handler: function () {
+                            return false;
+                        },
+						menu: {
+                            items: []
+                        },
+						text: paths[i]
+					};
+					pMenu.items.push(newMenu);
+					pMenu = newMenu.menu;
+				} else {
+					pMenu = foundMenu;
+				}
+			}
+			
+			pMenu.items.push(launcher);
+		};
+		
+		/**
+		 * Returns the menu if found.
+		 * 
+		 * @param {array} pMenu The parent menu to search
+		 * @param {string} text
+		 */
+        var findMenu = function (pMenu, text) {
+            for (var j = 0, jlen = pMenu.length; j < jlen; j++) {
+                if (pMenu[j].text === text) {
+                    return pMenu[j].menu; // found the menu, return it
+                }
+            }
+            return null;
+        };
+        
+        /**
+         * @param {array} menu The nested array to sort
+         */
+        var sort = function (menu) {
+            var items = menu.items;
+            for (var i = 0, ilen = items.length; i < ilen; i++) {
+                if (items[i].menu) {
+                    sort(items[i].menu); // use recursion to iterate nested arrays
+                }
+                bubbleSort(items, 0, items.length); // sort the menu items
+            }
+        }
+
+        /**
+        * @param {array} items Menu items to sort
+        * @param {integer} start The start index
+        * @param {integer} stop The stop index
+        */
+		var bubbleSort = function (items, start, stop) {
+			for (var i = stop - 1; i >= start;  i--) {
+				for (var j = start; j <= i; j++) {
+					if (items[j + 1] && items[j]) {
+						if (sortFn(items[j], items[j + 1])) {
+							var tempValue = items[j];
+							items[j] = items[j + 1];
+							items[j + 1] = tempValue;
+						}
+
+					}
+				}
+			}
+			return items;
+		};
+
+        if (ms) {
+            var paths, k = 0, root, sm, smi;
+            // initial config for the Start Menu
+            sm = { menu: { items: [] } }; // Start Menu
+            // shorthand for Start Menu items
+            smi = sm.menu.items;
+
+            // add the two primary menus to the Start Menu
+            smi.push({text: 'StartMenu', menu: { items: [] } });
+            smi.push({text: 'ToolMenu', menu: { items: [] } });
+            
+            // loop through 
+            for (var i = 0, iLen = ms.length; i < iLen; i++) { // loop through modules
+                if (ms[i].path) {	
+                    paths = ms[i].path.split('/');
+                    root = paths[0];
+                    
+                    if (paths.length > 0) {
+                        if (root === 'tool') {
+                            k = 1;
+                        }
+                        simplify(smi[k].menu, paths, ms[i]);
+                        sort(smi[k].menu);
+                    }
+                }
+            }
+            
+            return {
+                items:     smi[0].menu.items,
+                toolItems: smi[1].menu.items
+            };
+        }
+        return null;
+	},    
+
+     /**
+      * Function that handles sorting of the Start Menu
+      * Return true to swap a and b
+      */
+    startMenuSortFn: function (a, b) {
+        // Sort in ASC alphabetical order
+        // if( b.text < a.text ){
+        //      return true;
+        // }
+        
+        // Sort in ASC alphabetical order with menus at the bottom
+        // if( (b.text < a.text) && !b.menu ){
+        //      return true;
+        // }
+        
+        // Sort in ASC alphabetical order with menus at the top
+        if (((b.menu && a.menu) && (b.text < a.text)) || (b.menu && !a.menu) || ((b.text < a.text) && !a.menu)) {
+            return true;
+        }
+        
+        return false;
+    }
+});
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/TaskBar.js
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/TaskBar.js	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/TaskBar.js	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,171 @@
+/**
+ * @class Ext.ux.TaskBar
+ * @extends Ext.Panel
+ */
+Ext.ux.TaskBar = Ext.extend(Ext.Panel, {
+
+    collapsible: true,
+    
+    // start button width
+    sbWidth: 93,
+    //var width = Ext.get('ux-startbutton').getWidth()+10;
+    
+    // system tray width
+    stWidth: 60,
+    
+    // quick start width
+    qsWidth: 94,
+    qsWidthMin: 60,
+    
+    //    style: 'z-index:23000',
+    
+    constructor: function (config) {
+        Ext.apply(this, config);
+        
+        this.app = Ext.app.controller;
+        
+        // Quick Start Applications (TaskBarQuickStart)        
+        var tbQuickStart = new Ext.ux.Appbar({
+            launchers: 'quick',
+            id: 'ux-quickstart-panel',
+            minWidth: this.qsWidthMin,
+            region: 'west',
+            split: true,
+            width: this.qsWidth
+        });
+        
+        // System Tray Panel        
+        var tbTray = new Ext.ux.Appbar({
+            launchers: 'tray',
+            id: 'ux-systemtray-panel',
+            minWidth: this.stWidth,
+            region: 'east',
+            split: true,
+            width: this.stWidth
+        });
+        
+        // Task Bar Active Application Buttons        
+        var tbPanel = {
+            xtype: 'activeAppsPanel', // new Ext.ux.TaskButtonsPanel
+            autoEl: {},//create empty div
+            id: 'ux-taskbuttons-panel',
+            border: false,
+            region: 'center'
+        };
+        
+        // Task Bar Applications        
+        var tbApps = {
+            xtype: 'container',
+            autoEl: {},//create empty div
+            id: 'ux-taskbar-panel-wrap',
+            border: false,
+            region: 'center',
+            layout: 'border',
+            items: [tbQuickStart, tbPanel]
+        };
+        
+        // ------------------
+        
+        // Start Button Panel
+        var startItems = this.app.getLaunchers('start');
+        
+        // Start Menu
+        this.startMenu = new Ext.ux.StartMenu({
+            startConfig: this.view.startConfig,
+            logoutConfig: this.view.logoutConfig,
+            startItems: startItems
+        });
+        
+        this.startBtn = new Ext.Button({
+            text: 'Start',
+            id: 'ux-startbutton',
+            iconCls: 'start',
+            menu: this.startMenu,
+            menuAlign: 'bl-tl',
+            clickEvent: 'mousedown',
+            template: 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 unselectable="on"><button class="x-btn-text" type="{1}" style="height:30px;">{0}</button></em></td>', '<td class="x-btn-right"><i>&#160;</i></td>', "</tr></tbody></table>")
+        });
+        
+        var tbStart = {
+            xtype: 'container',
+            autoEl: {},//create empty div
+            id: 'ux-taskbar-start',
+            items: [this.startBtn],
+            border: false,
+            minWidth: this.sbWidth,
+            region: 'west',
+            split: false,
+            width: this.sbWidth
+        };
+        
+        // ------------------
+        
+        // Assemble the parts into the taskbar container
+        // Combined Taskbar
+        var taskbar = {
+            //xtype: 'panel',
+            id: this.id || 'ux-taskbar',
+            height: 90,
+            collapsible: true,
+            collapseMode: 'mini',
+            layout: 'border'
+        };
+        this.view.taskbar = this;
+        
+        Ext.apply(this, taskbar);
+        
+        this.items = [tbStart, tbApps, tbTray];
+        
+        Ext.ux.TaskBar.superclass.constructor.call(this, config);
+    },
+    
+    initComponent: function () {
+    
+        Ext.ux.TaskBar.superclass.initComponent.apply(this, arguments);
+        
+        this.on({
+            beforecollapse: {
+                fn: function () {
+                    var el = Ext.getCmp('ux-taskbar').el;
+                    el.applyStyles('z-index:23230');
+                },
+                scope: this
+            },
+            expand: {
+                fn: function () {
+                    var el = Ext.getCmp('ux-taskbar').el;
+                    el.applyStyles('z-index:23230');
+                },
+                scope: this
+            }
+        });
+        
+        this.app.on({
+            activate: this.markActive
+        });
+    },
+    
+    markActive: function () {
+//        console.warn('Wooooohoooooo...................markActive');
+//        console.info(arguments);
+    },
+    
+    addTaskButton: function (win) {
+        //        this.tbPanel=Ext.getCmp('ux-taskbuttons-panel');
+        //        return this.tbPanel.addButton(win, 'ux-taskbuttons-panel');
+        var btn = new Ext.ux.TaskBar.TaskButton(win);
+        this.activeAppsPanel = Ext.getCmp('ux-taskbuttons-panel');
+        this.activeAppsPanel.addButton(btn);
+        this.activeAppsPanel.doLayout();
+        return btn;
+    },
+    
+    removeTaskButton: function (btn) {
+        this.activeAppsPanel.removeButton(btn);
+    },
+    
+    setActiveButton: function (btn) {
+        this.activeAppsPanel.setActiveButton(btn);
+    }
+});
+Ext.reg('taskbar', Ext.ux.TaskBar);
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/TaskButton.js
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/TaskButton.js	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/TaskButton.js	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,82 @@
+/**
+ * @class Ext.ux.TaskBar.TaskButton
+ * @extends Ext.Button
+ */
+Ext.ux.TaskBar.TaskButton = Ext.extend(Ext.Button, {
+    
+    constructor: function (win) {
+        this.win = win;
+        Ext.ux.TaskBar.TaskButton.superclass.constructor.call(this, {
+            iconCls: win.iconCls,
+            id: win.id + '_TaskBarTaskButton',
+            text: Ext.util.Format.ellipsis(win.title, 12),
+            handler : function () {
+                if (win.minimized || win.hidden) {
+                    win.show();
+                } else if (win === win.manager.getActive()) {
+                    win.minimize();
+                } else {
+                    win.toFront();
+                }
+            },
+            clickEvent: 'mousedown'
+        });
+    },
+
+    onRender: function (ct, position) {
+        Ext.ux.TaskBar.TaskButton.superclass.onRender.apply(this, arguments);
+
+        this.cmenu = new Ext.menu.Menu({
+            items: [{
+                text: 'Restore',
+                handler: function () {
+                    if (!this.win.isVisible()) {
+                        this.win.show();
+                    } else {
+                        this.win.restore();
+                    }
+                },
+                scope: this
+            }, {
+                text: 'Minimize',
+                handler: this.win.minimize,
+                scope: this.win
+            }, {
+                text: 'Maximize',
+                handler: this.win.maximize,
+                scope: this.win
+            }, '-', {
+                text: 'Close',
+                handler: this.closeWin.createDelegate(this, this.win, true),
+                scope: this.win
+            }]
+        });
+
+        this.cmenu.on('beforeshow', function () {
+            var w, items = this.cmenu.items.items;
+            w = this.win;
+            items[0].setDisabled(w.maximized !== true && w.hidden !== true);
+            items[1].setDisabled(w.minimized === true);
+            items[2].setDisabled(w.maximized === true || w.hidden === true);
+        }, this);
+
+        this.el.on('contextmenu', function (e) {
+            e.stopEvent();
+            if (!this.cmenu.el) {
+                this.cmenu.render();
+            }
+            var xy = e.getXY();
+            xy[1] -= this.cmenu.el.getHeight();
+            this.cmenu.showAt(xy);
+        }, this);
+    },
+    
+    closeWin : function (cMenu, e, win) {
+        if (!win.isVisible()) {
+            win.show();
+        } else {
+            win.restore();
+        }
+        win.close();
+    }
+});
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/View.js
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/View.js	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/View.js	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,316 @@
+/**
+ * <p>The Ext.ux.View Class provides the basic foundation for all other view classes.
+ * This class provides the base logic required for a View to function as a GUI.
+ * This class is intended to be extended and should generally not need to be
+ * created directly via the new keyword.</p> 
+ * @class Ext.ux.View
+ * @extends Ext.Viewport
+ */
+Ext.ux.View = Ext.extend(Ext.Viewport, {
+//Ext.ux.View = Ext.extend(Ext.Container, {
+    monitorResize: true,
+
+    /* @private */
+    constructor: function (config) {
+        Ext.apply(this, config);
+        Ext.ux.View.superclass.constructor.call(this);
+    },
+
+    // private
+    initComponent : function () {
+
+        Ext.ux.View.superclass.initComponent.apply(this, arguments);
+
+        this.cmenu = new Ext.menu.Menu();
+
+/*
+        // manipulate the context menu:
+        this.cmenu.on('beforeshow', function () {
+            var items = this.cmenu.items.items;
+            var w = this.win;
+            items[0].setDisabled(w.maximized !== true && w.hidden !== true);
+            items[1].setDisabled(w.minimized === true);
+            items[2].setDisabled(w.maximized === true || w.hidden === true);
+        }, this);
+*/
+//TODO:
+        // Add a bunch of items at once using different methods.
+        // Only the last item added will be returned.
+        this.cmenu.add(
+            'Some Item', // new TextItem
+            '-'             // new separator
+        );
+/*
+        var shortcuts = false;
+        if (shortcuts) {
+            shortcuts.on('click', function (e, t) {
+                var target = e.getTarget('dt', shortcuts);
+                if (target) {
+//                if (t = e.getTarget('dt', shortcuts)) {
+                    e.stopEvent();
+                    var module = app.getModule(target.id.replace('-shortcut', ''));
+                    if (module) {
+//                      module.createWindow();
+                        //refactor to have show check if exists and
+                        //then do createWindow (less repetitive coding)
+                        module.show();
+                    }
+                }
+            });
+        }
+*/
+
+        this.on({
+            beforechange: this.onBeforeChange,
+            afterchange:  this.onAfterChange,
+            scope: this
+        });
+    },
+
+    onRender: function () {
+        Ext.ux.View.superclass.onRender.apply(this, arguments);
+        this.el.on({
+            'contextmenu': this.onContextmenu,
+            scope: this
+        });
+    },
+
+    initLogout: Ext.emptyFn,
+
+    /**
+     * return false to prevent the change 
+     * @param {Object} o scope
+     * @param {String} f The feature being changed 
+     * @param {Object} cfg Config object for the feature being changed
+     */
+    onBeforeChange: function (o, f, cfg) {
+/*
+        var notifyWin = this.showNotification({
+            html: 'Loading wallpaper...'
+            , title: 'Please wait'
+        });
+*/        
+        return true;                
+    },
+
+    /**
+     * @param {Object} o scope
+     * @param {String} f The feature being changed 
+     * @param {Object} cfg Config object for the feature being changed
+     */
+    onAfterChange: function (o, f, cfg) {
+/*
+        notifyWin.setIconClass('x-icon-done');
+        notifyWin.setTitle('Finished');
+        notifyWin.setMessage('Wallpaper loaded.');
+        this.hideNotification(notifyWin);
+*/
+    },
+
+    // Private
+    addContextMenuItem: function (item) {
+/*
+        var m = app.getModule(id);
+        if (m && !m.contextMenuItem) {
+            / * if (m.moduleType === 'menu') { // handle menu modules
+                var items = m.items;
+                for (var i = 0, len = items.length; i < len; i++) {
+                    m.launcher.menu.items.push(app.getModule(items[i]).launcher);
+                }
+            } * /
+            this.cmenu.add(m.launcher);
+        }
+*/
+        if (Ext.isArray(item)) {
+            for (var i = 0, len = item.length; i < len; i++) {
+                this.addContextMenuItem(item[i]);
+            }
+            return;
+        }
+        this.cmenu.add(item);
+    },
+
+    onContextmenu: function (e) {
+//      if (e.target.id === desktopEl.id) {
+        e.stopEvent();
+        if (!this.cmenu.el) {
+            this.cmenu.render();
+        }
+        var xy = e.getXY();
+        xy[1] -= this.cmenu.el.getHeight();
+        this.cmenu.showAt(xy);
+//      }
+//      this.fireEvent('contextmenu', this, e.target.id, e);
+    },
+
+    /**
+     * Styles config object:
+     *
+     * Example
+     *
+     * {
+     *		backgroundcolor: '575757',
+     *		fontcolor: 'FFFFFF',
+     *		transparency: 100,
+     *		theme: {
+     *			id: 2,
+     *			name: 'Vista Black',
+     *			pathtofile: 'resources/themes/xtheme-vistablack/css/xtheme-vistablack.css'
+     *		},
+     *		wallpaper: {
+     *			id: 10,
+     *			name: 'Blue Swirl',
+     *			pathtofile: 'resources/wallpapers/blue-swirl.jpg'
+     *		},
+     *		wallpaperposition: 'tile'
+     *	}
+     */
+    initStyles: function (s, app) {
+        if (!s) {
+            return false;
+        }
+        this.setBackgroundColor(s.backgroundcolor);
+        this.setFontColor(s.fontcolor);
+        this.setTheme(s.theme);
+        this.setTransparency(s.transparency, this.taskbar.el);
+        this.setBackground(s.wallpaper);
+        this.setBackgroundPosition(s.wallpaperposition);
+        return true;
+    },
+
+    setBackground: function (o) {
+        var task, wp, verify;
+        if (o && o.id && o.name && o.pathtofile) {
+            if (this.fireEvent("beforechange", this, 'background', o) !== false) {
+                wp = new Image();
+                wp.src = o.pathtofile;
+                
+                task = new Ext.util.DelayedTask(verify, this);
+                task.delay(200);
+                
+                //app.styles.wallpaper = o;
+            }
+        } else {
+//            console.warn('background configured wrong');
+        }
+
+        verify = function () {
+            if (wp.complete) {
+                task.cancel();
+                this.fireEvent("afterchange", this, 'background', o);
+                document.body.background = wp.src;
+            } else {
+                //TODO: will this run forever if not found?
+                //need timeout or counter if so
+                task.delay(200);
+            }
+        };
+    },
+    
+    setBackgroundPosition: function (pos) {
+        if (pos) {
+            var b;
+            if (pos === "center") {
+                b = Ext.get(document.body);
+                b.removeClass('wallpaper-tile');
+                b.addClass('wallpaper-center');
+            } else if (pos === "tile") {
+                b = Ext.get(document.body);
+                b.removeClass('wallpaper-center');
+                b.addClass('wallpaper-tile');
+            }			
+            //app.styles.wallpaperposition = pos;
+        }
+    },    
+
+    setTransparency: function (v, el) {
+        if (v >= 0 && v <= 100) {
+            //taskbarEl.addClass("transparent");
+            el.addClass("transparent");
+            Ext.util.CSS.updateRule('.transparent', 'opacity', v / 100);
+            Ext.util.CSS.updateRule('.transparent', '-moz-opacity', v / 100);
+            Ext.util.CSS.updateRule('.transparent', 'filter', 'alpha(opacity=' + v + ')');
+            
+            //app.styles.transparency = v;
+        }
+    },
+
+    addAutoRun: function (id) {
+        var m = this.app.getModule(id),
+        c = this.app.launchers.autorun;
+        
+        if (m && !m.autorun) {
+            m.autorun = true;
+            c.push(id);
+        }
+    },
+    
+    removeAutoRun: function (id) {
+        var i, m = this.app.getModule(id),
+            c = this.app.launchers.autorun;
+            
+        if (m && m.autorun) {
+            i = 0;
+                
+            while (i < c.length) {
+                if (c[i] === id) {
+                    c.splice(i, 1);
+                } else {
+                    i++;
+                }
+            }
+            
+            m.autorun = null;
+        }
+    },
+
+    //TODO: the names here should be generalized to adding 'shortcuts' to any menu
+    //in case the GUI is not a "desktop"
+    
+    addShortcut: function (id, updateConfig) {
+//        var m = this.app.getModule(id);
+        var c, m = Ext.getCmp(id);
+        
+        if (m && !m.shortcut) {
+            c = m.launcher;
+            
+            m.shortcut = this.shortcuts.addShortcut({
+                handler: c.handler,
+                iconCls: c.shortcutIconCls,
+                scope: c.scope,
+                text: c.text,
+                tooltip: c.tooltip || ''
+            });
+            
+            if (updateConfig) {
+                this.app.launchers.shortcut.push(id);
+            }
+        }
+        
+    },
+
+    removeShortcut: function (id, updateConfig) {
+        var i, sc, m = this.app.getModule(id);
+        
+        if (m && m.shortcut) {
+            this.shortcuts.removeShortcut(m.shortcut);
+            m.shortcut = null;
+            
+            if (updateConfig) {
+                sc = this.app.launchers.shortcut;
+                i = 0;
+                while (i < sc.length) {
+                    if (sc[i] === id) {
+                        sc.splice(i, 1);
+                    } else {
+                        i++;
+                    }
+                }
+            }
+        }
+    }    
+});
+
+Ext.ux.View.GUIS = {};
+
+Ext.reg('view', Ext.ux.View);
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/archive/App-old.js
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/archive/App-old.js	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/archive/App-old.js	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,540 @@
+Ext.ux.LaunchMgr = Ext.apply(new Ext.util.MixedCollection(), {
+    register : function(){
+        for(var i = 0, s; s = arguments[i]; i++){
+            this.add(s);
+        }
+    },
+    unregister : function(){
+        for(var i = 0, s; s = arguments[i]; i++){
+            this.remove(this.lookup(s));
+        }
+    },
+    lookup : function(id){
+        return typeof id == "object" ? id : this.get(id);
+    },
+/*
+    get : function(id){
+        return this.get(id);
+    },
+*/
+    // getKey implementation for MixedCollection
+    getKey : function(o){
+         return o.launchId || o.id;
+    }
+});
+
+
+
+
+
+
+/*
+ * Ext JS Library 2.2
+ * Copyright(c) 2006-2008, Ext JS, LLC.
+ * licensing@xxxxxxxxx
+ *
+ * http://extjs.com/license
+ */
+Ext.ux.App = Ext.extend(Ext.util.Observable, {
+    /**
+     * Read-only. This desktop's load state
+     * @type boolean
+     */
+    /**
+     * Read-only. This app's ready state
+     * @type boolean
+     */
+    /**
+     * Read-only. This app's launchers
+     * @type object
+     */
+    /**
+     * Read-only. This app's modules
+     * If a module is not loaded, a placeholder needs to be present.
+     * @type array
+     */
+    /**
+     * An instance of this class (the Controller) can inject an initialization
+     * logic by implementing this method.
+     */
+    init: Ext.emptyFn,
+    
+    /* @private */
+    constructor: function(config){
+    
+        Ext.apply(this, config);
+        
+        // Interface to load the platform (modules, settings, etc.)
+        // This is an abstract method required to be implemented by the instance of this app.  
+        // The getPlatform() method shall set this.platformLoaded = true to
+        // signify that the system can be initialized (this is required in order
+        // to handle a possible race condition with Ext.isReady.
+        this.getPlatform();
+        
+        this.addEvents(
+            'ready',
+            'beforeunload'
+        );
+        
+        Ext.onReady(this.initApp, this);
+    },
+
+    /* @private */
+    initApp: function(){
+        // only initialize the platform if it is loaded
+        if (this.platformLoaded) {
+            this.initPlatform();
+        }
+    },
+
+    /**
+     * @private
+     * @param {array} mIds An array of the module ids to run when this app is ready
+     */
+    initAutoRun : function(mIds){
+        if(mIds){
+            for(var i = 0, len = mIds.length; i < len; i++){
+//                var m = this.getModule(mIds[i]);
+                var m = Ext.getCmp(mIds[i]);
+                if(m){
+                    m.autorun = true;
+                    this.showWindow(mIds[i]);
+                    m.show();
+                }
+            }
+        }
+    },
+
+    /**
+     * @private
+     * @param {array} mIds An array of the module ids to add to the Desktop Context Menu
+     */
+    initContextMenu : function(mIds){
+        if(mIds){
+            for(var i = 0, len = mIds.length; i < len; i++){
+                this.view.addContextMenuItem(mIds[i]);
+            }
+        }
+    },
+
+    /**
+     * Launchers config object:
+     *
+     * Contains the moduleId's of the modules to add to each launcher.
+     *
+     * Example:
+     *
+     * {
+     *		autorun: [
+     *
+     *		],
+     *		contextmenu: [
+     *			'qo-preferences'
+     *		],
+     *		quickstart: [
+     *			'qo-preferences'
+     *		],
+     *		shortcut: [
+     *			'qo-preferences'
+     *		]
+     *	}
+     */
+    initLaunchers: function(){
+    
+        var l = this.launchers;
+        if (!l) {
+            return false;
+        }
+        
+        if (l.context) {
+            this.initContextMenu(l.context);
+        }
+        if (l.quickstart) {
+            this.initQuickStart(l.quickstart);
+        }
+        if (l.shortcut) {
+            this.initShortcut(l.shortcut);
+        }
+        if (l.autorun) {
+            this.onAppReady(this.initAutoRun.createDelegate(this, [l.autorun]), this);
+        }
+        return true;
+    },
+
+    /**
+     * adds the module to the launcher array
+     * @param {Object} m the module
+     */
+    addLaunchers : function(module){
+        if (!module.launcher) return;
+        var m, l = {}, s = 'startmenu';
+
+        // the menu's this module is to be added to
+        var menus = module.launcher.menus;
+
+        // the Start Menu config object for this module
+        var p = module.launcher.menuPath;
+
+        // configure the Start Menu launcher if appropriate
+        if (p) {
+            if (typeof p == "string") {
+                l.path = p;
+            } else {
+                l = p
+            }
+            l.name = s;
+            // add this module's Start Menu config to this module's menus
+            menus.push(l);
+        }
+        // initialize launchers array
+        this.launchers = this.launchers || [];
+
+        
+        for (var i = 0, len = menus.length; i < len; i++) {
+            m = menus[i];
+            l = {};
+            if (typeof m == "string") {
+                l.name = m;
+            } else {
+                l = m
+            }
+            Ext.applyIf(l, module.launcher.defaults);
+
+            // assign id, handler, and scope
+            l.id = module.id + '_launcher';
+            
+            // by default will call the Module Class' show method
+            // that show method does a check to see if the module
+            // has been created yet, and if not call the createWindow
+            // method for the module instance
+            l.handler = module.launcher.handler || module.show;
+            l.scope = m.scope || module;
+            this.launchers[l.name] = this.launchers[l.name] || [];
+            this.launchers[l.name].push(l);
+            Ext.ux.LaunchMgr.register(l);
+        }
+        console.dir(this.launchers);        
+    },
+
+    initLogout: function(){
+        if (this.logoutConfig) {
+            this.view.initLogout();
+        }
+    },
+
+    /**
+     * Modules array:
+     * Supports Modules on Demand. If a module is not preloaded, a placeholder needs to be present.
+     * A placeholder is an object that represents the module until it is loaded.
+     *
+     * Example:
+     *
+     * [
+     *      // This module will Load on Demand.
+     *      // This is its placeholder.
+     *		{
+     *			className: 'QoDesk.QoPreferences',
+     *			moduleType: 'system/preferences',
+     *			moduleId: 'qo-preferences',
+     * 			launcher: {
+     *				iconCls: 'pref-icon',
+     *				shortcutIconCls: 'pref-shortcut-icon',
+     *				text: 'Preferences',
+     *				tooltip: '<b>Preferences</b><br />Allows you to modify your desktop'
+     *			},
+     *			loaded: false
+     *		},
+     *      // This module is preloaded.
+     *      // Instantiate it here.
+     * 		new QoDesk.GridWindow(),
+     *		...
+     * ]
+     *
+     */
+    initModules: function(){
+        var m, ms = this.modules;
+        if (!ms) {
+            return false;
+        }
+        for (var i = 0, len = ms.length; i < len; i++) {
+            m = ms[i];//the module
+            // give each module a reference to this app
+            m.app = this;
+            
+            //launcher's handler should point to show method if already loaded
+            if (m.loaded === true) {
+                //at this point the module is only a config object
+                //so we need to instanciate the module
+                m = this.createModule(m);
+                //point the handler at the show method for the module
+                m.launcher.handler = m.show.createDelegate(this, [m]);
+            }
+            //launcher's handler should point to loadModule method if not loaded
+            else {
+                //this only registers the xtype TYPE (it won't be in ComponentMgr's MixedCollection)
+                //if an xtype was specified, add it to the types collection in
+                //ComponentMgr for possible re-use
+                //TODO: implement some override to ensure if there's an id
+                //specified with the xtype that the id can't be reused
+                //perhaps include this as a "developer extension" that could be included
+                //during development to notify developer of possible problems...
+                if (m.xtype) {
+                    //Another possibility would be to to delete any id before registering the type
+                    //to help circumvent any problems with duplicate id's.  This may not be desirable
+                    //in some situations though because maybe one instance is ever expected
+                    //by the developer and would want to rely on using that id.
+                    Ext.ComponentMgr.registerType(m.xtype, m);    
+                }
+
+                //this adds it to ComponentMgr's MixedCollection that can then be looked up with Ext.getCmp(id);
+                Ext.ComponentMgr.register(m)
+                
+                //it is also possible to use Ext.ComponentMgr.all.replace(someId) to replace
+                //an existing component in the MixedCollection.
+
+                // At this point the module has not been loaded yet.
+                // So we need to set the module's launcher to the load handler.
+//                m.launcher.handler = this.loadModule.createDelegate(this, [m.id]);
+                m.launcher.handler = Ext.ux.RemoteLoader.loadModule.createDelegate(this, [m.id]);
+            }
+            this.addLaunchers(m);
+        }
+        return true;
+    },
+
+    /**
+     * @param {Ext.app.Module} m The module to register
+     */
+    createModule: function(success, id, cls){
+
+        var m = Ext.getCmp(id);
+        
+        Ext.ComponentMgr.unregister(m);
+        
+        var c = new cls({id: id});
+        Ext.apply(c, m);
+        c.show();
+        
+        //var c = cls.prototype;
+        /*
+        //launcher's handler should point to show method if already loaded
+        if (c.loaded === true) {
+            
+            //Ext.extend(m, cls);
+            var comp = Ext.apply(m, c);
+
+            //at this point the module is only a Class
+            //we need to instanciate it
+            var o = new comp();
+            
+            //point the handler at the show method for the module
+            m.launcher.handler = m.showWindow.createDelegate(this, [m]);
+            m.show();
+        }*/
+        //launcher's handler should point to loadModule method if not loaded
+        return 
+    },
+    /**
+     * @param {boolean} success
+     * @param {string} moduleId
+     *
+     * Will be called when a module is loaded.
+     * If a request for this module is waiting in the
+     * queue, it as executed and removed from the queue.
+     */
+//    onModuleLoad: function(success, moduleId){
+    onModuleLoad : function(opts, success, response) {			
+        console.info('onModuleLoad callback');
+        if (success === true && moduleId) {
+            var m = this.getModule(moduleId);
+            m.loaded = true;
+            m.init();
+            
+            var q = this.requestQueue;
+            var nq = [];
+            for (var i = 0, len = q.length; i < len; i++) {
+                if (q[i].moduleId === moduleId) {
+                    q[i].callback.call(q[i].scope, m);
+                }
+                else {
+                    nq.push(q[i]);
+                }
+            }
+            this.requestQueue = nq;
+        }
+    },
+
+
+
+    /**
+     * @param {string} moduleId
+     *
+     * Provides the handler to the placeholder's launcher until the module is loaded.
+     * Requests the module.  Passes in the callback and scope as params.
+     */
+    createWindow: function(id){
+        var m = this.requestModule(id, this.createWindowCallback, this);
+    },
+    
+    createWindowCallback: function(m){
+        if (m) {
+            //call the module's createWindow implementation
+            m.createWindow();
+        }
+    },
+
+    //abstract method to be overridden if needed
+    getViewConfig: Ext.emptyFn,
+ 
+    getView: function(){
+
+        this.viewConfig = this.viewConfig || this.getViewConfig();
+        Ext.applyIf(this.viewConfig, {
+            app: this,
+            logoutConfig: this.logoutConfig
+        });
+
+        //developer should inject any startmenu config alterations here
+        //and apply them to the viewConfig object
+
+        var view = this.viewConfig.gui;
+        if(typeof view == 'string'){
+            this.view = new Ext.ux.View.GUIS[view.toLowerCase()](this.viewConfig);
+        }
+        return this.view;
+    },
+
+    initPlatform: function(){
+
+        if (!Ext.isReady) return;
+        
+        // Modules array        
+        this.initModules();
+        
+        // generalized view class 
+        this.view = this.getView();
+        
+        // at this point we have start of GUI.  
+        // Bottom start button and task bar are shown.
+        // no wallpaper yet.
+        
+        // Styles object
+        // set any styles if defined (background color, wallpaper, fontcolor, etc.)
+        // initStyles() uses this.desktop, so this.desktop must be instanciated already        
+        this.view.initStyles.createDelegate(this.view, [this.styles, this]);
+        
+        // Initialize launcher for each module
+        if (this.modules) {
+            this.initLaunchers();
+        }
+        
+        // Start Menu's logout button
+        // initLogout() uses this.desktop, so this.desktop must be instanciated already
+        this.initLogout();
+        
+        this.init();
+        
+        Ext.EventManager.on(window, 'beforeunload', this.onBeforeUnload, this);
+        this.fireEvent('ready', this);
+        this.isReady = true;
+    },
+
+    /**
+     * @param {array} mIds An array of the module ids to add to the Start Menu
+     * @param {boolean} tool True to add to the Start Menu's Tool panel
+     */
+    initQuickStart : function(m){
+        if(m){
+            var b = {
+                cls: 'x-btn-icon',
+                enableToggle: false,
+                text: '', // do not display text
+                toggleGroup: 'quickStart'
+            };  
+
+            Ext.each(m, function(item, index, allItems){
+ //               delete item.id;// = null; // remove it if it existed
+                Ext.apply(item, b);
+            })
+
+/*            
+            var btn = new Ext.Button(Ext.apply(config, {
+                cls:'x-btn-icon',
+                menuText: config.text,
+                renderTo: li,
+                text: '' // do not display text
+            }));
+*/            
+            var qs = Ext.getCmp('ux-quickstart-panel');
+            qs.addButton(m);
+            qs.doLayout();
+/*
+            for(var i = 0, len = mIds.length; i < len; i++){
+//                this.view.addQuickStartButton(mIds[i], false);
+                qs.addQuickStartButton(mIds[i], false);
+            }
+*/        
+        }
+    },
+
+    /**
+     * @param {array} mIds An array of the module ids to add to the Desktop Shortcuts
+     */
+    initShortcut : function(mIds){
+        if(mIds){
+            for(var i = 0, len = mIds.length; i < len; i++){
+                this.view.addShortcut(mIds[i], false);
+            }
+        }
+    },
+
+    onAppReady: function(fn, scope){
+        if (!this.isReady) {
+            this.on('ready', fn, scope);
+        }
+        else {
+            fn.call(scope, this);
+        }
+    },
+    
+    onBeforeUnload: function(e){
+        if (this.fireEvent('beforeunload', this) === false) {
+            e.stopEvent();
+        }
+    },
+    
+    /**
+     * Prevent the backspace (history -1) shortcut
+     */
+    preventBackspace: function(){
+        var map = new Ext.KeyMap(document, [{
+            key: Ext.EventObject.BACKSPACE,
+            fn: function(key, e){
+                var t = e.target.tagName;
+                if (t != "INPUT" && t != "TEXTAREA") {
+                    e.stopEvent();
+                }
+            }
+        }]);
+    },
+
+    showNotification: function(config){
+        var win = new Ext.ux.Notification(Ext.apply({
+            animateTarget: taskbarEl
+            , autoDestroy: true
+            , hideDelay: 5000
+            , html: ''
+            , iconCls: 'x-icon-waiting'
+            , title: ''
+        }, config));
+        win.show();
+
+        return win;
+    },
+    
+    hideNotification: function(win, delay){
+        if(win){
+            (function(){ win.animHide(); }).defer(delay || 3000);
+        }
+    }    
+});
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/archive/App-original.js
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/archive/App-original.js	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/archive/App-original.js	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,601 @@
+/*
+ * qWikiOffice Desktop 0.8.1
+ * Copyright(c) 2007-2008, Integrated Technologies, Inc.
+ * licensing@xxxxxxxxxxxxxxx
+ * 
+ * http://www.qwikioffice.com/license
+ *
+ * NOTE:
+ * This code is based on code from the original Ext JS desktop demo.
+ * I have made many modifications/additions.
+ *
+ * The Ext JS licensing can be viewed here:
+ *
+ * Ext JS Library 2.0 Beta 2
+ * Copyright(c) 2006-2007, Ext JS, LLC.
+ * licensing@xxxxxxxxx
+ * 
+ * http://extjs.com/license
+ *
+ */
+
+Ext.app.App = function(config){
+    Ext.apply(this, config);
+    
+    this.addEvents({
+        'ready' : true,
+        'beforeunload' : true
+    });
+
+    Ext.onReady(this.initApp, this);
+};
+
+Ext.extend(Ext.app.App, Ext.util.Observable, {
+    /**
+     * Read-only. This app's ready state
+     * @type boolean
+     */
+    isReady : false,
+    /**
+     * Read-only. This app's launchers
+     * @type object
+     */
+    launchers : null,
+    /**
+     * Read-only. This app's modules
+     * If a module is not loaded, a placeholder needs to be present.
+     * @type array
+     */
+    modules : null,
+     /**
+     * Read-only. This app's styles
+     * @type object
+     */
+    styles : null,
+    /**
+     * Read-only. This app's start config
+     * @type object
+     */
+    startConfig : null,
+     /**
+     * Read-only. This app's Start Menu's items and toolItems configs.
+     * @type object
+     */
+    startItemsConfig : null,
+    /**
+     * Read-only. This app's logout button config
+     * @type object
+     */
+    logoutButtonConfig : null,
+    /**
+     * Read-only. The url of this app's server connection
+     * 
+     * Allows a module to connect to its server script without knowing the path.
+     * Example ajax call:
+     * 
+     * Ext.Ajax.request({
+     * 		url: this.app.connection,
+     * 		// Could also pass moduleId and fileName in querystring like this,
+     * 		// instead of in the params config option.
+     *      
+     * 		// url: this.app.connection+'?moduleId='+this.id+'&fileName=Preferences.php',
+     *      params: {
+     *			moduleId: this.id,
+     *			fileName: 'Preferences.php',
+     *
+     *			...
+     *		},
+     *		success: function(){
+     *			...
+     *		},
+     *		failure: function(){
+     *			...
+     *		},
+     *		scope: this
+     *	});
+     */
+    connection : 'connect.php',
+    /**
+     * Read-only. The url of this app's loader script
+     * @type string
+     * 
+     * Handles module on demand loading
+     */
+	loader : 'load.php',
+    /**
+     * Read-only. The queue of requests to run once a module is loaded
+     */
+    requestQueue : [],
+    
+    init : Ext.emptyFn,
+	startMenuSortFn : Ext.emptyFn,
+    getModules : Ext.emptyFn,
+    getLaunchers : Ext.emptyFn,
+    getStyles : Ext.emtpyFn,
+    getStartConfig : Ext.emptyFn,
+    getLogoutConfig : Ext.emptyFn,
+    
+    initApp : function(){
+        Ext.BLANK_IMAGE_URL = 'resources/images/default/s.gif';
+        
+        this.preventBackspace();
+        
+    	this.privileges = this.privileges || this.getPrivileges();
+    	
+        this.modules = this.modules || this.getModules();
+		this.initModules();
+        
+		this.startConfig = this.startConfig || this.getStartConfig();
+		this.startItemsConfig = this.startItemsConfig || this.getStartItemsConfig();
+		Ext.apply(this.startConfig, this.startItemsConfig);
+		
+		this.desktop = new Ext.Desktop(this);
+		
+		this.styles = this.styles || this.getStyles();
+        this.initStyles();
+		
+		this.launchers = this.launchers || this.getLaunchers();
+        this.initLaunchers();
+		
+		this.logoutConfig = this.logoutConfig || this.getLogoutConfig();
+        this.initLogout();
+        
+        this.init();
+    
+        Ext.EventManager.on(window, 'beforeunload', this.onBeforeUnload, this);
+        this.fireEvent('ready', this);
+        this.isReady = true;
+    },
+    
+    initLogout : function(){
+        if(this.logoutConfig){
+            this.desktop.taskbar.startMenu.addTool(this.logoutConfig);
+        }
+    },
+
+    initStyles : function(){
+        var s = this.styles;
+        if(!s){
+            return false;
+        }
+        
+        this.desktop.setBackgroundColor(s.backgroundcolor);
+        this.desktop.setFontColor(s.fontcolor);
+        this.desktop.setTheme(s.theme);
+        this.desktop.setTransparency(s.transparency);
+        this.desktop.setWallpaper(s.wallpaper);
+        this.desktop.setWallpaperPosition(s.wallpaperposition);
+        
+        return true;
+    },
+
+    initModules : function(){
+        var ms = this.modules;
+        if(!ms){ return false; }
+        
+        for(var i = 0, len = ms.length; i < len; i++){			
+            if(ms[i].loaded === true){
+				//ms[i].app = this;
+            }else{
+    			// module is not loaded, set the handler for its launcher
+                ms[i].launcher.handler = this.createWindow.createDelegate(this, [ms[i].moduleId]);
+            }
+    		ms[i].app = this;
+        }
+        
+        return true;
+    },
+    
+    initLaunchers : function(){
+        var l = this.launchers;
+        if(!l){
+            return false;
+        }
+        
+        if(l.contextmenu){
+            this.initContextMenu(l.contextmenu);
+        }
+        if(l.quickstart){
+            this.initQuickStart(l.quickstart);
+        }
+        if(l.shortcut){
+            this.initShortcut(l.shortcut);
+        }
+        if(l.autorun){
+            this.onReady(this.initAutoRun.createDelegate(this, [l.autorun]), this);
+        }
+        
+        return true;
+    },
+    
+    /**
+     * @param {array} mIds An array of the module ids to run when this app is ready
+     */
+    initAutoRun : function(mIds){
+        if(mIds){
+            for(var i = 0, len = mIds.length; i < len; i++){
+                var m = this.getModule(mIds[i]);
+                if(m){
+                    m.autorun = true;
+                    this.createWindow(mIds[i]);
+                }
+            }
+        }
+    },
+
+    /**
+     * @param {array} mIds An array of the module ids to add to the Desktop Context Menu
+     */
+    initContextMenu : function(mIds){
+        if(mIds){
+            for(var i = 0, len = mIds.length; i < len; i++){
+                this.desktop.addContextMenuItem(mIds[i]);
+            }
+        }
+    },
+
+    /**
+     * @param {array} mIds An array of the module ids to add to the Desktop Shortcuts
+     */
+    initShortcut : function(mIds){
+        if(mIds){
+            for(var i = 0, len = mIds.length; i < len; i++){
+                this.desktop.addShortcut(mIds[i], false);
+            }
+        }
+    },
+    
+    /**
+     * @param {array} mIds An array of the module ids to add to the Start Menu
+     * @param {boolean} tool True to add to the Start Menu's Tool panel
+     */
+	initQuickStart : function(mIds){
+        if(mIds){	        
+			for(var i = 0, len = mIds.length; i < len; i++){
+	            this.desktop.addQuickStartButton(mIds[i], false);
+            }
+        }
+    },
+    
+    /**
+	 * Returns the Start Menu items and toolItems configs
+	 * @param {array} ms An array of the modules.
+	 */
+	getStartItemsConfig : function(){
+		var ms = this.modules;
+		var sortFn = this.startMenuSortFn;
+		
+    	if(ms){
+    		var paths;
+    		var root;
+    		var sm = { menu: { items: [] } }; // Start Menu
+    		var smi = sm.menu.items;
+        
+    		smi.push({text: 'StartMenu', menu: { items: [] } });
+    		smi.push({text: 'ToolMenu', menu: { items: [] } });
+    		
+			for(var i = 0, iLen = ms.length; i < iLen; i++){ // loop through modules
+				if(ms[i].menuPath){	
+					paths = ms[i].menuPath.split('/');
+					root = paths[0];
+					
+					if(paths.length > 0){
+						if(root === 'StartMenu'){
+							simplify(smi[0].menu, paths, ms[i].launcher);
+							sort(smi[0].menu);
+						}else if(root === 'ToolMenu'){
+							simplify(smi[1].menu, paths, ms[i].launcher);
+							sort(smi[1].menu);
+						}
+                    }
+                }
+            }
+			
+			return {
+				items: smi[0].menu.items,
+				toolItems: smi[1].menu.items
+			};
+    	}
+    	
+    	return null;
+		
+		/**
+		 * Creates nested arrays that represent the Start Menu.
+		 * 
+		 * @param {array} pMenu The Start Menu
+		 * @param {array} texts The menu texts
+		 */
+		function simplify(pMenu, paths, launcher){
+			var newMenu;
+			var foundMenu;
+			
+			for(var i = 1, len = paths.length; i < len; i++){ // ignore the root (StartMenu, ToolMenu)
+				foundMenu = findMenu(pMenu.items, paths[i]); // text exists?
+				
+				if(!foundMenu){
+					newMenu = {
+						iconCls: 'ux-start-menu-submenu',
+						handler: function(){ return false; },
+						menu: { items: [] },
+						text: paths[i]
+					};
+					pMenu.items.push(newMenu);
+					pMenu = newMenu.menu;
+                }else{
+					pMenu = foundMenu;
+                }
+            }
+			
+			pMenu.items.push(launcher);
+        }
+
+    /**
+     * @param {array} mIds An array of the modulId's to add to the Quick Start panel
+     */
+		function findMenu(pMenu, text){
+			for(var j = 0, jlen = pMenu.length; j < jlen; j++){
+				if(pMenu[j].text === text){
+					return pMenu[j].menu; // found the menu, return it
+				}
+			}
+			return null;
+		}
+		
+		/**
+		 * @param {array} menu The nested array to sort
+		 */
+		function sort(menu){
+			var items = menu.items;
+			for(var i = 0, ilen = items.length; i < ilen; i++){
+				if(items[i].menu){
+					sort(items[i].menu); // use recursion to iterate nested arrays
+				}
+				bubbleSort(items, 0, items.length); // sort the menu items
+			}
+		}
+
+        /**
+        * @param {array} items Menu items to sort
+        * @param {integer} start The start index
+        * @param {integer} stop The stop index
+        */
+        function bubbleSort(items, start, stop){
+            for(var i = stop - 1; i >= start;  i--){
+                for(var j = start; j <= i; j++){
+                    if(items[j+1] && items[j]){
+						if(sortFn(items[j], items[j+1])){
+                            var tempValue = items[j];
+                            items[j] = items[j+1];
+                            items[j+1] = tempValue;
+                        }
+                    }
+                }
+            }
+            return items;
+        }
+    },
+    
+    /**
+     * @param {string} moduleId
+     * 
+     * Provides the handler to the placeholder's launcher until the module it is loaded.
+     * Requests the module.  Passes in the callback and scope as params.
+     */
+    createWindow : function(moduleId){
+        var m = this.requestModule(moduleId, function(m){
+            if(m){
+                m.createWindow();
+            }
+        }, this);
+    },
+    
+    /** 
+     * @param {string} v The moduleId or moduleType you want returned
+     * @param {Function} cb The Function to call when the module is ready/loaded
+     * @param {object} scope The scope in which to execute the function
+     */
+    requestModule : function(v, cb, scope){
+        var m = this.getModule(v);
+        
+        if(m){
+            if(m.loaded === true){
+                cb.call(scope, m);
+            }else{
+                if(cb && scope){
+                    this.requestQueue.push({
+                        moduleId: m.moduleId,
+                        callback: cb,
+                        scope: scope
+                    });
+//                    this.loadModule(m.moduleId, m.launcher.text);
+                    this.loadModule(m);
+                }
+            }
+        }
+    },
+    
+    /**
+     * 
+     * @param {String} moduleId id assigned to the module
+     * @param {String} moduleName launcher.text config property
+     */
+    loadModule : function(m){
+        var notifyWin = this.desktop.showNotification({
+//            html: 'Loading ' + moduleName + '...'
+            html: 'Loading ' + m.launcher.text + '...'
+            , title: 'Please wait'
+        });
+        var loader = m.loader || {};
+        Ext.Ajax.request({
+//            url: this.loader,
+            url: loader.url || this.urlLoad,            
+            params: {
+//                moduleId: moduleId
+                moduleId: m.id,
+                extraParams: loader.params
+            },
+            success: function(o){
+                notifyWin.setIconClass('x-icon-done');
+                notifyWin.setTitle('Finished');
+//                notifyWin.setMessage(moduleName + ' loaded.');
+                notifyWin.setMessage(m.launcher.text + ' loaded.');
+                this.desktop.hideNotification(notifyWin);
+                notifyWin = null;
+        
+                if(o.responseText !== ''){
+                    //responseText should include "
+                    eval(o.responseText);
+//                    this.loadModuleComplete(true, moduleId);
+                    this.loadModuleComplete(true, m.id);
+                }else{
+                    alert('An error occured on the server.');
+                }
+            },
+            failure: function(){
+                alert('Connection to the server failed!');
+            },
+            scope: this
+        });
+    },
+    
+    /**
+     * @param {boolean} success
+     * @param {string} moduleId
+     * 
+     * Will be called when a module is loaded.
+     * Creates an instance of the loaded module.
+     * If a request for this module is waiting in the
+     * queue, it as executed and removed from the queue.
+     */
+    loadModuleComplete : function(success, moduleId){    	
+        if(success === true && moduleId){
+    		var m = this.getModule(moduleId);
+    		m.loaded = true;
+    		m.init();
+    		
+            var q = this.requestQueue;
+            var nq = [];
+            
+            for(var i = 0, len = q.length; i < len; i++){
+                if(q[i].moduleId === moduleId){
+                    q[i].callback.call(q[i].scope, m);
+                }else{
+                    nq.push(q[i]);
+                }
+            }
+            
+            this.requestQueue = nq;
+        }
+    },
+    
+    /**
+     * @param {string} v The moduleId or moduleType you want returned
+     */
+    getModule : function(v){
+        var ms = this.modules;
+        
+        for(var i = 0, len = ms.length; i < len; i++){
+            if(ms[i].moduleId == v || ms[i].moduleType == v){
+                return ms[i];
+            }
+        }
+        
+        return null;
+    },
+
+    
+    /**
+     * @param {Ext.app.Module} m The module to register
+     */
+    registerModule: function(m){
+    	if(!m){ return false; }
+		this.modules.push(m);
+		m.launcher.handler = this.createWindow.createDelegate(this, [m.moduleId]);
+		m.app = this;
+	},
+
+    /**
+     * @param {string} moduleId or moduleType 
+     * @param {array} requests An array of request objects
+     * 
+     * Example:
+     * this.app.makeRequest('module-id', {
+     *    requests: [
+     *       {
+     *          action: 'createWindow',
+     *          params: '',
+     *          callback: this.myCallbackFunction,
+     *          scope: this
+     *       },
+     *       { ... }
+     *    ]
+     * });
+     */
+    makeRequest : function(moduleId, requests){
+        if(moduleId !== '' && Ext.isArray(requests)){
+            var m = this.requestModule(moduleId, function(m){
+                if(m){
+                    m.handleRequest(requests);
+                }
+            }, this);
+        }
+    },
+    
+    /**
+     * @param {string} action The module action
+     * @param {string} moduleId The moduleId property
+     */
+    isAllowedTo : function(action, moduleId){
+    	var p = this.privileges,
+    		a = p[action];
+    	
+    	if(p && a){
+    		for(var i = 0, len = a.length; i < len; i++){
+    			if(a[i] === moduleId){
+    				return true;
+    			}
+    		}
+    	}
+    	
+    	return false;
+    },
+    
+    getDesktop : function(){
+        var test = 1;
+        console.info('getDesktop');
+        return this.desktop;
+    },
+    
+    /**
+     * @param {Function} fn The function to call after the app is ready
+     * @param {object} scope The scope in which to execute the function
+     */
+    onReady : function(fn, scope){
+        if(!this.isReady){
+            this.on('ready', fn, scope);
+        }else{
+            fn.call(scope, this);
+        }
+    },
+    
+    onBeforeUnload : function(e){
+        if(this.fireEvent('beforeunload', this) === false){
+            e.stopEvent();
+        }
+    },
+    
+    /**
+     * Prevent the backspace (history -1) shortcut
+     */
+    preventBackspace : function(){
+        var map = new Ext.KeyMap(document, [{
+            key: Ext.EventObject.BACKSPACE,
+            fn: function(key, e){
+                var t = e.target.tagName;
+                if(t != "INPUT" && t != "TEXTAREA"){
+                    e.stopEvent();
+                }
+            }
+        }]);
+    }
+});
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/archive/App-remaining.js
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/archive/App-remaining.js	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/archive/App-remaining.js	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,104 @@
+Ext.ux.App = Ext.extend(Ext.util.Observable, {
+    /**
+     * Read-only. The queue of requests to run once a module is loaded
+     */
+    requestQueue : [],
+    
+
+
+    /**
+     * 
+     * @param {String} moduleId id assigned to the module
+     * @param {String} moduleName launcher.text config property
+     */
+    loadModule : function(m){
+        var loader = m.loader || {};
+        Ext.Ajax.request({
+            url: loader.url || this.urlLoad,            
+            params: {
+                moduleId: m.id,
+                extraParams: loader.params
+            },
+            success: function(o){
+        
+                if(o.responseText !== ''){
+                    eval(o.responseText);
+                    this.loadModuleComplete(true, m.id);
+                }else{
+                    alert('An error occured on the server.');
+                }
+            },
+            failure: function(){
+                alert('Connection to the server failed!');
+            },
+            scope: this
+        });
+    },
+
+    /**
+     * @param {boolean} success
+     * @param {string} moduleId
+     * 
+     * Will be called when a module is loaded.
+     * Creates an instance of the loaded module.
+     * If a request for this module is waiting in the
+     * queue, it as executed and removed from the queue.
+     */
+    loadModuleComplete : function(success, moduleId){    	
+        if(success === true && moduleId){
+    		var m = Ext.ux.ModuleMgr.get(moduleId);
+    		m.loaded = true;
+//    		m.init();
+    		
+            var q = this.requestQueue;
+            var nq = [];
+            
+            for(var i = 0, len = q.length; i < len; i++){
+                if(q[i].moduleId === moduleId){
+                    q[i].callback.call(q[i].scope, m);
+                }else{
+                    nq.push(q[i]);
+                }
+            }
+            
+            this.requestQueue = nq;
+        }
+    },
+
+
+    //abstract method to be overridden if needed
+    getViewConfig: Ext.emptyFn,
+
+    initLaunchers: function(){
+        var types = ['autorun','context','quickstart','shortcut','start','tray'];
+        //this.initContextMenu(this.getLaunchers('context'));
+        this.view.addContextMenuItem(this.getLaunchers('context'));
+        
+/*
+        if (l.quickstart) {
+            this.initQuickStart(l.quickstart);
+        }
+        if (l.shortcut) {
+            this.initShortcut(l.shortcut);
+        }
+*/
+        return true;
+    },
+
+    /**
+     * @private
+     * @param {array} mIds An array of the module ids to add to the Desktop Context Menu
+     */
+    initContextMenu : function(mIds){
+        if(mIds){
+            for(var i = 0, len = mIds.length; i < len; i++){
+                this.view.addContextMenuItem(mIds[i]);
+            }
+        }
+    },
+    initLogout: function(){
+        if (this.logoutConfig) {
+            this.view.initLogout();
+        }
+    },
+});
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/archive/App-remaining2.js
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/archive/App-remaining2.js	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/archive/App-remaining2.js	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,84 @@
+Ext.ux.App = Ext.extend(Ext.util.Observable, {
+    initLaunchers: function(){
+        var types = ['autorun','context','quickstart','shortcut','start','tray'];
+        //this.initContextMenu(this.getLaunchers('context'));
+        this.view.addContextMenuItem(this.getLaunchers('context'));
+        
+/*
+        if (l.quickstart) {
+            this.initQuickStart(l.quickstart);
+        }
+        if (l.shortcut) {
+            this.initShortcut(l.shortcut);
+        }
+*/
+        return true;
+    },
+
+    /**
+     * @private
+     * @param {array} mIds An array of the module ids to add to the Desktop Context Menu
+     */
+    initContextMenu : function(mIds){
+        if(mIds){
+            for(var i = 0, len = mIds.length; i < len; i++){
+                this.view.addContextMenuItem(mIds[i]);
+            }
+        }
+    },
+});
+
+
+
+
+    /**
+     * Dynamically remove an external JavaScript or CSS file.
+     * Any external JavaScript or CSS file, whether added manually or dynamically, can be removed from the page.
+     * The end result may not be fully what you had in mind, however.
+     * So what actually happens when you remove an external JavaScript or CSS file? Perhaps not entirely what
+     * you would expect actually. In the case of JavaScript, while the element is removed from the document tree,
+     * any code loaded as part of the external JavaScript file remains in the browser's memory. That is to say,
+     * you can still access variables, functions etc that were added when the external file first loaded (at 
+     * least in IE7 and Firefox 2.x). If you're looking to reclaim browser memory by removing an external
+     * JavaScript, don't rely on this operation to do all your work. With external CSS files, when you remove a
+     * file, the document does reflow to take into account the removed CSS rules, but unfortunately, not in IE7
+     * (Firefox 2.x and Opera 9 do).
+     * To remove an external JavaScript or CSS file from a page, the key is to hunt them down first by
+     * traversing the DOM, then call DOM's removeChild() method to do the hit job. A generic approach is to
+     * identify an external file to remove based on its file name, though there are certainly other approaches,
+     * such as by CSS class name. With that in mind, the below function removes any external JavaScript or CSS
+     * file based on the file name entered.
+     */
+removejscssfile: function (filename, filetype){
+    //determine element type to create nodelist from
+    var targetelement=(filetype=="js")? "script" : (filetype=="css")? "link" : "none";
+    //determine corresponding attribute to test for
+    var targetattr=(filetype=="js")? "src" : (filetype=="css")? "href" : "none" 
+    /**
+     * create a collection out of either all "SCRIPT" or "LINK" elements on the page
+     * depending on the desired file type to remove. The corresponding attribute to look at
+     * also changes accordingly ("src" or "href" attribute). Then, the function sets out to
+     * loop through the gathered elements backwards to see if any of them match the name of
+     * the file that should be removed. There's a reason for the reversed direction-
+     * if/whenever an identified element is deleted, the collection collapses by one element
+     * each time, and to continue to cycle through the new collection correctly, reversing
+     * the direction does the trick (it may encounter undefined elements, hence the first
+     * check for allsuspects[i] in the if statement). Now, to delete the identified element,
+     * the DOM method parentNode.removeChild() is called on it.
+     */
+    var allsuspects=document.getElementsByTagName(targetelement)
+    for (var i=allsuspects.length; i>=0; i--){ //search backwards within nodelist for matching elements to remove
+        if (allsuspects[i] && allsuspects[i].getAttribute(targetattr)!=null && allsuspects[i].getAttribute(targetattr).indexOf(filename)!=-1)
+        allsuspects[i].parentNode.removeChild(allsuspects[i]) //remove element by calling parentNode.removeChild()
+    }
+},
+
+//removejscssfile("somescript.js", "js") //remove all occurences of "somescript.js" on page
+//removejscssfile("somestyle.css", "css") //remove all occurences "somestyle.css" on page
+
+    removeAlljs: function (){
+         var f = document.getElementsByTagName('script');
+         for (var i = f.length; i > 0; i--) { //search backwards within nodelist for matching elements to remove
+             f[0].parentNode.removeChild(f[0]); //remove element by calling parentNode.removeChild()
+         }
+    }

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/archive/Buttonbar.js
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/archive/Buttonbar.js	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/archive/Buttonbar.js	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,11 @@
+Ext.ux.Appbar = Ext.extend(Ext.Toolbar, {
+
+    //prevent a border from being applied
+    border: false,
+    
+    /* @private */
+    constructor : function (config) {
+        Ext.ux.Buttonbar.superclass.constructor.apply(this, arguments);
+    }
+});
+Ext.reg('appbar', Ext.ux.Appbar);
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/archive/LaunchMgr.js
===================================================================

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/archive/Portal.js
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/archive/Portal.js	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/archive/Portal.js	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,230 @@
+/*
+ * Ext JS Library 2.2
+ * Copyright(c) 2006-2008, Ext JS, LLC.
+ * licensing@xxxxxxxxx
+ * 
+ * http://extjs.com/license
+ */
+
+Ext.ux.Portlet = Ext.extend(Ext.Panel, {
+//Ext.ux.Portlet = Ext.extend(Ext.Button, {
+    //anchor: '100%',
+    //arrowAlign:'bottom',
+    width: 64,
+    height: 74,
+    frame:true,
+//    collapsible:false,//true,
+    draggable:true,//works if extend Ext.Panel...if want button need to implement Ext.DD
+    cls:'x-portlet',
+//    baseCls: 'x-plain',
+    text: 'Add User',
+    //enableToggle: true,//undefined,true
+    iconCls: 'add24',//
+    iconAlign: 'top',//'right','top','bottom'
+    //menu : {items: [{text:'Menu Item 1'},{text:'Menu Item 2'},{text:'Menu Item 3'}]}
+    scale: 'large'//'medium','large'
+//    split: true,//false
+});
+Ext.reg('portlet', Ext.ux.Portlet);
+
+Ext.ux.PortalColumn = Ext.extend(Ext.Container, {
+    //layout: 'anchor',
+    layout: 'column',
+    width: 100,
+    autoEl: 'div',
+    defaultType: 'portlet',//items within portalcolumn will default to xtype:'portlet'
+    cls:'x-portal-column'
+});
+Ext.reg('portalcolumn', Ext.ux.PortalColumn);
+
+Ext.ux.Portal = Ext.extend(Ext.Panel, {
+    layout: 'column',
+    autoScroll:true,
+    cls:'x-portal',
+    defaultType: 'portalcolumn',
+    
+    initComponent : function(){
+        Ext.ux.Portal.superclass.initComponent.call(this);
+        this.addEvents({
+            validatedrop:true,
+            beforedragover:true,
+            dragover:true,
+            beforedrop:true,
+            drop:true
+        });
+    },
+
+    initEvents : function(){
+        Ext.ux.Portal.superclass.initEvents.call(this);
+        this.dd = new Ext.ux.Portal.DropZone(this, this.dropConfig);
+    },
+    
+    beforeDestroy: function() {
+        if(this.dd){
+            this.dd.unreg();
+        }
+        Ext.ux.Portal.superclass.beforeDestroy.call(this);
+    }
+});
+Ext.reg('portal', Ext.ux.Portal);
+
+
+Ext.ux.Portal.DropZone = function(portal, cfg){
+    this.portal = portal;
+    Ext.dd.ScrollManager.register(portal.body);
+    Ext.ux.Portal.DropZone.superclass.constructor.call(this, portal.bwrap.dom, cfg);
+    portal.body.ddScrollConfig = this.ddScrollConfig;
+};
+
+Ext.extend(Ext.ux.Portal.DropZone, Ext.dd.DropTarget, {
+    ddScrollConfig : {
+        vthresh: 50,
+        hthresh: -1,
+        animate: true,
+        increment: 200
+    },
+
+    createEvent : function(dd, e, data, col, c, pos){
+        return {
+            portal: this.portal,
+            panel: data.panel,
+            columnIndex: col,
+            column: c,
+            position: pos,
+            data: data,
+            source: dd,
+            rawEvent: e,
+            status: this.dropAllowed
+        };
+    },
+
+    notifyOver : function(dd, e, data){
+        var xy = e.getXY(), portal = this.portal, px = dd.proxy;
+
+        // case column widths
+        if(!this.grid){
+            this.grid = this.getGrid();
+        }
+
+        // handle case scroll where scrollbars appear during drag
+        var cw = portal.body.dom.clientWidth;
+        if(!this.lastCW){
+            this.lastCW = cw;
+        }else if(this.lastCW != cw){
+            this.lastCW = cw;
+            portal.doLayout();
+            this.grid = this.getGrid();
+        }
+
+        // determine column
+        var col = 0, xs = this.grid.columnX, cmatch = false;
+        for(var len = xs.length; col < len; col++){
+            if(xy[0] < (xs[col].x + xs[col].w)){
+                cmatch = true;
+                break;
+            }
+        }
+        // no match, fix last index
+        if(!cmatch){
+            col--;
+        }
+
+        // find insert position
+        var p, match = false, pos = 0,
+            c = portal.items.itemAt(col),
+            items = c.items.items;
+
+        for(var len = items.length; pos < len; pos++){
+            p = items[pos];
+            var h = p.el.getHeight();
+            if(h !== 0 && (p.el.getY()+(h/2)) > xy[1]){
+                match = true;
+                break;
+            }
+        }
+
+        var overEvent = this.createEvent(dd, e, data, col, c,
+                match && p ? pos : c.items.getCount());
+
+        if(portal.fireEvent('validatedrop', overEvent) !== false &&
+           portal.fireEvent('beforedragover', overEvent) !== false){
+
+            // make sure proxy width is fluid
+            px.getProxy().setWidth('auto');
+
+            if(p){
+                px.moveProxy(p.el.dom.parentNode, match ? p.el.dom : null);
+            }else{
+                px.moveProxy(c.el.dom, null);
+            }
+
+            this.lastPos = {c: c, col: col, p: match && p ? pos : false};
+            this.scrollPos = portal.body.getScroll();
+
+            portal.fireEvent('dragover', overEvent);
+
+            return overEvent.status;;
+        }else{
+            return overEvent.status;
+        }
+
+    },
+
+    notifyOut : function(){
+        delete this.grid;
+    },
+
+    notifyDrop : function(dd, e, data){
+        delete this.grid;
+        if(!this.lastPos){
+            return;
+        }
+        var c = this.lastPos.c, col = this.lastPos.col, pos = this.lastPos.p;
+
+        var dropEvent = this.createEvent(dd, e, data, col, c,
+                pos !== false ? pos : c.items.getCount());
+
+        if(this.portal.fireEvent('validatedrop', dropEvent) !== false &&
+           this.portal.fireEvent('beforedrop', dropEvent) !== false){
+
+            dd.proxy.getProxy().remove();
+            dd.panel.el.dom.parentNode.removeChild(dd.panel.el.dom);
+            if(pos !== false){
+                c.insert(pos, dd.panel);
+            }else{
+                c.add(dd.panel);
+            }
+            
+            c.doLayout();
+
+            this.portal.fireEvent('drop', dropEvent);
+
+            // scroll position is lost on drop, fix it
+            var st = this.scrollPos.top;
+            if(st){
+                var d = this.portal.body.dom;
+                setTimeout(function(){
+                    d.scrollTop = st;
+                }, 10);
+            }
+
+        }
+        delete this.lastPos;
+    },
+
+    // internal cache of body and column coords
+    getGrid : function(){
+        var box = this.portal.bwrap.getBox();
+        box.columnX = [];
+        this.portal.items.each(function(c){
+             box.columnX.push({x: c.el.getX(), w: c.el.getWidth()});
+        });
+        return box;
+    },
+
+    // unregister the dropzone from ScrollManager
+    unreg: function() {
+        //Ext.dd.ScrollManager.unregister(this.portal.body);
+        Ext.ux.Portal.DropZone.superclass.unreg.call(this);
+    }
+});

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/archive/QuickStart.js
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/archive/QuickStart.js	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/archive/QuickStart.js	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,154 @@
+/**
+ * @class Ext.ux.QuickStartPanel
+ * @extends Ext.ux.Appbar
+ */
+Ext.ux.QuickStartPanel = Ext.extend(Ext.ux.Appbar, {
+    /**
+     * @cfg {Boolean} enableMenu true to enable menu (defaults to true)
+     */
+    enableMenu: true,
+    /**
+     * @cfg {String} baseCls base class used for css styles for elements (defaults to 'ux-quickstart')
+     */
+/*    baseCls: 'ux-quickstart'
+
+    createButton : function(win, el){
+        var btn = new Ext.Button(Ext.apply(win, {
+            cls:'x-btn-icon',
+            menuText: win.text,
+            //renderTo: el,
+            text: '' // do not display text
+        }));
+
+        return btn;
+    },
+
+    afterAdd : function (btn) {
+        this.delegateUpdates();
+    },
+
+    delegateUpdates : function(){
+        if(this.el && this.enableMenu && this.rendered){
+            this.showButtons();
+            this.clearMenu();
+            this.autoMenu();
+        }
+    },
+
+    menuAdd : function(config){
+        this.menu.add(config);
+    },
+    
+    showButtons : function(){
+        if (this.items) {
+            var count = this.items.length;
+            
+            for(var i = 0; i < count; i++){
+                this.items[i].show(); 	
+            }
+        }
+    },
+    
+    autoMenu : function(){
+        if (!this.items) return;
+        if (!this.menu) {
+            this.menu = new Ext.menu.Menu();
+        }
+
+        var count = this.items.length;
+        var ow = this.el.dom.offsetWidth;
+        var tw = this.el.dom.clientWidth;
+        
+        var wrap = this.stripWrap;
+        var cw = wrap.dom.offsetWidth;
+        var l = this.edge.getOffsetsTo(this.stripWrap)[0];
+        
+        if(!this.enableMenu || count < 1 || cw < 20){ // 20 to prevent display:none issues
+            return;
+        }
+        
+        wrap.setWidth(tw);
+        
+        if(l <= tw){
+            if(this.showingMenu){
+                this.showingMenu = false;
+                this.menuButton.hide();
+            }
+        }else{
+            tw -= wrap.getMargins('lr');
+            
+            wrap.setWidth(tw > 20 ? tw : 20);
+            
+            if(!this.showingMenu){
+                if(!this.menuButton){
+                    this.createMenuButton();
+                }else{
+                    this.menuButton.show();
+                }
+            }
+            
+            mo = this.getMenuButtonPos();
+            
+            for(var i = count-1; i >= 0; i--){
+                var bo = this.items[i].el.dom.offsetLeft + this.items[i].el.dom.offsetWidth;
+                
+                if(bo > mo){
+                    this.items[i].hide();
+
+                    var ic = this.items[i].initialConfig,
+                        config = {
+                            iconCls: ic.iconCls,
+                            handler: ic.handler,
+                            scope: ic.scope,
+                            text: ic.menuText
+                        };
+                    
+                    this.menuAdd(config);
+                }else{
+                    this.items[i].show();
+                }
+            }
+            
+            this.showingMenu = true;
+        }
+    },
+*/
+    /**
+     * clears all items from current menu
+     */    
+/*
+    clearMenu : function(){
+        if (this.menu) {
+            this.menu.removeAll();
+        }
+    },
+
+    
+    createMenuButton : function(){
+        
+        var h = this.el.dom.offsetHeight;
+
+        var mb = this.el.insertFirst({
+            cls: this.baseCls+'-menubutton-wrap'
+        });
+
+        mb.setHeight(h);
+        
+        var btn = new Ext.Button({
+            cls: 'x-btn-icon',
+            id: this.baseCls+'-menubutton',
+            menu: this.menu,
+            renderTo: mb
+        });
+
+        mb.setWidth(Ext.get(this.baseCls+'-menubutton').getWidth());
+        
+        this.menuButton = mb;
+    },
+    
+    getMenuButtonPos : function(){
+        return this.menuButton.dom.offsetLeft;
+    }
+*/    
+});
+Ext.reg('quickstart', Ext.ux.QuickStartPanel);
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/archive/garbage.js
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/archive/garbage.js	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/js/archive/garbage.js	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,189 @@
+ItemsDataStore = new Ext.data.Store({
+id: 'ItemsDataStore',
+proxy: new Ext.data.HttpProxy({
+url: 'Order/database.php',
+method: 'POST'
+}),
+baseParams:{task: "GETITEMS"},
+reader: new Ext.data.JsonReader({
+root: 'results',
+totalProperty: 'total',
+id: 'itemID'
+},[
+{name: 'itemID', type: 'int', mapping: 'itemID'},
+{name: 'itemName', type: 'string', mapping: 'itemName'},
+{name: 'Description', type: 'string', mapping: 'itemDescription'},
+{name: 'Quantity', type: 'int', mapping: 'quantityAvail'},
+{name: 'UnitPrice', type: 'int', mapping: 'unitprice'},
+{name: 'Location', type: 'string', mapping: 'location'},
+]),
+sortInfo:{field: 'itemID', direction: "ASC"}
+});
+
+
+ItemsColumnModel = new Ext.grid.ColumnModel(
+[{
+header : 'ID',
+dataIndex : 'itemID',
+width : 80,
+hidden : false
+}, {
+header : 'Name',
+readOnly : true,
+dataIndex : 'itemName',
+width : 80,
+hidden : false
+}, {
+header : 'Description',
+dataIndex : 'Description',
+width : 120
+}, {
+header : 'Quantity',
+dataIndex : 'Quantity',
+width : 80
+}, {
+header : 'UnitPrice',
+dataIndex : 'UnitPrice',
+width : 80
+
+}, {
+header : 'Location',
+dataIndex : 'Location',
+width : 80,
+hidden : false
+}]);
+ItemsColumnModel.defaultSortable = true;
+
+if (!PlaceOrderWindow) {
+PlaceOrderWindow = desktop.createWindow({
+id: 'PlaceOrderWindow',
+title: 'Place an Order',
+closable:true,
+width:700,
+height:500,
+plain:true,
+layout: 'column',
+items: [PlaceOrderEditorGrid, PlaceOrderEditorGrid2]
+});
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Ext.ux.App = Ext.extend(Ext.util.Observable, {
+    /**
+     * Read-only. The queue of requests to run once a module is loaded
+     */
+    requestQueue : [],
+    
+
+
+    /**
+     * 
+     * @param {String} moduleId id assigned to the module
+     * @param {String} moduleName launcher.text config property
+     */
+    loadModule : function(m){
+        var loader = m.loader || {};
+        Ext.Ajax.request({
+            url: loader.url || this.urlLoad,            
+            params: {
+                moduleId: m.id,
+                extraParams: loader.params
+            },
+            success: function(o){
+        
+                if(o.responseText !== ''){
+                    eval(o.responseText);
+                    this.loadModuleComplete(true, m.id);
+                }else{
+                    alert('An error occured on the server.');
+                }
+            },
+            failure: function(){
+                alert('Connection to the server failed!');
+            },
+            scope: this
+        });
+    },
+
+    /**
+     * @param {boolean} success
+     * @param {string} moduleId
+     * 
+     * Will be called when a module is loaded.
+     * Creates an instance of the loaded module.
+     * If a request for this module is waiting in the
+     * queue, it as executed and removed from the queue.
+     */
+    loadModuleComplete : function(success, moduleId){    	
+        if(success === true && moduleId){
+    		var m = Ext.ux.ModuleMgr.get(moduleId);
+    		m.loaded = true;
+//    		m.init();
+    		
+            var q = this.requestQueue;
+            var nq = [];
+            
+            for(var i = 0, len = q.length; i < len; i++){
+                if(q[i].moduleId === moduleId){
+                    q[i].callback.call(q[i].scope, m);
+                }else{
+                    nq.push(q[i]);
+                }
+            }
+            
+            this.requestQueue = nq;
+        }
+    },
+
+
+    //abstract method to be overridden if needed
+    getViewConfig: Ext.emptyFn,
+
+    initLaunchers: function(){
+        var types = ['autorun','context','quickstart','shortcut','start','tray'];
+        //this.initContextMenu(this.getLaunchers('context'));
+        this.view.addContextMenuItem(this.getLaunchers('context'));
+        
+/*
+        if (l.quickstart) {
+            this.initQuickStart(l.quickstart);
+        }
+        if (l.shortcut) {
+            this.initShortcut(l.shortcut);
+        }
+*/
+        return true;
+    },
+
+    /**
+     * @private
+     * @param {array} mIds An array of the module ids to add to the Desktop Context Menu
+     */
+    initContextMenu : function(mIds){
+        if(mIds){
+            for(var i = 0, len = mIds.length; i < len; i++){
+                this.view.addContextMenuItem(mIds[i]);
+            }
+        }
+    },
+});
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/layoutwindow.js
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/layoutwindow.js	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/layoutwindow.js	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,73 @@
+/**
+ * <p>This class creates a specialized Window for :</p>
+ * 
+ * @class Ext.app.module.LayoutWindow
+ * @extends Ext.ux.Module
+ * @author Michael LeComte (<a href="http://extjs.com/forum/member.php?u=6834";>mjlecomte</a>)
+ * @license <a href="http://www.gnu.org/licenses/lgpl.html";>LGPL 3.0</a>
+ * @version 0.01
+ */
+Ext.app.module.LayoutWindow = Ext.extend(Ext.ux.Module, {
+
+    /**
+     * @cfg {Boolean} loaded
+     * Whether or not the module will be loaded when this code is applied
+     */
+    loaded: true,
+
+    /** @private */
+    constructor : function (config) {
+        Ext.apply(this, config);
+/*
+        // Panel for the west
+        var nav = new Ext.Panel({
+            title       : 'Navigation',
+            region      : 'west',
+            split       : true,
+            width       : 200,
+            collapsible : true,
+            margins     : '3 0 3 3',
+            cmargins    : '3 3 3 3'
+        }); 
+
+        var center = new Ext.Panel({
+            height: 400,
+            title       : 'Center',
+            region      : 'center',
+            split       : true,
+            width       : 200,
+            margins     : '3 0 3 3',
+            cmargins    : '3 3 3 3'
+        }); 
+*/
+        Ext.apply(this, {
+            title    : 'Layout Window',
+//            autoHeight: true,
+            height: 300,
+            autoEl: {},
+            plain    : true,
+            width: 600
+/*
+            ,
+            items: {
+                height: 200,
+                xtype: 'container',
+                autoEl: {},
+                layout   : 'border',
+                items    : [nav, center2]
+            }
+*/
+        });
+        
+        Ext.app.module.LayoutWindow.superclass.constructor.call(this);
+    },
+
+    /** @private */
+    initComponent : function () {
+        //call parent
+        Ext.app.module.LayoutWindow.superclass.initComponent.call(this);
+    }
+});
+
+//register the xtype
+Ext.reg('grid-win', Ext.app.module.LayoutWindow);
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/modules-preload.txt
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/modules-preload.txt	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/modules-preload.txt	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,262 @@
+/* Sample Application Configuration */
+{
+	/* success */
+	// you must specify success: true
+	// the authentication class may reject the request and send back a message or something
+	// (not implemented yet)
+    success: true,
+
+	/* platform */
+	// root node for remote configuration of the application consisting of these properties:
+    //    modules
+    //    privileges
+    //    startConfig
+    //    styles
+    //    launchers
+    //    logoutConfig
+    // TODO: rank when each of the above must be loaded in order, so that we can determine
+    //       how the loading might be streamed in to give perception of faster loaded application
+    platform: {
+
+		/* viewConfig */
+		// config for the View
+        viewConfig: {
+            gui: 'desktop',
+
+			/* startConfig */
+			// config for the start menu
+	        startConfig: {
+	            iconCls: 'user',
+	            title: 'Michael J', // get_cookie('memberName'),
+	            toolItems: [{
+	                text: 'Settings',
+	                iconCls: 'settings',
+	                scope: this
+	            },'-',{
+	                text: 'Word wrap needed for long items',
+	                iconCls: 'logout',
+	                scope: this
+	            }],
+	            toolPanelWidth: 115
+	        },
+	
+			/* logoutConfig */
+	        //logoutConfig: { }, //included in controller.js already
+	
+			/* styles */
+	        styles: {
+	            "backgroundcolor": "575757",
+	            "fontcolor": "FFFFFF",
+	            "transparency": "100",
+	            "theme": {
+	                "id": "3",
+	                "name": "Vista Glass",
+	                "pathtofile": "..\/modules\/qwikioffice\/resources\/themes\/xtheme-vistaglass\/css\/xtheme-vistaglass.css"},
+	                "wallpaper": {
+	                    "id": "11",
+	                    "name": "Blue Psychedelic",
+	                    "pathtofile": "..\/modules\/qwikioffice\/resources\/wallpapers\/blue-psychedelic.jpg"
+	                },
+	            "wallpaperposition":"tile"
+	        } // end of styles
+        }, // end of viewConfig
+        
+		/* modules */
+        modules: [{
+
+		    //A typical module config object will have this minimum form if not preloaded:
+
+		    // id (required), must be unique for entire app
+		    id: 'grid-win',
+		
+		    xtype : 'grid-win',
+
+		    // To signify that no additional configuration should be retrieved from the server
+		    // just set the 'loaded' config property to true so that the component will not be
+		    // retrieved from the server again.  This property is optional, but the app will
+		    // attempt to load this module until this property is set to true.
+		    loaded : false,
+
+			// the number of instances of this module that may be run at one time
+			// all launchers except the active apps taskbar will check this before
+			// creating a new instance versus just showing the one instance.
+		    limit : 2,
+
+		    iconCls: 'acc-icon',
+		
+	    	// defaults will be applied to all launchers
+	        launchDefaults: {
+	            iconCls: 'acc-icon',
+	            shortcutIconCls: 'demo-acc-shortcut',
+	            text: 'Accordion Window',
+	            tooltip: '<b>Accordion Window</b><br />A window with an accordion layout'
+	        },
+
+	        // launchers: an array of launcher config objects or just the name of the menu type
+	        // if the defaults are to be applied.  Possible launcher types for a desktop type
+	        // environment include:
+	        //    autorun    : equivalent to the 'Startup' folder for Windows OS
+	        //    context    : right click on the desktop body
+	        //    quick      : Quick Start Buttons just to the right of the main Start Button on the taskbar
+	        //    shortcut   : Desktop shortcuts or navigation menu for other GUI's
+	        //    start      : seen after clicking on the Start button
+	        //    tray       : Buttons for the system tray (far right of taskbar)
+	        
+		    launchers : [
+
+	            // just specify a string for the name, and any defaults will be applied:
+	            'autorun', 'context', 'quick', 'tray',
+	
+	            // or specify a full config for finer control:
+	            {
+	                type: 'shortcut',
+	                // notice that these properties are the same as used in 'defaults' config
+	                iconCls: 'acc-icon',
+	                shortcutIconCls: 'demo-acc-shortcut',
+	                text: 'Accordion Window',
+	                tooltip: '<b>Accordion Window</b><br />A window with an accordion layout'
+	            },
+
+		        // To add this module to the Start Menu, specify one of the following:
+		        // 1. the string name 'start' as a config item (see above) or
+		        // 2. a config object as shown below to customize the placement of the 
+		        //    module in the start menu further.
+				// Specify the path the module should be listed at in the start menu
+				// You can list a module in submenus by adding forward slashes to the path.
+				// for example:
+				//    path: 'start/Bogus Menu'
+	            {
+	                type: 'start',
+		        	path: 'start'//'start', 'tool', 'start/Bogus Menu'
+	            }
+		        
+	            // the handler to launch this module
+	            // typically you should not need to specify this as the default is this.show
+	            //handler : this.show,
+	            
+	            // typically you should not need to specify the scope for the handler (defaults to this module)
+	            //scope: this
+		    ],  // end launchers
+		    
+		    // additional optional properties
+
+		    // optionally specify a different load configuration:
+		    loader: {
+//		        url: 'loader.php', // so use loader.url || this.loader;
+		        url: 'layoutwindow.js', // so use loader.url || this.loader;
+		        params: {
+		            foo: 'bar'
+		        }
+		    },
+
+		    //As with any class or xtype, specify as much additional configuration as you want may be preconfigured
+		    foo : 'bar'
+        },{
+		    // id (required), must be unique for entire app
+		    id: 'grid-win2',
+		    xtype : 'grid-win',
+		    loaded : false,
+		    limit : 2,
+		    iconCls: 'grid-icon',
+	        launchDefaults: {
+	            iconCls: 'acc-icon',
+	            shortcutIconCls: 'demo-acc-shortcut',
+	            text: 'Accordion Window',
+	            tooltip: '<b>Accordion Window</b><br />A window with an accordion layout'
+	        },
+		    launchers : [
+	            'context', 'quick', 'tray',
+	            {
+	                type: 'shortcut',
+	                iconCls: 'acc-icon',
+	                shortcutIconCls: 'demo-acc-shortcut',
+	                text: 'Accordion Window',
+	                tooltip: '<b>Accordion Window</b><br />A window with an accordion layout'
+	            },
+	            {
+	                type: 'start',
+		        	path: 'start'//'start', 'tool', 'start/Bogus Menu'
+	            }
+		    ],  // end launchers
+		    loader: {
+		        url: 'layoutwindow.js'
+		    }
+        },{
+		    // id (required), must be unique for entire app
+		    id: 'grid-win3',
+		    xtype : 'grid-win',
+		    loaded : false,
+		    limit : 2,
+		    iconCls: 'grid-icon',
+	        launchDefaults: {
+	            iconCls: 'acc-icon',
+	            shortcutIconCls: 'demo-acc-shortcut',
+	            text: 'Accordion Window',
+	            tooltip: '<b>Accordion Window</b><br />A window with an accordion layout'
+	        },
+		    launchers : [
+	            'quick', 'tray',
+	            {
+	                type: 'shortcut',
+	                iconCls: 'acc-icon',
+	                shortcutIconCls: 'demo-acc-shortcut',
+	                text: 'Accordion Window',
+	                tooltip: '<b>Accordion Window</b><br />A window with an accordion layout'
+	            },
+	            {
+	                type: 'start',
+		        	path: 'start'//'start', 'tool', 'start/Bogus Menu'
+	            }
+		    ],  // end launchers
+		    loader: {
+		        url: 'layoutwindow.js'
+		    }
+        },{
+		    // id (required), must be unique for entire app
+		    id: 'grid-win4',
+		    xtype : 'grid-win',
+		    loaded : false,
+		    limit : 2,
+		    iconCls: 'grid-icon',
+	        launchDefaults: {
+	            iconCls: 'acc-icon',
+	            shortcutIconCls: 'demo-acc-shortcut',
+	            text: 'Accordion Window',
+	            tooltip: '<b>Accordion Window</b><br />A window with an accordion layout'
+	        },
+		    launchers : [
+	            'quick', 'tray',
+	            {
+	                type: 'shortcut',
+	                iconCls: 'acc-icon',
+	                shortcutIconCls: 'demo-acc-shortcut',
+	                text: 'Accordion Window',
+	                tooltip: '<b>Accordion Window</b><br />A window with an accordion layout'
+	            },
+	            {
+	                type: 'start',
+		        	path: 'start'//'start', 'tool', 'start/Bogus Menu'
+	            }
+		    ],  // end launchers
+		    loader: {
+		        url: 'layoutwindow.js'
+		    }
+        }], // end of modules
+        
+		/* privileges */
+		// TODO: may need to rework this, I haven't looked at what it is used for yet.
+        privileges: [{
+            className: 'QoDesk.QoPreferences',
+            moduleId: 'qo-preferences',
+            moduleType: 'system/preferences',
+            menuPath: 'ToolMenu',
+            launcher: {
+                iconCls: 'pref-icon',
+                shortcutIconCls: 'pref-shortcut-icon',
+                text: 'Preferences',
+                tooltip: '<b>Preferences</b><br />Allows you to modify your desktop'
+            },
+            loaded: false
+        }] // end of privileges       
+    } // end of platform
+}
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/override.js
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/override.js	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/override.js	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,41 @@
+Ext.override(Ext.Component, {
+    /**
+     * Destroys this component by purging any event listeners, removing the component's element from the DOM,
+     * removing the component from its {@link Ext.Container} (if applicable) and unregistering it from
+     * {@link Ext.ComponentMgr}.  Destruction is generally handled automatically by the framework and this method
+     * should usually not need to be called directly.
+     */
+    destroy : function(){
+        if(this.fireEvent("beforedestroy", this) !== false){
+            this.beforeDestroy();
+            if(this.rendered){
+                this.el.removeAllListeners();
+                this.el.remove();
+                if(this.actionMode == "container" || this.removeMode == "container"){
+                    this.container.remove();
+                }
+            }
+            this.onDestroy();
+//*********************************************************************************************************            
+//*********************************************************************************************************
+            //destroy any context menu:
+            if (this.cmenu) {
+                Ext.destroy(this.cmenu);
+            }
+//*********************************************************************************************************            
+//*********************************************************************************************************            
+            Ext.ComponentMgr.unregister(this);
+            this.fireEvent("destroy", this);
+            this.purgeListeners();
+        }
+    },
+
+    /**
+     * Returns the id of this component.
+     * @return {String}
+     */
+    getId : function(){
+//        return this.id || (this.id = "ext-comp-" + (++Ext.Component.AUTO_ID));
+        return this.id || (this.id = this.ctype + "-" + (++Ext.Component.AUTO_ID));
+    }
+});

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/css/desktop.css
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/css/desktop.css	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/css/desktop.css	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,833 @@
+/*override*/
+.x-layout-split{
+/*    height:0px; *//*make bigger to have drag*/
+    /*z-index:30000;/*no point...ext reassigns this value every expand/collapse*/
+/*    background-color:transparent;*/
+}
+
+
+#ux-taskbar-xsplit .x-layout-mini-south {
+    top:-5;
+}
+#ux-taskbar-xsplit {
+    background-color:#688CBB;
+/*    border-bottom:1px solid #3b5a82;*/
+    height: 1px !important;
+}
+
+
+.x-layout-cmini-south {
+/*    height: 5px !important;*/
+}
+#ux-taskbar-xcollapsed .x-layout-collapsed {
+    height: 0px !important;
+    /*top:10 !important;*/
+}
+
+/* toolbar inherits from container which does not currently support border:false*/
+#ux-taskbar .x-toolbar{
+    border-width:0;
+/*	padding:2px;*/
+}
+
+/*
+ * qWikiOffice Desktop 0.8.0
+ * Copyright(c) 2007-2008, Integrated Technologies, Inc.
+ * licensing@xxxxxxxxxxxxxxx
+ * 
+ * http://www.qwikioffice.com/license
+ *
+ * NOTE:
+ * This code is based on code from the original Ext JS desktop demo.
+ * I have made many modifications/additions.
+ *
+ * The Ext JS licensing can be viewed here:
+ *
+ * Ext JS Library 2.0 Beta 2
+ * Copyright(c) 2006-2007, Ext JS, LLC.
+ * licensing@xxxxxxxxx
+ * 
+ * http://extjs.com/license
+ *
+ */
+
+html, body {
+	font: normal 12px tahoma, arial, verdana, sans-serif;
+	margin: 0;
+	padding: 0;
+	border: 0 none;
+	overflow: hidden;
+	height: 100%;
+	background-position:center center;
+	background-repeat:no-repeat;
+}
+
+.wait-cursor {
+	cursor:wait;
+}
+.transparent {
+	-moz-opacity: 0.8;
+    opacity: .80;
+    filter: alpha(opacity=80);
+}
+.wallpaper-tile {
+	background-repeat: repeat;
+	background-position: left top;
+}
+.wallpaper-center {
+	background-position: center;
+}
+
+.logout {
+	background-image: url(../images/default/icons/logout.png) !important;
+}
+.x-icon-alert {
+	background-image: url(../images/default/icons/caution.gif) !important;
+}
+.x-icon-information {
+	background-image: url(../images/default/icons/quote.gif) !important;
+}
+.x-icon-waiting {
+	background-image: url(../images/default/icons/hourglass.gif) !important;
+}
+.x-icon-done {
+	background-image: url(../images/default/icons/clock.gif) !important;
+}
+/*
+#x-desktop .wallpaper {
+	width: 100%;
+	height: 100%;
+	border: 0 none;
+	position: relative;
+    overflow:hidden;
+    zoom:1;
+    background:#f9f9f9 url(../wallpapers/qwikioffice.jpg) no-repeat fixed center center;
+}
+*/
+.wallpaper {
+	border: 0 none;
+	position: relative;
+    overflow:hidden;
+    zoom:1;
+    background:#f9f9f9;
+}
+
+#ux-taskbar .x-btn {
+	float: left;
+	margin: 1px 0 0 1px;
+    position:relative;
+}
+
+#ux-taskbar button {
+	text-align: left;
+	color: #ffffff;
+}
+
+#ux-taskbar {
+	background:transparent none;
+	height:30px;
+	margin:0;
+	padding:0;
+	position:relative;
+	z-index:8999;
+	/* z-index:12001; */
+}
+
+/* begin: taskbutton */
+#ux-taskbuttons-panel .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;
+}
+#ux-taskbuttons-panel .x-btn-icon .x-btn-center{
+	padding:1px;
+}
+#ux-taskbuttons-panel .x-btn-text-icon .x-btn-center .x-btn-text{
+	background-position: 0 6px;
+	background-repeat: no-repeat;
+	height:28px;
+	overflow:hidden;
+	padding:7px 0px 7px 20px;
+}
+#ux-taskbuttons-panel .x-btn-left, #ux-taskbuttons-panel .x-btn-right{
+	font-size:1px;
+    line-height:1px;
+}
+#ux-taskbuttons-panel .x-btn-left{
+	width:4px;
+	height:28px;
+	background:url(../images/default/taskbar/taskbutton.gif) no-repeat 0 0;
+}
+#ux-taskbuttons-panel .x-btn-right{
+	width:4px;
+	height:28px;
+	background:url(../images/default/taskbar/taskbutton.gif) no-repeat 0 -28px;
+}
+#ux-taskbuttons-panel .x-btn-left i, #ux-taskbuttons-panel .x-btn-right i{
+	display:block;
+    width:4px;
+    overflow:hidden;
+    font-size:1px;
+    line-height:1px;
+}
+#ux-taskbuttons-panel .x-btn-center{
+	background:url(../images/default/taskbar/taskbutton.gif) repeat-x 0 -56px;
+	vertical-align: middle;
+	text-align:center;
+	padding:0 5px;
+	cursor:pointer;
+	white-space:nowrap;
+}
+#ux-taskbuttons-panel .x-btn-left{ 
+	background-position:0 0;
+}
+#ux-taskbuttons-panel .x-btn-right{
+	background-position:0 -28px;
+}
+#ux-taskbuttons-panel .x-btn-center{
+	background-position:0 -56px;
+}
+#ux-taskbuttons-panel .x-btn-over .x-btn-left{
+	background-position:0 -252px;
+}
+#ux-taskbuttons-panel .x-btn-over  .x-btn-right{
+	background-position:0 -280px;
+}
+#ux-taskbuttons-panel .x-btn-over .x-btn-center{
+	background-position:0 -308px;
+}
+#ux-taskbuttons-panel .x-btn-click .x-btn-left{
+	background-position:0 -168px;
+}
+#ux-taskbuttons-panel .x-btn-click  .x-btn-right{
+	background-position:0 -196px;
+}
+#ux-taskbuttons-panel .x-btn-click .x-btn-center{
+	background-position:0 -224px;
+}
+#ux-taskbuttons-panel .active-win .x-btn-left{
+	background-position:0 -84px;
+}
+#ux-taskbuttons-panel .active-win  .x-btn-right{
+	background-position:0 -112px;
+}
+#ux-taskbuttons-panel .active-win .x-btn-center{
+	background-position:0 -140px;
+}
+#ux-taskbuttons-panel .active-win .x-btn-center button {
+    color:#fff;
+}
+/* end: taskbutton */
+
+
+
+#spacer {
+	height: 25px;
+	float: left;
+	width: 0;
+	overflow: hidden;
+	margin-top: 2px;
+}
+
+.x-window-body p,.x-panel-body p {
+	padding: 10px;
+	margin: 0;
+}
+/* fix for scrolling issue in firefox */
+.x-window-mc {
+	background:#ffffff none;
+	border:1px solid #000000;
+}
+.x-border-layout-ct {
+	background:transparent none;
+}
+.x-panel-body {
+	background:transparent none;
+}
+.x-tree .x-panel-body {
+	background-color:transparent;
+}
+/* end fix */
+
+.x-window-maximized .x-window-bc {
+	height:0;
+}
+
+/* Begin: startmenu */
+.ux-start-menu {
+	background:transparent none !important;
+	border:0px none !important;
+	padding:0 !important;
+}
+.ux-start-menu-tl .x-window-header {
+	color:#f1f1f1;
+	font:bold 11px tahoma,arial,verdana,sans-serif;
+    padding:5px 0 4px 0;
+}
+.x-panel-tl .x-panel-icon, .ux-start-menu-tl .x-panel-icon {
+	background-position:0pt 4px;
+	background-repeat:no-repeat;
+	padding-left:20px !important;
+}
+.ux-start-menu-tl {
+	background: transparent url(../images/default/startmenu/left-corners.png) no-repeat 0 0;
+	padding-left:6px;
+    zoom:1;
+    z-index:1;
+    position:relative;
+}
+.ux-start-menu-tr {
+	background: transparent url(../images/default/startmenu/right-corners.png) no-repeat right 0;
+	padding-right:6px;
+}
+.ux-start-menu-tc {
+	background: transparent url(../images/default/startmenu/top-bottom.png) repeat-x 0 0;
+	overflow:hidden;
+    zoom:1;
+}
+.ux-start-menu-ml {
+	background: transparent url(../images/default/startmenu/left-right.png) repeat-y 0 0;
+	padding-left:6px;
+    zoom:1;
+}
+.ux-start-menu-bc {
+	background: transparent url(../images/default/startmenu/top-bottom.png) repeat-x 0 bottom;
+    zoom:1;
+}
+.ux-start-menu-bc .x-window-footer {
+    padding-bottom:6px;
+    zoom:1;
+    font-size:0;
+    line-height:0;
+}
+.ux-start-menu-bl {
+	background: transparent url(../images/default/startmenu/left-corners.png) no-repeat 0 bottom;
+	padding-left:6px;
+    zoom:1;
+}
+.ux-start-menu-br {
+	background: transparent url(../images/default/startmenu/right-corners.png) no-repeat right bottom;
+	padding-right:6px;
+    zoom:1;
+}
+.x-panel-nofooter .ux-start-menu-bc {
+	height:6px;
+}
+.ux-start-menu-splitbar-h {
+	background-color:#d0d0d0;
+}
+.ux-start-menu-bwrap {
+	background:transparent none !important;
+	border:0px none;
+}
+.ux-start-menu-body {
+	background:transparent none !important;
+	border:0px none;
+}
+.ux-start-menu-apps-panel {
+	background:#ffffff none;
+	border:1px solid #99bbe8;
+}
+.ux-start-menu-tools-panel {
+	border:0px none;
+	background:transparent url(../images/default/startmenu/right.png) repeat-y scroll right 0pt;
+}
+.ux-start-menu-apps-panel .x-menu-item-active {
+	background: #f5f8fb url(../images/default/startmenu/app-item-over.gif) repeat-x left bottom !important;
+	border:1px solid #b0c4ca !important;
+	padding:0 !important;
+}
+/* End: startmenu */
+
+
+
+/* Begin: taskbar */
+#ux-taskbar-start {
+	background:transparent url(../images/default/taskbar/taskbar-start-panel-bg.gif) repeat-x left top;
+	left:0px;
+	padding:0;
+	position:absolute;
+}
+#ux-quickstart-panel {
+	background:transparent url(../images/default/taskbar/taskbar-start-panel-bg.gif) repeat-x left top;
+	left:0px;
+	padding:0;
+	position:absolute;
+}
+#ux-systemtray-panel {
+	background:transparent url(../images/default/taskbar/taskbuttons-panel-bg.gif) repeat-x left top;
+	left:0px;
+	padding:0;
+	position:absolute;
+}
+#ux-taskbar-start .x-toolbar {
+	background: none;
+	padding:0px;
+	border:0px none;
+}
+#ux-taskbar-panel-wrap {
+	background:transparent none;
+}
+#ux-taskbuttons-panel {
+	background:transparent url(../images/default/taskbar/taskbuttons-panel-bg.gif) repeat-x left top;
+	padding-top:0;
+	position:relative;
+}
+#ux-taskbar .x-splitbar-h {
+	background:transparent url(../images/default/taskbar/taskbar-split-h.gif) no-repeat 0 0;
+	width:14px;
+}
+/* End: taskbar */
+
+
+
+.ux-quickstart-strip-wrap {
+	width:100%;
+    overflow:hidden;
+    position:relative;
+    zoom:1;
+}
+
+ul.ux-quickstart-strip {
+	display:block;
+	width:5000px;
+    zoom:1;
+}
+
+ul.ux-quickstart-strip li {
+    float:left;
+    margin-left:0px;
+}
+
+
+ul.ux-quickstart-strip li.ux-quickstart-edge {
+    float:left;
+    margin:0 !important;
+    padding:0 !important;
+    border:0 none !important;
+    font-size:1px !important;
+    line-height:1px !important;
+    overflow:hidden;
+    zoom:1;
+    background:transparent !important;
+    width:1px;
+}
+
+.ux-taskbuttons-strip-wrap {
+	/* overflow:hidden;
+	position:relative;
+	width:100%; */
+	
+	width:100%;
+    overflow:hidden;
+    position:relative;
+    zoom:1;
+}
+
+ul.ux-taskbuttons-strip {
+	display:block;
+	width:5000px;
+    zoom:1;
+}
+
+ul.ux-taskbuttons-strip li {
+    float:left;
+    margin-left:2px;
+}
+
+
+ul.ux-taskbuttons-strip li.ux-taskbuttons-edge {
+    float:left;
+    margin:0 !important;
+    padding:0 !important;
+    border:0 none !important;
+    font-size:1px !important;
+    line-height:1px !important;
+    overflow:hidden;
+    zoom:1;
+    background:transparent !important;
+    width:1px;
+}
+
+.x-clear {
+    clear:both;
+    height:0;
+    overflow:hidden;
+    line-height:0;
+    font-size:0;
+}
+
+.x-taskbuttons-scrolling {
+	position:relative;
+}
+
+.x-taskbuttons-scrolling .ux-taskbuttons-strip-wrap {
+	margin-left:18px;
+	margin-right:18px;
+}
+td.ux-taskButtons-edge {
+    /*float:left;*/
+    margin:0 !important;
+    padding:0 !important;
+    border:0 none !important;
+    font-size:1px !important;
+    line-height:1px !important;
+    overflow:hidden;
+    zoom:1;
+    background:transparent !important;
+    width:1px;
+}
+.ux-taskbuttons-scroller-left {
+    background: transparent url(../images/default/taskbar/scroll-left.gif) no-repeat -18px 0;
+    width:18px;
+    position:absolute;
+    left:1px;
+    top:0px;
+    z-index:10;
+    cursor:pointer;
+}
+.ux-taskbuttons-scroller-left-over {
+    background-position: 0 0;
+}
+.ux-taskbuttons-scroller-left-disabled {
+    background-position: -18px 0;
+    opacity:.5;
+    -moz-opacity:.5;
+    filter:alpha(opacity=50);
+    cursor:default;
+}
+.ux-taskbuttons-scroller-right {
+    background: transparent url(../images/default/taskbar/scroll-right.gif) no-repeat 0 0;
+    width:18px;
+    position:absolute;
+    right:0;
+    top:0px;
+    z-index:10;
+    cursor:pointer;
+}
+.ux-taskbuttons-scroller-right-over {
+    background-position: -18px 0;
+}
+.ux-taskbuttons-scroller-right-disabled {
+    background-position: 0 0;
+    opacity:.5;
+    -moz-opacity:.5;
+    filter:alpha(opacity=50);
+    cursor:default;
+}
+
+.ux-toolmenu-sep {
+	background-color:#18191a;
+	border-bottom:1px solid #858789;
+	display:block;
+	font-size:1px;
+	line-height:1px;
+	margin:2px 3px;
+}
+
+.x-menu .ux-start-menu-apps-panel a.x-menu-item {
+	color:#000000 !important;	
+}
+
+.ux-start-menu-tools-panel ul.x-menu-list li.x-menu-list-item a.x-menu-item {
+	color:#ffffff;
+}
+
+.ux-start-menu-tools-panel ul.x-menu-list li.x-menu-list-item .x-menu-item-active a.x-menu-item {
+	color:#000000;	
+}
+
+.x-window-header-text {
+	cursor:default;
+}
+
+/* Begin: startbutton */
+.start {
+	background-image: url(../images/default/taskbar/startbutton-icon.gif) !important;
+}
+#ux-taskbar-start .x-btn {
+	float: left;
+	margin: 0;
+	padding-left: 8px;
+    position:relative;
+}
+#ux-taskbar-start .x-btn-left, #ux-taskbar-start .x-btn-right{
+	font-size:1px;
+    line-height:1px;
+}
+#ux-taskbar-start .x-btn-left{
+	width:10px;
+		height:30px;
+	background:url(../images/default/taskbar/startbutton.gif) no-repeat 0 0;
+}
+#ux-taskbar-start .x-btn-right{
+	width:10px;
+	height:30px;
+	background:url(../images/default/taskbar/startbutton.gif) no-repeat 0 -28px;
+}
+#ux-taskbar-start .x-btn-left i, #ux-taskbar-start .x-btn-right i{
+	display:block;
+    width:10px;
+    overflow:hidden;
+    font-size:1px;
+    line-height:1px;
+}
+#ux-taskbar-start .x-btn-text-icon .x-btn-center .x-btn-text{
+	background-position: 0 4px;
+	background-repeat: no-repeat;
+	color:#000000 !important;
+	font-weight:bold;
+	padding:8px 0px 8px 28px;
+}
+#ux-taskbar-start .x-btn-center{
+	background:url(../images/default/taskbar/startbutton.gif) repeat-x 0 -56px;
+	vertical-align: middle;
+	text-align:center;
+	padding:0;
+	cursor:pointer;
+	white-space:nowrap;
+}
+#ux-taskbar-start .x-btn-left{ 
+	background-position:0 0;
+}
+#ux-taskbar-start .x-btn-right{
+	background-position:0 -30px;
+}
+#ux-taskbar-start .x-btn-center{
+	background-position:0 -60px;
+}
+#ux-taskbar-start .x-btn-over .x-btn-left{
+	background-position:0 -270px;
+}
+#ux-taskbar-start .x-btn-over  .x-btn-right{
+	background-position:0 -300px;
+}
+#ux-taskbar-start .x-btn-over .x-btn-center{
+	background-position:0 -330px;
+}
+#ux-taskbar-start .x-btn-click .x-btn-left{
+	background-position:0 -180px;
+}
+#ux-taskbar-start .x-btn-click  .x-btn-right{
+	background-position:0 -210px;
+}
+#ux-taskbar-start .x-btn-click .x-btn-center{
+	background-position:0 -240px;
+}
+#ux-taskbar-start .active-win .x-btn-left{
+	background-position:0 -90px;
+}
+#ux-taskbar-start .active-win  .x-btn-right{
+	background:url(../images/default/taskbar/startbutton.gif) no-repeat 0 -120px;
+}
+#ux-taskbar-start .active-win .x-btn-center{
+	background:url(../images/default/taskbar/startbutton.gif) repeat-x 0 -150px;
+}
+#ux-taskbar-start .active-win .x-btn-center button {
+    color:#fff;
+}
+#ux-taskbar-start .x-btn-text-icon .x-btn-with-menu .x-btn-center em {
+	background:transparent none;
+	display:block;
+	padding-right:0;
+}
+/* End: startbutton */
+
+/* Begin QuickStart button */
+#ux-quickstart-panel .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;
+}
+#ux-quickstart-panel .x-btn-left, #ux-quickstart-panel .x-btn-right{
+	font-size:1px;
+    line-height:1px;
+}
+#ux-quickstart-panel .x-btn-left{
+	width:4px;
+	height:28px;
+	background:url(../images/default/taskbar/quickstart-button.gif) no-repeat 0 0;
+}
+#ux-quickstart-panel .x-btn-right{
+	width:4px;
+	height:28px;
+	background:url(../images/default/taskbar/quickstart-button.gif) no-repeat 0 -28px;
+}
+#ux-quickstart-panel .x-btn-left i, #ux-quickstart-panel .x-btn-right i{
+	display:block;
+    width:4px;
+    overflow:hidden;
+    font-size:1px;
+    line-height:1px;
+}
+#ux-quickstart-panel .x-btn-center{
+	background:url(../images/default/taskbar/quickstart-button.gif) repeat-x 0 -56px;
+	vertical-align: middle;
+	text-align:center;
+	padding:0;
+	cursor:pointer;
+	white-space:nowrap;
+}
+#ux-quickstart-panel .x-btn-left{ 
+	background-position:0 0;
+}
+#ux-quickstart-panel .x-btn-right{
+	background-position:0 0;
+}
+#ux-quickstart-panel .x-btn-center{
+	background-position:0 0;
+}
+#ux-quickstart-panel .x-btn-over .x-btn-left,
+#ux-quickstart-panel .x-btn-menu-active .x-btn-left{
+	background-position:0 -250px;
+}
+#ux-quickstart-panel .x-btn-over  .x-btn-right,
+#ux-quickstart-panel .x-btn-menu-active .x-btn-right{
+	background-position:0 -279px;
+}
+#ux-quickstart-panel .x-btn-over .x-btn-center,
+#ux-quickstart-panel .x-btn-menu-active .x-btn-center{
+	background-position:0 -308px;
+}
+#ux-quickstart-panel .x-btn-click .x-btn-left{
+	background-position:0 -163px;
+}
+#ux-quickstart-panel .x-btn-click  .x-btn-right{
+	background-position:0 -192px;
+}
+#ux-quickstart-panel .x-btn-click .x-btn-center{
+	background-position:0 -221px;
+}
+#ux-quickstart-panel .active-win .x-btn-left{
+	background-position:0 -84px;
+}
+#ux-quickstart-panel .active-win  .x-btn-right{
+	background-position:0 -112px;
+}
+#ux-quickstart-panel .active-win .x-btn-center{
+	background-position:0 -140px;
+}
+/* End: QuickStart button */
+ 
+ 
+ 
+/* Begin: quickstart menubutton */
+.ux-quickstart-menubutton-wrap {
+    position:absolute;
+    right:0;
+    top:0px;
+    z-index:10;
+}
+#ux-quickstart-panel .x-btn-with-menu .x-btn-center em {
+	background-image: url(../images/default/taskbar/quickstart-menubutton-icon.gif) !important;
+	display:block;
+	padding-right:0;
+}
+#ux-quickstart-panel .x-btn-with-menu .x-btn-center {
+	padding-right:0 !important;
+}
+/* End: quickstart menubutton */
+ 
+ 
+ 
+/* Begin: Start Menu Tool */
+.ux-start-menu-tools-panel .x-btn-over {
+	background:transparent none;
+	border-color:transparent;
+}
+.ux-start-menu-tools-panel .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;
+}
+.ux-start-menu-tools-panel .x-btn-icon .x-btn-center{
+	padding:1px;
+}
+.ux-start-menu-tools-panel .x-btn-text-icon .x-btn-center .x-btn-text{
+	background-position: 0 6px;
+	background-repeat: no-repeat;
+	padding:7px 0px 7px 20px;
+}
+.ux-start-menu-tools-panel .x-btn .x-btn-center .x-btn-text {
+	color:#ffffff;
+	padding:6px 0px;
+	text-align:left;
+}
+.ux-start-menu-tools-panel .x-btn-left{
+	width:10px;
+	background:url(../images/default/startmenu/start-menu-tool.png) no-repeat 0 -81px;
+}
+.ux-start-menu-tools-panel .x-btn-over .x-btn-left{
+	background-position:0 0;
+}
+.ux-start-menu-tools-panel .x-btn-right{
+	width:10px;
+	background:url(../images/default/startmenu/start-menu-tool.png) no-repeat 0 -81px;
+}
+.ux-start-menu-tools-panel .x-btn-over .x-btn-right{
+	background-position:0 -27px;
+}
+.ux-start-menu-tools-panel .x-btn-left i, .ux-start-menu-tools-panel .x-btn-right i{
+    width:10px;
+}
+.ux-start-menu-tools-panel .x-btn-center{
+	background:url(../images/default/startmenu/start-menu-tool.png) repeat-x 0 -81px;
+	cursor:pointer;
+	padding:0 5px 0 0;
+	text-align:left;
+	vertical-align:bottom;
+	white-space:nowrap;
+}
+.ux-start-menu-tools-panel .x-btn-over .x-btn-center{
+	background-position:0 -54px;
+}
+/* End: Start Menu Tool */
+
+.x-resizable-proxy{
+    background:#C7DFFC;
+    opacity:.5;
+    -moz-opacity:.5;
+    filter:alpha(opacity=50);
+    border: 1px solid #3b5a82;
+}
+ 
+/* Begin: shortcuts */
+.ux-shortcut-item {
+	font:normal 10px tahoma,arial,verdana,sans-serif;
+	height:74px;
+	overflow:hidden;
+	position:absolute;
+	text-align:center;
+	width:64px;
+}
+.ux-shortcut-btn {
+	cursor:pointer;
+    width:64px;
+}
+.ux-shortcut-btn-text {
+    width:100%;
+    color:#000000;
+    overflow:hidden;
+    text-overflow:ellipsis;
+    cursor:pointer;
+}
+.ext-ie .ux-shortcut-btn img {
+    background:transparent !important;
+}
+.ux-shortcut-btn img {
+	width:48px !important;
+    height:48px !important;
+}
+/* End: shortcuts */
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/css/eos.jpg
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/css/eos.jpg
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/accordian.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/accordian.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/bogus.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/bogus.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/caution.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/caution.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/clock.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/clock.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/download.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/download.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/gears.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/gears.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/grid.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/grid.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/grid48x48.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/grid48x48.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/grid48x48.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/grid48x48.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/hourglass.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/hourglass.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/icon_padlock.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/icon_padlock.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/icons-bg.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/icons-bg.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/im48x48.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/im48x48.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/im48x48.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/im48x48.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/info.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/info.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/logout.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/logout.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/member.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/member.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/quote.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/quote.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/tabs.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/tabs.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/working.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/icons/working.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/menu/menu.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/menu/menu.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/s.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/s.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/startmenu/app-item-over.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/startmenu/app-item-over.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/startmenu/left-corners.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/startmenu/left-corners.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/startmenu/left-right.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/startmenu/left-right.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/startmenu/right-corners.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/startmenu/right-corners.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/startmenu/right.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/startmenu/right.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/startmenu/submenu16x16.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/startmenu/submenu16x16.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/startmenu/top-bottom.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/startmenu/top-bottom.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/startmenu/vista-blue-window.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/startmenu/vista-blue-window.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/taskbar/quickstart-button.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/taskbar/quickstart-button.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/taskbar/quickstart-menubutton-icon.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/taskbar/quickstart-menubutton-icon.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/taskbar/quickstart-menubutton.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/taskbar/quickstart-menubutton.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/taskbar/scroll-left.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/taskbar/scroll-left.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/taskbar/scroll-right.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/taskbar/scroll-right.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/taskbar/startbutton-icon.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/taskbar/startbutton-icon.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/taskbar/startbutton.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/taskbar/startbutton.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/taskbar/taskbar-split-h.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/taskbar/taskbar-split-h.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/taskbar/taskbar-start-panel-bg.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/taskbar/taskbar-start-panel-bg.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/taskbar/taskbutton.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/taskbar/taskbutton.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/taskbar/taskbuttons-panel-bg.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/images/default/taskbar/taskbuttons-panel-bg.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/css/xtheme-vistablack.css
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/css/xtheme-vistablack.css	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/css/xtheme-vistablack.css	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,418 @@
+/*
+ * qWikiOffice Desktop 0.7
+ * Copyright(c) 2007-2008, Integrated Technologies, Inc.
+ * licensing@xxxxxxxxxxxxxxx
+ * 
+ * http://www.qwikioffice.com/license
+ */
+
+/* Begin: accordion */
+.x-accordion-hd {
+	background:#f1f1f1 none;
+}
+/* End: accordion */
+
+
+
+/* Begin: button */
+.x-btn-left {
+	background:url(../images/button/btn-sprite.gif) no-repeat 0 0;
+}
+.x-btn-right {
+	background:url(../images/button/btn-sprite.gif) no-repeat 0 -21px;
+}
+.x-btn-center {
+	background:url(../images/button/btn-sprite.gif) repeat-x 0 -42px;
+}
+/* End: button */
+
+
+
+/* Begin: layout */
+.x-layout-collapsed {
+	border:0 none;
+}
+.x-layout-split {
+	background-color:#222;
+}
+.x-layout-collapsed {
+	background-color:#222;
+}
+/* End: layout */
+
+
+
+/* Begin: message box */
+.x-window-dlg .desktop-download {
+	background:transparent url(../images/icons/download.gif) no-repeat top left;
+	height:46px;
+}
+.x-window-dlg .x-window-body {
+	background:#44474b none !important;
+	color:#ccc;
+}
+/* End: message box */
+
+
+
+/* Begin: quickstart button */
+#ux-quickstart-panel .x-btn-left{
+	background:url(../images/taskbar/quickstart-button.gif) no-repeat 0 0;
+}
+#ux-quickstart-panel .x-btn-right{
+	background:url(../images/taskbar/quickstart-button.gif) no-repeat 0 0;
+}
+#ux-quickstart-panel .x-btn-center{
+	background:url(../images/taskbar/quickstart-button.gif) repeat-x 0 0;
+}
+/* End: quickstart button */
+
+
+
+/* Begin: panel */
+.x-panel-tl .x-panel-icon, .x-window-tl .x-panel-icon {
+	background-position:0 4px;
+}
+.x-panel-header {
+	background:#000 url(../images/panel/header-bg.gif) repeat-x;
+	border:0px none;
+	color:#fff;
+	padding:5px 3px 5px 5px;
+}
+.x-panel-body {
+	border-color:#a0a0a0;
+}
+.x-panel-footer {
+	background-color:#f1f1f1;
+	border-top:1px solid #ccc;
+}
+/* End: panel */
+
+
+
+/* Begin: startbutton */
+.start {
+	background-image: url(../images/taskbar/startbutton-icon.gif) !important;
+}
+#ux-taskbar-start .x-btn-left{
+	background:url(../images/taskbar/startbutton.gif) no-repeat 0 0;
+}
+#ux-taskbar-start .x-btn-right{
+	background:url(../images/taskbar/startbutton.gif) no-repeat 0 -30px;
+}
+#ux-taskbar-start .x-btn-center{
+	background:url(../images/taskbar/startbutton.gif) repeat-x 0 -60px;
+}
+#ux-taskbar-start .active-win  .x-btn-right{
+	background:url(../images/taskbar/startbutton.gif) no-repeat 0 -120px;
+}
+#ux-taskbar-start .active-win .x-btn-center{
+	background:url(../images/taskbar/startbutton.gif) repeat-x 0 -150px;
+}
+/* End: startbutton */
+
+
+
+/* Begin: startmenu */
+.ux-start-menu-tl {
+	background: transparent url(../images/startmenu/left-corners.png) no-repeat 0 0;
+}
+.ux-start-menu-tr {
+	background: transparent url(../images/startmenu/right-corners.png) no-repeat right 0;
+}
+.ux-start-menu-tc {
+	background: transparent url(../images/startmenu/top-bottom.png) repeat-x 0 0;
+}
+.ux-start-menu-ml {
+	background: transparent url(../images/startmenu/left-right.png) repeat-y 0 0;
+}
+.ux-start-menu-bc {
+	background: transparent url(../images/startmenu/top-bottom.png) repeat-x 0 bottom;
+}
+.ux-start-menu-bl {
+	background: transparent url(../images/startmenu/left-corners.png) no-repeat 0 bottom;
+}
+.ux-start-menu-br {
+	background: transparent url(../images/startmenu/right-corners.png) no-repeat right bottom;
+}
+.ux-start-menu-tools-panel {
+	background:transparent url(../images/startmenu/right.png) repeat-y scroll right 0pt;
+}
+.ux-start-menu-apps-panel {
+	border:1px solid #1e2124;
+}
+.ux-start-menu-apps-panel .x-menu-item-active {
+	background: #f5f8fb url(../images/startmenu/app-item-over.gif) repeat-x left bottom !important;
+	border:
+}
+/* End: startmenu */
+
+
+
+/* Begin: startmenu tool */
+/*
+.ux-start-menu-tools-panel .x-btn-left{
+	background:url(../images/startmenu/tool.png) no-repeat 0 -81px;
+}
+.ux-start-menu-tools-panel .x-btn-right{
+	background:url(../images/startmenu/tool.png) no-repeat 0 -81px;
+}
+.ux-start-menu-tools-panel .x-btn-center{
+	background:url(../images/startmenu/tool.png) repeat-x 0 -81px;
+}
+*/
+.ux-start-menu-tools-panel .x-menu-item-active {
+	background:transparent url(../images/startmenu/tool.png) repeat-x;
+	border:1px solid #999;
+}
+/* End: startmenu tool */
+
+
+
+/* Begin: tabs */
+.x-tab-panel-header {
+	border:0px none;
+	border-bottom:1px solid #a0a0a0;
+}
+.x-tab-panel-header, .x-tab-panel-footer {
+	background:#ececec none;
+}
+ul.x-tab-strip-top {
+	background:#ececec url(../images/tabs/tab-strip-bg.gif) repeat-x;
+	border-bottom:1px solid #a0a0a0;
+}
+.x-tab-strip-top .x-tab-right {
+	background:transparent url(../images/tabs/tabs-sprite.gif) no-repeat 0 -51px;padding-left:10px;
+}
+.x-tab-strip-top .x-tab-left {
+	background:transparent url(../images/tabs/tabs-sprite.gif) no-repeat right -351px;
+	padding-right:10px;
+}
+.x-tab-strip-top .x-tab-strip-inner {
+	background:transparent url(../images/tabs/tabs-sprite.gif) repeat-x 0 -201px;
+}
+.x-tab-strip span.x-tab-strip-text {
+	color:#333;
+}
+.x-tab-strip-active span.x-tab-strip-text {
+	color:#000;
+}
+.x-tab-panel-body {
+	border-color:#ccc;
+}
+.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close {
+	background-image:url(../images/tabs/tab-close.gif);
+}
+.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close:hover {
+	background-image:url(../images/tabs/tab-close.gif);
+}
+/* End: tabs */
+
+
+
+/* Begin: taskbar */
+#ux-taskbar-start {
+	background:transparent url(../images/taskbar/taskbar-start-panel-bg.gif) repeat-x left top;
+}
+#ux-quickstart-panel {
+	background:transparent url(../images/taskbar/taskbar-start-panel-bg.gif) repeat-x left top;
+}
+#ux-taskbuttons-panel {
+	background:transparent url(../images/taskbar/taskbuttons-panel-bg.gif) repeat-x left top;
+}
+#ux-taskbar .x-splitbar-h {
+	background:transparent url(../images/taskbar/taskbar-split-h.gif) no-repeat 0 0;
+	width:14px;
+}
+/* End: taskbar */
+
+
+
+/* Begin: taskbutton */
+#ux-taskbuttons-panel .x-btn-left{
+	background:url(../images/taskbar/taskbutton.gif) no-repeat 0 0;
+}
+#ux-taskbuttons-panel .x-btn-right{
+	background:url(../images/taskbar/taskbutton.gif) no-repeat 0 -28px;
+}
+#ux-taskbuttons-panel .x-btn-center{
+	background:url(../images/taskbar/taskbutton.gif) repeat-x 0 -56px;
+}
+/* End: taskbutton */
+
+
+
+/* Begin: toolbar */
+.x-toolbar {
+	background:#ececec url(../images/toolbar/gray-bg.gif) repeat-x !important;
+}
+.x-window-bbar .x-toolbar {
+	border:1px solid #222;
+	border-top:1px solid #a0a0a0 !important;
+}
+.x-panel-bbar .x-toolbar {
+	border:1px solid #999;
+	border-top:1px solid #a0a0a0 !important;
+}
+.x-window-tbar .x-toolbar {
+	border:1px solid #222;
+	border-bottom:1px solid #a0a0a0 !important;
+}
+.x-panel-tbar .x-toolbar {
+	border-bottom:1px solid #a0a0a0 !important;
+	border-left:0 none;
+	border-right:0 none;
+}
+.x-panel-tbar-noheader .x-toolbar, .x-panel-mc .x-panel-tbar .x-toolbar {
+	border-bottom:0 none;
+	border-top:1px solid #222;
+}
+.x-toolbar .x-btn-over .x-btn-left{
+	/* background:url(../images/toolbar/tb-btn-sprite.gif) no-repeat 0 0px; */
+	background:#3399ff none;
+}
+.x-toolbar .x-btn-over .x-btn-right{
+	/* background:url(../images/toolbar/tb-btn-sprite.gif) no-repeat 0 -21px; */
+	background:#3399ff none;
+}
+.x-toolbar .x-btn-over .x-btn-center{
+	/* background:url(../images/toolbar/tb-btn-sprite.gif) repeat-x 0 -42px; */
+	background:#3399ff none;
+}
+.x-toolbar .x-btn-over .x-btn-text {
+	color:#fff;
+}
+/*.x-window-tbar .x-toolbar {
+	background:#a5acb4 url(../images/toolbar/bg.gif) repeat-x !important;
+	border:1px solid #222;
+	border-bottom:0px none !important;
+}
+.x-window-bbar .x-toolbar {
+	background:#a5acb4 url(../images/toolbar/bg.gif) repeat-x !important;
+	border:1px solid #222;
+	border-top:0px none !important;
+}*/
+.x-toolbar .ytb-sep {
+	background-image:url(../images/grid/grid-split.gif);
+}
+/* End: toolbar */
+
+
+
+/* Begin: window */
+.x-tool {
+	background-image:url(../images/window/tool-sprites.gif);
+}
+.x-window-tl .x-window-header {
+	color:#ffffff;
+}
+.x-window-tl {
+	background: transparent url(../images/window/left-corners.png) no-repeat 0 0;
+	padding-left:6px;
+    zoom:1;
+    z-index:1;
+    position:relative;
+}
+.x-window-tl .x-window-header {
+	padding-bottom:2px;
+	padding-top:1px;
+}
+.x-window-header-text {
+	line-height:21px;;
+}
+.x-window-tc {
+	background: transparent url(../images/window/top-bottom.png) repeat-x 0 0;
+	overflow:hidden;
+    zoom:1;
+}
+.x-window-tr {
+	background: transparent url(../images/window/right-corners.png) no-repeat right 0;
+	padding-right:6px;
+}
+.x-window-bl {
+	background: transparent url(../images/window/left-corners.png) no-repeat 0 bottom;
+	padding-left:6px;
+    zoom:1;
+}
+.x-window-bc {
+	background: transparent url(../images/window/top-bottom.png) repeat-x 0 bottom;
+    zoom:1;
+}
+.x-window-br {
+	background: transparent url(../images/window/right-corners.png) no-repeat right bottom;
+	padding-right:6px;
+    zoom:1;
+}
+.x-window-ml {
+	background: transparent url(../images/window/left-right.png) repeat-y 0 0;
+	padding-left:6px;
+    zoom:1;
+}
+.x-window-mr {
+	background: transparent url(../images/window/left-right.png) repeat-y right 0;
+	padding-right:6px;
+    zoom:1;
+}
+.x-window-mc, .x-window-plain .x-window-mc {
+	background:#fff none !important;
+	border:1px solid #999;
+}
+.x-window-body {
+	border:1px solid #222 !important;
+}
+.x-window-maximized .x-window-mc {
+	border-bottom:0 none !important;
+	border-left:0 none !important;
+	border-right:0 none !important;
+}
+.x-window-proxy {
+	background:#333 none;
+}
+.x-window-header .x-tool {
+	background:transparent url(../images/window/ux-tools.gif) no-repeat;
+	margin-left:0;
+}
+.x-window-header .x-tool-minimize {
+	background-position:0px 0px;
+	height:18px;
+	width:27px;
+}
+.x-window-header .x-tool-minimize-over {
+	background-position:0px -18px;
+}
+.x-window-header .x-tool-maximize,
+.x-window-header .x-tool-restore {
+	background-position:-27px 0px;
+	height:18px;
+	width:24px;
+}
+.x-window-header .x-tool-maximize-over,
+.x-window-header .x-tool-restore-over {
+	background-position:-27px -18px;
+}
+.x-window-header .x-tool-close {
+	background-position:-51px 0px;
+	height:18px;
+	width:44px;
+}
+.x-window-header .x-tool-close-over {
+	background-position:-51px -18px;
+}
+.x-panel-ghost {
+    background:#333;
+    z-index:12000;
+    overflow:hidden;
+    position:absolute;
+    left:0;top:0;
+    opacity:.65;
+    -moz-opacity:.65;
+    filter:alpha(opacity=65);
+}
+.x-panel-ghost .x-window-tl {
+    border-bottom:1px solid #222;
+}
+.x-panel-ghost ul {
+    border:1px solid #222;
+    border-top:0 none;
+}
+/* End: window */
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/button/btn-arrow.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/button/btn-arrow.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/button/btn-sprite.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/button/btn-sprite.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/grid/grid-split.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/grid/grid-split.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/icons/download.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/icons/download.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/icons/pref-wallpapers.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/icons/pref-wallpapers.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/icons/pref-wallpapers.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/icons/pref-wallpapers.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/icons/preferences.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/icons/preferences.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/panel/header-bg.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/panel/header-bg.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/panel/tool-sprites.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/panel/tool-sprites.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/startmenu/app-item-over.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/startmenu/app-item-over.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/startmenu/left-corners.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/startmenu/left-corners.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/startmenu/left-right.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/startmenu/left-right.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/startmenu/right-corners.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/startmenu/right-corners.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/startmenu/right.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/startmenu/right.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/startmenu/tool.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/startmenu/tool.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/startmenu/top-bottom.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/startmenu/top-bottom.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/tabs/tab-strip-bg.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/tabs/tab-strip-bg.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/tabs/tabs-sprite.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/tabs/tabs-sprite.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/taskbar/quickstart-button.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/taskbar/quickstart-button.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/taskbar/quickstart-menubutton-icon.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/taskbar/quickstart-menubutton-icon.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/taskbar/quickstart-menubutton.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/taskbar/quickstart-menubutton.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/taskbar/scroll-left.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/taskbar/scroll-left.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/taskbar/scroll-right.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/taskbar/scroll-right.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/taskbar/startbutton-icon.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/taskbar/startbutton-icon.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/taskbar/startbutton.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/taskbar/startbutton.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/taskbar/taskbar-split-h.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/taskbar/taskbar-split-h.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/taskbar/taskbar-start-panel-bg.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/taskbar/taskbar-start-panel-bg.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/taskbar/taskbutton.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/taskbar/taskbutton.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/taskbar/taskbuttons-panel-bg.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/taskbar/taskbuttons-panel-bg.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/toolbar/bg.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/toolbar/bg.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/toolbar/gray-bg.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/toolbar/gray-bg.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/toolbar/tb-btn-sprite.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/toolbar/tb-btn-sprite.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/tree/elbow-end-minus-nl.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/tree/elbow-end-minus-nl.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/tree/elbow-plus-nl.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/tree/elbow-plus-nl.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/tree/folder.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/tree/folder.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/tree/plugin.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/tree/plugin.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/window/left-corners.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/window/left-corners.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/window/left-right.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/window/left-right.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/window/right-corners.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/window/right-corners.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/window/side-panel-bluegreen.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/window/side-panel-bluegreen.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/window/tool-sprites.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/window/tool-sprites.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/window/tool-sprites.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/window/tool-sprites.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/window/top-bottom.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/window/top-bottom.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/window/ux-tools.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/images/window/ux-tools.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/xtheme-vistablack.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablack/xtheme-vistablack.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/css/xtheme-vistablue.css
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/css/xtheme-vistablue.css	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/css/xtheme-vistablue.css	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,418 @@
+/*
+ * qWikiOffice Desktop 0.7
+ * Copyright(c) 2007-2008, Integrated Technologies, Inc.
+ * licensing@xxxxxxxxxxxxxxx
+ * 
+ * http://www.qwikioffice.com/license
+ */
+
+/* Begin: accordion */
+.x-accordion-hd {
+	background:#f1f1f1 none;
+}
+/* End: accordion */
+
+
+
+/* Begin: button */
+.x-btn-left {
+	background:url(../images/button/btn-sprite.gif) no-repeat 0 0;
+}
+.x-btn-right {
+	background:url(../images/button/btn-sprite.gif) no-repeat 0 -21px;
+}
+.x-btn-center {
+	background:url(../images/button/btn-sprite.gif) repeat-x 0 -42px;
+}
+/* End: button */
+
+
+
+/* Begin: layout */
+.x-layout-collapsed {
+	border:0 none;
+}
+.x-layout-split {
+	background-color:#222;
+}
+.x-layout-collapsed {
+	background-color:#222;
+}
+/* End: layout */
+
+
+
+/* Begin: message box */
+.x-window-dlg .desktop-download {
+	background:transparent url(../images/icons/download.gif) no-repeat top left;
+	height:46px;
+}
+.x-window-dlg .x-window-body {
+	background:#7f99ba none !important;
+	color:#ccc;
+}
+/* End: message box */
+
+
+
+/* Begin: quickstart button */
+#ux-quickstart-panel .x-btn-left{
+	background:url(../images/taskbar/quickstart-button.gif) no-repeat 0 0;
+}
+#ux-quickstart-panel .x-btn-right{
+	background:url(../images/taskbar/quickstart-button.gif) no-repeat 0 0;
+}
+#ux-quickstart-panel .x-btn-center{
+	background:url(../images/taskbar/quickstart-button.gif) repeat-x 0 0;
+}
+/* End: quickstart button */
+
+
+
+/* Begin: panel */
+.x-panel-tl .x-panel-icon, .x-window-tl .x-panel-icon {
+	background-position:0 4px;
+}
+.x-panel-header {
+	background:#000 url(../images/panel/header-bg.gif) repeat-x;
+	border:0px none;
+	color:#fff;
+	padding:5px 3px 5px 5px;
+}
+.x-panel-body {
+	border-color:#a0a0a0;
+}
+.x-panel-footer {
+	background-color:#f1f1f1;
+	border-top:1px solid #ccc;
+}
+/* End: panel */
+
+
+
+/* Begin: startbutton */
+.start {
+	background-image: url(../images/taskbar/startbutton-icon.gif) !important;
+}
+#ux-taskbar-start .x-btn-left{
+	background:url(../images/taskbar/startbutton.gif) no-repeat 0 0;
+}
+#ux-taskbar-start .x-btn-right{
+	background:url(../images/taskbar/startbutton.gif) no-repeat 0 -30px;
+}
+#ux-taskbar-start .x-btn-center{
+	background:url(../images/taskbar/startbutton.gif) repeat-x 0 -60px;
+}
+#ux-taskbar-start .active-win  .x-btn-right{
+	background:url(../images/taskbar/startbutton.gif) no-repeat 0 -120px;
+}
+#ux-taskbar-start .active-win .x-btn-center{
+	background:url(../images/taskbar/startbutton.gif) repeat-x 0 -150px;
+}
+/* End: startbutton */
+
+
+
+/* Begin: startmenu */
+.ux-start-menu-tl {
+	background: transparent url(../images/startmenu/left-corners.png) no-repeat 0 0;
+}
+.ux-start-menu-tr {
+	background: transparent url(../images/startmenu/right-corners.png) no-repeat right 0;
+}
+.ux-start-menu-tc {
+	background: transparent url(../images/startmenu/top-bottom.png) repeat-x 0 0;
+}
+.ux-start-menu-ml {
+	background: transparent url(../images/startmenu/left-right.png) repeat-y 0 0;
+}
+.ux-start-menu-bc {
+	background: transparent url(../images/startmenu/top-bottom.png) repeat-x 0 bottom;
+}
+.ux-start-menu-bl {
+	background: transparent url(../images/startmenu/left-corners.png) no-repeat 0 bottom;
+}
+.ux-start-menu-br {
+	background: transparent url(../images/startmenu/right-corners.png) no-repeat right bottom;
+}
+.ux-start-menu-tools-panel {
+	background:transparent url(../images/startmenu/right.png) repeat-y scroll right 0pt;
+}
+.ux-start-menu-apps-panel {
+	border:1px solid #1e2124;
+}
+.ux-start-menu-apps-panel .x-menu-item-active {
+	background: #f5f8fb url(../images/startmenu/app-item-over.gif) repeat-x left bottom !important;
+	border:
+}
+/* End: startmenu */
+
+
+
+/* Begin: startmenu tool */
+/*
+.ux-start-menu-tools-panel .x-btn-left{
+	background:url(../images/startmenu/tool.png) no-repeat 0 -81px;
+}
+.ux-start-menu-tools-panel .x-btn-right{
+	background:url(../images/startmenu/tool.png) no-repeat 0 -81px;
+}
+.ux-start-menu-tools-panel .x-btn-center{
+	background:url(../images/startmenu/tool.png) repeat-x 0 -81px;
+}
+*/
+.ux-start-menu-tools-panel .x-menu-item-active {
+	background:transparent url(../images/startmenu/tool.png) repeat-x;
+	border:1px solid #a0adc9;
+}
+/* End: startmenu tool */
+
+
+
+/* Begin: tabs */
+.x-tab-panel-header {
+	border:0px none;
+	border-bottom:1px solid #a0a0a0;
+}
+.x-tab-panel-header, .x-tab-panel-footer {
+	background:#ececec none;
+}
+ul.x-tab-strip-top {
+	background:#ececec url(../images/tabs/tab-strip-bg.gif) repeat-x;
+	border-bottom:1px solid #a0a0a0;
+}
+.x-tab-strip-top .x-tab-right {
+	background:transparent url(../images/tabs/tabs-sprite.gif) no-repeat 0 -51px;padding-left:10px;
+}
+.x-tab-strip-top .x-tab-left {
+	background:transparent url(../images/tabs/tabs-sprite.gif) no-repeat right -351px;
+	padding-right:10px;
+}
+.x-tab-strip-top .x-tab-strip-inner {
+	background:transparent url(../images/tabs/tabs-sprite.gif) repeat-x 0 -201px;
+}
+.x-tab-strip span.x-tab-strip-text {
+	color:#333;
+}
+.x-tab-strip-active span.x-tab-strip-text {
+	color:#000;
+}
+.x-tab-panel-body {
+	border-color:#ccc;
+}
+.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close {
+	background-image:url(../images/tabs/tab-close.gif);
+}
+.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close:hover {
+	background-image:url(../images/tabs/tab-close.gif);
+}
+/* End: tabs */
+
+
+
+/* Begin: taskbar */
+#ux-taskbar-start {
+	background:transparent url(../images/taskbar/taskbar-start-panel-bg.gif) repeat-x left top;
+}
+#ux-quickstart-panel {
+	background:transparent url(../images/taskbar/taskbar-start-panel-bg.gif) repeat-x left top;
+}
+#ux-taskbuttons-panel {
+	background:transparent url(../images/taskbar/taskbuttons-panel-bg.gif) repeat-x left top;
+}
+#ux-taskbar .x-splitbar-h {
+	background:transparent url(../images/taskbar/taskbar-split-h.gif) no-repeat 0 0;
+	width:14px;
+}
+/* End: taskbar */
+
+
+
+/* Begin: taskbutton */
+#ux-taskbuttons-panel .x-btn-left{
+	background:url(../images/taskbar/taskbutton.gif) no-repeat 0 0;
+}
+#ux-taskbuttons-panel .x-btn-right{
+	background:url(../images/taskbar/taskbutton.gif) no-repeat 0 -28px;
+}
+#ux-taskbuttons-panel .x-btn-center{
+	background:url(../images/taskbar/taskbutton.gif) repeat-x 0 -56px;
+}
+/* End: taskbutton */
+
+
+
+/* Begin: toolbar */
+.x-toolbar {
+	background:#ececec url(../images/toolbar/gray-bg.gif) repeat-x !important;
+}
+.x-window-bbar .x-toolbar {
+	border:1px solid #222;
+	border-top:1px solid #a0a0a0 !important;
+}
+.x-panel-bbar .x-toolbar {
+	border:1px solid #999;
+	border-top:1px solid #a0a0a0 !important;
+}
+.x-window-tbar .x-toolbar {
+	border:1px solid #222;
+	border-bottom:1px solid #a0a0a0 !important;
+}
+.x-panel-tbar .x-toolbar {
+	border-bottom:1px solid #a0a0a0 !important;
+	border-left:0 none;
+	border-right:0 none;
+}
+.x-panel-tbar-noheader .x-toolbar, .x-panel-mc .x-panel-tbar .x-toolbar {
+	border-bottom:0 none;
+	border-top:1px solid #222;
+}
+.x-toolbar .x-btn-over .x-btn-left{
+	/* background:url(../images/toolbar/tb-btn-sprite.gif) no-repeat 0 0px; */
+	background:#3399ff none;
+}
+.x-toolbar .x-btn-over .x-btn-right{
+	/* background:url(../images/toolbar/tb-btn-sprite.gif) no-repeat 0 -21px; */
+	background:#3399ff none;
+}
+.x-toolbar .x-btn-over .x-btn-center{
+	/* background:url(../images/toolbar/tb-btn-sprite.gif) repeat-x 0 -42px; */
+	background:#3399ff none;
+}
+.x-toolbar .x-btn-over .x-btn-text {
+	color:#fff;
+}
+/*.x-window-tbar .x-toolbar {
+	background:#a5acb4 url(../images/toolbar/bg.gif) repeat-x !important;
+	border:1px solid #222;
+	border-bottom:0px none !important;
+}
+.x-window-bbar .x-toolbar {
+	background:#a5acb4 url(../images/toolbar/bg.gif) repeat-x !important;
+	border:1px solid #222;
+	border-top:0px none !important;
+}*/
+.x-toolbar .ytb-sep {
+	background-image:url(../images/grid/grid-split.gif);
+}
+/* End: toolbar */
+
+
+
+/* Begin: window */
+.x-tool {
+	background-image:url(../images/window/tool-sprites.gif);
+}
+.x-window-tl .x-window-header {
+	color:#ffffff;
+}
+.x-window-tl {
+	background: transparent url(../images/window/left-corners.png) no-repeat 0 0;
+	padding-left:6px;
+    zoom:1;
+    z-index:1;
+    position:relative;
+}
+.x-window-tl .x-window-header {
+	padding-bottom:2px;
+	padding-top:1px;
+}
+.x-window-header-text {
+	line-height:21px;;
+}
+.x-window-tc {
+	background: transparent url(../images/window/top-bottom.png) repeat-x 0 0;
+	overflow:hidden;
+    zoom:1;
+}
+.x-window-tr {
+	background: transparent url(../images/window/right-corners.png) no-repeat right 0;
+	padding-right:6px;
+}
+.x-window-bl {
+	background: transparent url(../images/window/left-corners.png) no-repeat 0 bottom;
+	padding-left:6px;
+    zoom:1;
+}
+.x-window-bc {
+	background: transparent url(../images/window/top-bottom.png) repeat-x 0 bottom;
+    zoom:1;
+}
+.x-window-br {
+	background: transparent url(../images/window/right-corners.png) no-repeat right bottom;
+	padding-right:6px;
+    zoom:1;
+}
+.x-window-ml {
+	background: transparent url(../images/window/left-right.png) repeat-y 0 0;
+	padding-left:6px;
+    zoom:1;
+}
+.x-window-mr {
+	background: transparent url(../images/window/left-right.png) repeat-y right 0;
+	padding-right:6px;
+    zoom:1;
+}
+.x-window-mc, .x-window-plain .x-window-mc {
+	background:#fff none !important;
+	border:1px solid #999;
+}
+.x-window-body {
+	border:1px solid #222 !important;
+}
+.x-window-maximized .x-window-mc {
+	border-bottom:0 none !important;
+	border-left:0 none !important;
+	border-right:0 none !important;
+}
+.x-window-proxy {
+	background:#333 none;
+}
+.x-window-header .x-tool {
+	background:transparent url(../images/window/ux-tools.gif) no-repeat;
+	margin-left:0;
+}
+.x-window-header .x-tool-minimize {
+	background-position:0px 0px;
+	height:18px;
+	width:27px;
+}
+.x-window-header .x-tool-minimize-over {
+	background-position:0px -18px;
+}
+.x-window-header .x-tool-maximize,
+.x-window-header .x-tool-restore {
+	background-position:-27px 0px;
+	height:18px;
+	width:24px;
+}
+.x-window-header .x-tool-maximize-over,
+.x-window-header .x-tool-restore-over {
+	background-position:-27px -18px;
+}
+.x-window-header .x-tool-close {
+	background-position:-51px 0px;
+	height:18px;
+	width:44px;
+}
+.x-window-header .x-tool-close-over {
+	background-position:-51px -18px;
+}
+.x-panel-ghost {
+    background:#333;
+    z-index:12000;
+    overflow:hidden;
+    position:absolute;
+    left:0;top:0;
+    opacity:.65;
+    -moz-opacity:.65;
+    filter:alpha(opacity=65);
+}
+.x-panel-ghost .x-window-tl {
+    border-bottom:1px solid #222;
+}
+.x-panel-ghost ul {
+    border:1px solid #222;
+    border-top:0 none;
+}
+/* End: window */
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/button/btn-arrow.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/button/btn-arrow.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/button/btn-sprite.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/button/btn-sprite.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/grid/grid-split.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/grid/grid-split.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/icons/download.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/icons/download.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/panel/header-bg.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/panel/header-bg.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/panel/tool-sprites.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/panel/tool-sprites.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/startmenu/app-item-over.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/startmenu/app-item-over.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/startmenu/left-corners.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/startmenu/left-corners.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/startmenu/left-right.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/startmenu/left-right.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/startmenu/right-corners.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/startmenu/right-corners.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/startmenu/right.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/startmenu/right.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/startmenu/tool.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/startmenu/tool.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/startmenu/tool.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/startmenu/tool.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/startmenu/top-bottom.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/startmenu/top-bottom.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/tabs/tab-strip-bg.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/tabs/tab-strip-bg.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/tabs/tabs-sprite.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/tabs/tabs-sprite.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/taskbar/quickstart-button.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/taskbar/quickstart-button.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/taskbar/quickstart-menubutton-icon.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/taskbar/quickstart-menubutton-icon.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/taskbar/scroll-left.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/taskbar/scroll-left.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/taskbar/scroll-right.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/taskbar/scroll-right.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/taskbar/startbutton-icon.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/taskbar/startbutton-icon.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/taskbar/startbutton.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/taskbar/startbutton.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/taskbar/taskbar-split-h.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/taskbar/taskbar-split-h.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/taskbar/taskbar-start-panel-bg.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/taskbar/taskbar-start-panel-bg.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/taskbar/taskbutton.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/taskbar/taskbutton.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/taskbar/taskbuttons-panel-bg.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/taskbar/taskbuttons-panel-bg.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/toolbar/bg.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/toolbar/bg.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/toolbar/gray-bg.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/toolbar/gray-bg.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/toolbar/tb-btn-sprite.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/toolbar/tb-btn-sprite.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/tree/elbow-end-minus-nl.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/tree/elbow-end-minus-nl.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/tree/elbow-plus-nl.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/tree/elbow-plus-nl.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/tree/folder.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/tree/folder.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/window/left-corners.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/window/left-corners.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/window/left-right.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/window/left-right.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/window/right-corners.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/window/right-corners.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/window/tool-sprites.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/window/tool-sprites.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/window/tool-sprites.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/window/tool-sprites.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/window/top-bottom.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/window/top-bottom.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/window/ux-tools.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/images/window/ux-tools.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/xtheme-vistablue.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistablue/xtheme-vistablue.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/css/xtheme-vistaglass.css
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/css/xtheme-vistaglass.css	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/css/xtheme-vistaglass.css	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,425 @@
+/*
+ * qWikiOffice Desktop 0.7
+ * Copyright(c) 2007-2008, Integrated Technologies, Inc.
+ * licensing@xxxxxxxxxxxxxxx
+ * 
+ * http://www.qwikioffice.com/license
+ */
+
+/* Begin: accordion */
+.x-accordion-hd {
+	background:#f1f1f1 none;
+}
+/* End: accordion */
+
+
+
+/* Begin: button */
+.x-btn-left {
+	background:url(../images/button/btn-sprite.gif) no-repeat 0 0;
+}
+.x-btn-right {
+	background:url(../images/button/btn-sprite.gif) no-repeat 0 -21px;
+}
+.x-btn-center {
+	background:url(../images/button/btn-sprite.gif) repeat-x 0 -42px;
+}
+/* End: button */
+
+
+
+/* Begin: layout */
+.x-layout-collapsed {
+	border:0 none;
+}
+.x-layout-split {
+	background-color:#222;
+}
+.x-layout-collapsed {
+	background-color:#222;
+}
+/* End: layout */
+
+
+
+/* Begin: message box */
+.x-window-dlg .desktop-download {
+	background:transparent url(../images/icons/download.gif) no-repeat top left;
+	height:46px;
+}
+.x-window-dlg .x-window-body {
+	background:#44474b none !important;
+	color:#ccc;
+}
+/* End: message box */
+
+
+
+/* Begin: quickstart button */
+#ux-quickstart-panel .x-btn-left{
+	background:url(../images/taskbar/quickstart-button.gif) no-repeat 0 0;
+}
+#ux-quickstart-panel .x-btn-right{
+	background:url(../images/taskbar/quickstart-button.gif) no-repeat 0 0;
+}
+#ux-quickstart-panel .x-btn-center{
+	background:url(../images/taskbar/quickstart-button.gif) repeat-x 0 0;
+}
+/* End: quickstart button */
+
+
+
+/* Begin: panel */
+.x-panel-tl .x-panel-icon, .x-window-tl .x-panel-icon {
+	background-position:0 4px;
+}
+.x-panel-header {
+	background:#000 url(../images/panel/header-bg.gif) repeat-x;
+	border:0px none;
+	color:#fff;
+	padding:5px 3px 5px 5px;
+}
+.x-panel-body {
+	border-color:#a0a0a0;
+}
+.x-panel-footer {
+	background-color:#f1f1f1;
+	border-top:1px solid #ccc;
+}
+/* End: panel */
+
+
+
+/* Begin: startbutton */
+.start {
+	background-image: url(../images/taskbar/startbutton-icon.gif) !important;
+}
+#ux-taskbar-start .x-btn-left{
+	background:url(../images/taskbar/startbutton.gif) no-repeat 0 0;
+}
+#ux-taskbar-start .x-btn-right{
+	background:url(../images/taskbar/startbutton.gif) no-repeat 0 -30px;
+}
+#ux-taskbar-start .x-btn-center{
+	background:url(../images/taskbar/startbutton.gif) repeat-x 0 -60px;
+}
+#ux-taskbar-start .active-win  .x-btn-right{
+	background:url(../images/taskbar/startbutton.gif) no-repeat 0 -120px;
+}
+#ux-taskbar-start .active-win .x-btn-center{
+	background:url(../images/taskbar/startbutton.gif) repeat-x 0 -150px;
+}
+/* End: startbutton */
+
+
+
+/* Begin: startmenu */
+.ux-start-menu-tl {
+	background: transparent url(../images/startmenu/left-corners.png) no-repeat 0 0;
+}
+.ux-start-menu-tr {
+	background: transparent url(../images/startmenu/right-corners.png) no-repeat right 0;
+}
+.ux-start-menu-tc {
+	background: transparent url(../images/startmenu/top-bottom.png) repeat-x 0 0;
+}
+.ux-start-menu-ml {
+	background: transparent url(../images/startmenu/left-right.png) repeat-y 0 0;
+}
+.ux-start-menu-bc {
+	background: transparent url(../images/startmenu/top-bottom.png) repeat-x 0 bottom;
+}
+.ux-start-menu-bl {
+	background: transparent url(../images/startmenu/left-corners.png) no-repeat 0 bottom;
+}
+.ux-start-menu-br {
+	background: transparent url(../images/startmenu/right-corners.png) no-repeat right bottom;
+}
+.ux-start-menu-tools-panel {
+	background:transparent url(../images/startmenu/right.png) repeat-y scroll right 0pt;
+}
+.ux-start-menu-apps-panel {
+	border:1px solid #1e2124;
+}
+.ux-start-menu-apps-panel .x-menu-item-active {
+	background: #f5f8fb url(../images/startmenu/app-item-over.gif) repeat-x left bottom !important;
+	border:
+}
+/* End: startmenu */
+
+
+
+/* Begin: startmenu tool */
+/*
+.ux-start-menu-tools-panel .x-btn-left{
+	background:url(../images/startmenu/tool.png) no-repeat 0 -81px;
+}
+.ux-start-menu-tools-panel .x-btn-right{
+	background:url(../images/startmenu/tool.png) no-repeat 0 -81px;
+}
+.ux-start-menu-tools-panel .x-btn-center{
+	background:url(../images/startmenu/tool.png) repeat-x 0 -81px;
+}
+*/
+.ux-start-menu-tools-panel .x-menu-item-active {
+	background:transparent url(../images/startmenu/tool.png) repeat-x;
+	border:1px solid #eee;
+}
+/* End: startmenu tool */
+
+
+
+/* Begin: tabs */
+.x-tab-panel-header {
+	border:0px none;
+	border-bottom:1px solid #a0a0a0;
+}
+.x-tab-panel-header, .x-tab-panel-footer {
+	background:#ececec none;
+}
+ul.x-tab-strip-top {
+	background:#ececec url(../images/tabs/tab-strip-bg.gif) repeat-x;
+	border-bottom:1px solid #a0a0a0;
+}
+.x-tab-strip-top .x-tab-right {
+	background:transparent url(../images/tabs/tabs-sprite.gif) no-repeat 0 -51px;padding-left:10px;
+}
+.x-tab-strip-top .x-tab-left {
+	background:transparent url(../images/tabs/tabs-sprite.gif) no-repeat right -351px;
+	padding-right:10px;
+}
+.x-tab-strip-top .x-tab-strip-inner {
+	background:transparent url(../images/tabs/tabs-sprite.gif) repeat-x 0 -201px;
+}
+.x-tab-strip span.x-tab-strip-text {
+	color:#333;
+}
+.x-tab-strip-active span.x-tab-strip-text {
+	color:#000;
+}
+.x-tab-panel-body {
+	border-color:#ccc;
+}
+.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close {
+	background-image:url(../images/tabs/tab-close.gif);
+}
+.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close:hover {
+	background-image:url(../images/tabs/tab-close.gif);
+}
+/* End: tabs */
+
+
+
+/* Begin: taskbar */
+#ux-taskbar-start {
+	background:transparent url(../images/taskbar/taskbar-start-panel-bg.gif) repeat-x left top;
+}
+#ux-quickstart-panel {
+	background:transparent url(../images/taskbar/taskbar-start-panel-bg.gif) repeat-x left top;
+}
+#ux-taskbuttons-panel {
+	background:transparent url(../images/taskbar/taskbuttons-panel-bg.gif) repeat-x left top;
+}
+#ux-taskbar .x-splitbar-h {
+	background:transparent url(../images/taskbar/taskbar-split-h.gif) no-repeat 0 0;
+	width:14px;
+}
+/* End: taskbar */
+
+
+
+/* Begin: taskbutton */
+#ux-taskbuttons-panel .x-btn-left{
+	background:url(../images/taskbar/taskbutton.gif) no-repeat 0 0;
+}
+#ux-taskbuttons-panel .x-btn-right{
+	background:url(../images/taskbar/taskbutton.gif) no-repeat 0 -28px;
+}
+#ux-taskbuttons-panel .x-btn-center{
+	background:url(../images/taskbar/taskbutton.gif) repeat-x 0 -56px;
+}
+/* End: taskbutton */
+
+
+
+/* Begin: toolbar */
+.x-toolbar {
+	background:#ececec url(../images/toolbar/gray-bg.gif) repeat-x !important;
+}
+.x-window-bbar .x-toolbar {
+	border:1px solid #222;
+	border-top:1px solid #a0a0a0 !important;
+}
+.x-panel-bbar .x-toolbar {
+	border:1px solid #999;
+	border-top:1px solid #a0a0a0 !important;
+}
+.x-window-tbar .x-toolbar {
+	border:1px solid #222;
+	border-bottom:1px solid #a0a0a0 !important;
+}
+.x-panel-tbar .x-toolbar {
+	border-bottom:1px solid #a0a0a0 !important;
+	border-left:0 none;
+	border-right:0 none;
+}
+.x-panel-tbar-noheader .x-toolbar, .x-panel-mc .x-panel-tbar .x-toolbar {
+	border-bottom:0 none;
+	border-top:1px solid #222;
+}
+.x-toolbar .x-btn-over .x-btn-left{
+	/* background:url(../images/toolbar/tb-btn-sprite.gif) no-repeat 0 0px; */
+	background:#3399ff none;
+}
+.x-toolbar .x-btn-over .x-btn-right{
+	/* background:url(../images/toolbar/tb-btn-sprite.gif) no-repeat 0 -21px; */
+	background:#3399ff none;
+}
+.x-toolbar .x-btn-over .x-btn-center{
+	/* background:url(../images/toolbar/tb-btn-sprite.gif) repeat-x 0 -42px; */
+	background:#3399ff none;
+}
+.x-toolbar .x-btn-over .x-btn-text {
+	color:#fff;
+}
+/*.x-window-tbar .x-toolbar {
+	background:#a5acb4 url(../images/toolbar/bg.gif) repeat-x !important;
+	border:1px solid #222;
+	border-bottom:0px none !important;
+}
+.x-window-bbar .x-toolbar {
+	background:#a5acb4 url(../images/toolbar/bg.gif) repeat-x !important;
+	border:1px solid #222;
+	border-top:0px none !important;
+}*/
+.x-toolbar .ytb-sep {
+	background-image:url(../images/grid/grid-split.gif);
+}
+/* End: toolbar */
+
+
+
+/* Begin: window */
+.x-tool {
+	background-image:url(../images/window/tool-sprites.gif);
+}
+.x-window-tl .x-window-header {
+	color:#ffffff;
+}
+.x-window-tl {
+	background: transparent url(../images/window/left-corners.png) no-repeat 0 0;
+	padding-left:6px;
+    zoom:1;
+    z-index:1;
+    position:relative;
+}
+.x-window-tl .x-window-header {
+	padding-bottom:2px;
+	padding-top:1px;
+}
+.x-window-header-text {
+	line-height:21px;;
+}
+.x-window-maximized .x-window-tc {
+	background-color:#000;
+}
+.x-window-tc {
+	background: transparent url(../images/window/top-bottom.png) repeat-x 0 0;
+	overflow:hidden;
+    zoom:1;
+}
+/* can be used here to add a glass black look
+.x-window-tc {
+	background-color:#000;
+} */
+.x-window-tr {
+	background: transparent url(../images/window/right-corners.png) no-repeat right 0;
+	padding-right:6px;
+}
+.x-window-bl {
+	background: transparent url(../images/window/left-corners.png) no-repeat 0 bottom;
+	padding-left:6px;
+    zoom:1;
+}
+.x-window-bc {
+	background: transparent url(../images/window/top-bottom.png) repeat-x 0 bottom;
+    zoom:1;
+}
+.x-window-br {
+	background: transparent url(../images/window/right-corners.png) no-repeat right bottom;
+	padding-right:6px;
+    zoom:1;
+}
+.x-window-ml {
+	background: transparent url(../images/window/left-right.png) repeat-y 0 0;
+	padding-left:6px;
+    zoom:1;
+}
+.x-window-mr {
+	background: transparent url(../images/window/left-right.png) repeat-y right 0;
+	padding-right:6px;
+    zoom:1;
+}
+.x-window-mc, .x-window-plain .x-window-mc {
+	background:#fff none !important;
+	border:1px solid #999;
+}
+.x-window-body {
+	border:1px solid #222 !important;
+}
+.x-window-maximized .x-window-mc {
+	border-bottom:0 none !important;
+	border-left:0 none !important;
+	border-right:0 none !important;
+}
+.x-window-proxy {
+	background:#333 none;
+}
+.x-window-header .x-tool {
+	background:transparent url(../images/window/ux-tools.png) no-repeat;
+	margin-left:0;
+}
+.x-window-header .x-tool-minimize {
+	background-position:0px 0px;
+	height:18px;
+	width:27px;
+}
+.x-window-header .x-tool-minimize-over {
+	background-position:0px -18px;
+}
+.x-window-header .x-tool-maximize,
+.x-window-header .x-tool-restore {
+	background-position:-27px 0px;
+	height:18px;
+	width:24px;
+}
+.x-window-header .x-tool-maximize-over,
+.x-window-header .x-tool-restore-over {
+	background-position:-27px -18px;
+}
+.x-window-header .x-tool-close {
+	background-position:-51px 0px;
+	height:18px;
+	width:44px;
+}
+.x-window-header .x-tool-close-over {
+	background-position:-51px -18px;
+}
+.x-panel-ghost {
+    background:#333;
+    z-index:12000;
+    overflow:hidden;
+    position:absolute;
+    left:0;top:0;
+    opacity:.65;
+    -moz-opacity:.65;
+    filter:alpha(opacity=65);
+}
+.x-panel-ghost .x-window-tl {
+    border-bottom:1px solid #222;
+}
+.x-panel-ghost ul {
+    border:1px solid #222;
+    border-top:0 none;
+}
+/* End: window */
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/button/btn-arrow.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/button/btn-arrow.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/button/btn-sprite.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/button/btn-sprite.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/grid/grid-split.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/grid/grid-split.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/icons/download.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/icons/download.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/icons/pref-wallpapers.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/icons/pref-wallpapers.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/icons/pref-wallpapers.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/icons/pref-wallpapers.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/icons/preferences.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/icons/preferences.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/panel/header-bg.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/panel/header-bg.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/panel/tool-sprites.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/panel/tool-sprites.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/startmenu/app-item-over.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/startmenu/app-item-over.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/startmenu/left-corners.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/startmenu/left-corners.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/startmenu/left-right.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/startmenu/left-right.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/startmenu/old/left-corners.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/startmenu/old/left-corners.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/startmenu/old/left-right.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/startmenu/old/left-right.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/startmenu/old/right-corners.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/startmenu/old/right-corners.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/startmenu/old/right.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/startmenu/old/right.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/startmenu/old/tool.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/startmenu/old/tool.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/startmenu/old/top-bottom.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/startmenu/old/top-bottom.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/startmenu/right-corners.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/startmenu/right-corners.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/startmenu/right.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/startmenu/right.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/startmenu/tool.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/startmenu/tool.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/startmenu/top-bottom.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/startmenu/top-bottom.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/tabs/tab-close.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/tabs/tab-close.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/tabs/tab-strip-bg.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/tabs/tab-strip-bg.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/tabs/tabs-sprite.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/tabs/tabs-sprite.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/taskbar/quickstart-button.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/taskbar/quickstart-button.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/taskbar/quickstart-menubutton-icon.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/taskbar/quickstart-menubutton-icon.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/taskbar/quickstart-menubutton.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/taskbar/quickstart-menubutton.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/taskbar/scroll-left.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/taskbar/scroll-left.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/taskbar/scroll-right.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/taskbar/scroll-right.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/taskbar/startbutton-icon.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/taskbar/startbutton-icon.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/taskbar/startbutton.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/taskbar/startbutton.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/taskbar/taskbar-split-h.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/taskbar/taskbar-split-h.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/taskbar/taskbar-start-panel-bg.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/taskbar/taskbar-start-panel-bg.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/taskbar/taskbutton.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/taskbar/taskbutton.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/taskbar/taskbuttons-panel-bg.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/taskbar/taskbuttons-panel-bg.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/toolbar/bg.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/toolbar/bg.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/toolbar/gray-bg.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/toolbar/gray-bg.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/toolbar/tb-btn-sprite.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/toolbar/tb-btn-sprite.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/tree/elbow-end-minus-nl.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/tree/elbow-end-minus-nl.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/tree/elbow-plus-nl.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/tree/elbow-plus-nl.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/tree/folder.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/tree/folder.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/tree/plugin.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/tree/plugin.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/window/left-corners.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/window/left-corners.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/window/left-right.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/window/left-right.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/window/right-corners.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/window/right-corners.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/window/side-panel-bluegreen.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/window/side-panel-bluegreen.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/window/tool-sprites.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/window/tool-sprites.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/window/tool-sprites.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/window/tool-sprites.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/window/top-bottom.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/window/top-bottom.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/window/ux-tools.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/images/window/ux-tools.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/xtheme-vistaglass.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/themes/xtheme-vistaglass/xtheme-vistaglass.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/blank.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/blank.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/blue-curtain.jpg
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/blue-curtain.jpg
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/blue-psychedelic.jpg
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/blue-psychedelic.jpg
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/blue-swirl.jpg
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/blue-swirl.jpg
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/colorado-farm.jpg
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/colorado-farm.jpg
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/curls-on-green.jpg
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/curls-on-green.jpg
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/emotion.jpg
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/emotion.jpg
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/eos.jpg
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/eos.jpg
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/fields-of-peace.jpg
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/fields-of-peace.jpg
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/fresh-morning.jpg
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/fresh-morning.jpg
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/ladybuggin.jpg
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/ladybuggin.jpg
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/qwikioffice.jpg
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/qwikioffice.jpg
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/summer.jpg
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/summer.jpg
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/thumbnails/blank.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/thumbnails/blank.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/thumbnails/blue-curtain.jpg
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/thumbnails/blue-curtain.jpg
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/thumbnails/blue-psychedelic.jpg
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/thumbnails/blue-psychedelic.jpg
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/thumbnails/blue-swirl.jpg
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/thumbnails/blue-swirl.jpg
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/thumbnails/colorado-farm.jpg
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/thumbnails/colorado-farm.jpg
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/thumbnails/curls-on-green.jpg
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/thumbnails/curls-on-green.jpg
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/thumbnails/emotion.jpg
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/thumbnails/emotion.jpg
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/thumbnails/eos.jpg
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/thumbnails/eos.jpg
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/thumbnails/fields-of-peace.jpg
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/thumbnails/fields-of-peace.jpg
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/thumbnails/fresh-morning.jpg
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/thumbnails/fresh-morning.jpg
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/thumbnails/ladybuggin.jpg
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/thumbnails/ladybuggin.jpg
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/thumbnails/qwikioffice.jpg
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/thumbnails/qwikioffice.jpg
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/thumbnails/summer.jpg
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/resources/wallpapers/thumbnails/summer.jpg
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/sample.css
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/sample.css	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/sample.css	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,27 @@
+/*
+ * Ext JS Library 2.2
+ * Copyright(c) 2006-2008, Ext JS, LLC.
+ * licensing@xxxxxxxxx
+ * 
+ * http://extjs.com/license
+ */
+
+html, body {
+    font:normal 12px verdana;
+    margin:0;
+    padding:0;
+    border:0 none;
+    overflow:hidden;
+    height:100%;
+}
+
+.x-panel-body p {
+    margin:5px;
+}
+    
+.settings {
+    background-image:url( ../shared/icons/fam/folder_wrench.png ) !important;
+}
+.nav {
+    background-image:url( ../shared/icons/fam/folder_go.png ) !important;
+}
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/core/App.js
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/core/App.js	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/core/App.js	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,601 @@
+/*
+ * qWikiOffice Desktop 0.8.1
+ * Copyright(c) 2007-2008, Integrated Technologies, Inc.
+ * licensing@xxxxxxxxxxxxxxx
+ * 
+ * http://www.qwikioffice.com/license
+ *
+ * NOTE:
+ * This code is based on code from the original Ext JS desktop demo.
+ * I have made many modifications/additions.
+ *
+ * The Ext JS licensing can be viewed here:
+ *
+ * Ext JS Library 2.0 Beta 2
+ * Copyright(c) 2006-2007, Ext JS, LLC.
+ * licensing@xxxxxxxxx
+ * 
+ * http://extjs.com/license
+ *
+ */
+
+Ext.app.App = function(config){
+    Ext.apply(this, config);
+    
+    this.addEvents({
+        'ready' : true,
+        'beforeunload' : true
+    });
+
+    Ext.onReady(this.initApp, this);
+};
+
+Ext.extend(Ext.app.App, Ext.util.Observable, {
+    /**
+     * Read-only. This app's ready state
+     * @type boolean
+     */
+    isReady : false,
+    /**
+     * Read-only. This app's launchers
+     * @type object
+     */
+    launchers : null,
+    /**
+     * Read-only. This app's modules
+     * If a module is not loaded, a placeholder needs to be present.
+     * @type array
+     */
+    modules : null,
+     /**
+     * Read-only. This app's styles
+     * @type object
+     */
+    styles : null,
+    /**
+     * Read-only. This app's start config
+     * @type object
+     */
+    startConfig : null,
+     /**
+     * Read-only. This app's Start Menu's items and toolItems configs.
+     * @type object
+     */
+    startItemsConfig : null,
+    /**
+     * Read-only. This app's logout button config
+     * @type object
+     */
+    logoutButtonConfig : null,
+    /**
+     * Read-only. The url of this app's server connection
+     * 
+     * Allows a module to connect to its server script without knowing the path.
+     * Example ajax call:
+     * 
+     * Ext.Ajax.request({
+     * 		url: this.app.connection,
+     * 		// Could also pass moduleId and fileName in querystring like this,
+     * 		// instead of in the params config option.
+     *      
+     * 		// url: this.app.connection+'?moduleId='+this.id+'&fileName=Preferences.php',
+     *      params: {
+     *			moduleId: this.id,
+     *			fileName: 'Preferences.php',
+     *
+     *			...
+     *		},
+     *		success: function(){
+     *			...
+     *		},
+     *		failure: function(){
+     *			...
+     *		},
+     *		scope: this
+     *	});
+     */
+    connection : 'connect.php',
+    /**
+     * Read-only. The url of this app's loader script
+     * @type string
+     * 
+     * Handles module on demand loading
+     */
+	loader : 'load.php',
+    /**
+     * Read-only. The queue of requests to run once a module is loaded
+     */
+    requestQueue : [],
+    
+    init : Ext.emptyFn,
+	startMenuSortFn : Ext.emptyFn,
+    getModules : Ext.emptyFn,
+    getLaunchers : Ext.emptyFn,
+    getStyles : Ext.emtpyFn,
+    getStartConfig : Ext.emptyFn,
+    getLogoutConfig : Ext.emptyFn,
+    
+    initApp : function(){
+        Ext.BLANK_IMAGE_URL = 'resources/images/default/s.gif';
+        
+        this.preventBackspace();
+        
+    	this.privileges = this.privileges || this.getPrivileges();
+    	
+        this.modules = this.modules || this.getModules();
+		this.initModules();
+        
+		this.startConfig = this.startConfig || this.getStartConfig();
+		this.startItemsConfig = this.startItemsConfig || this.getStartItemsConfig();
+		Ext.apply(this.startConfig, this.startItemsConfig);
+		
+		this.desktop = new Ext.Desktop(this);
+		
+		this.styles = this.styles || this.getStyles();
+        this.initStyles();
+		
+		this.launchers = this.launchers || this.getLaunchers();
+        this.initLaunchers();
+		
+		this.logoutConfig = this.logoutConfig || this.getLogoutConfig();
+        this.initLogout();
+        
+        this.init();
+    
+        Ext.EventManager.on(window, 'beforeunload', this.onBeforeUnload, this);
+        this.fireEvent('ready', this);
+        this.isReady = true;
+    },
+    
+    initLogout : function(){
+        if(this.logoutConfig){
+            this.desktop.taskbar.startMenu.addTool(this.logoutConfig);
+        }
+    },
+
+    initStyles : function(){
+        var s = this.styles;
+        if(!s){
+            return false;
+        }
+        
+        this.desktop.setBackgroundColor(s.backgroundcolor);
+        this.desktop.setFontColor(s.fontcolor);
+        this.desktop.setTheme(s.theme);
+        this.desktop.setTransparency(s.transparency);
+        this.desktop.setWallpaper(s.wallpaper);
+        this.desktop.setWallpaperPosition(s.wallpaperposition);
+        
+        return true;
+    },
+
+    initModules : function(){
+        var ms = this.modules;
+        if(!ms){ return false; }
+        
+        for(var i = 0, len = ms.length; i < len; i++){			
+            if(ms[i].loaded === true){
+				//ms[i].app = this;
+            }else{
+    			// module is not loaded, set the handler for its launcher
+                ms[i].launcher.handler = this.createWindow.createDelegate(this, [ms[i].moduleId]);
+            }
+    		ms[i].app = this;
+        }
+        
+        return true;
+    },
+    
+    initLaunchers : function(){
+        var l = this.launchers;
+        if(!l){
+            return false;
+        }
+        
+        if(l.contextmenu){
+            this.initContextMenu(l.contextmenu);
+        }
+        if(l.quickstart){
+            this.initQuickStart(l.quickstart);
+        }
+        if(l.shortcut){
+            this.initShortcut(l.shortcut);
+        }
+        if(l.autorun){
+            this.onReady(this.initAutoRun.createDelegate(this, [l.autorun]), this);
+        }
+        
+        return true;
+    },
+    
+    /**
+     * @param {array} mIds An array of the module ids to run when this app is ready
+     */
+    initAutoRun : function(mIds){
+        if(mIds){
+            for(var i = 0, len = mIds.length; i < len; i++){
+                var m = this.getModule(mIds[i]);
+                if(m){
+                    m.autorun = true;
+                    this.createWindow(mIds[i]);
+                }
+            }
+        }
+    },
+
+    /**
+     * @param {array} mIds An array of the module ids to add to the Desktop Context Menu
+     */
+    initContextMenu : function(mIds){
+        if(mIds){
+            for(var i = 0, len = mIds.length; i < len; i++){
+                this.desktop.addContextMenuItem(mIds[i]);
+            }
+        }
+    },
+
+    /**
+     * @param {array} mIds An array of the module ids to add to the Desktop Shortcuts
+     */
+    initShortcut : function(mIds){
+        if(mIds){
+            for(var i = 0, len = mIds.length; i < len; i++){
+                this.desktop.addShortcut(mIds[i], false);
+            }
+        }
+    },
+    
+    /**
+     * @param {array} mIds An array of the module ids to add to the Start Menu
+     * @param {boolean} tool True to add to the Start Menu's Tool panel
+     */
+	initQuickStart : function(mIds){
+        if(mIds){	        
+			for(var i = 0, len = mIds.length; i < len; i++){
+	            this.desktop.addQuickStartButton(mIds[i], false);
+            }
+        }
+    },
+    
+    /**
+	 * Returns the Start Menu items and toolItems configs
+	 * @param {array} ms An array of the modules.
+	 */
+	getStartItemsConfig : function(){
+		var ms = this.modules;
+		var sortFn = this.startMenuSortFn;
+		
+    	if(ms){
+    		var paths;
+    		var root;
+    		var sm = { menu: { items: [] } }; // Start Menu
+    		var smi = sm.menu.items;
+        
+    		smi.push({text: 'StartMenu', menu: { items: [] } });
+    		smi.push({text: 'ToolMenu', menu: { items: [] } });
+    		
+			for(var i = 0, iLen = ms.length; i < iLen; i++){ // loop through modules
+				if(ms[i].menuPath){	
+					paths = ms[i].menuPath.split('/');
+					root = paths[0];
+					
+					if(paths.length > 0){
+						if(root === 'StartMenu'){
+							simplify(smi[0].menu, paths, ms[i].launcher);
+							sort(smi[0].menu);
+						}else if(root === 'ToolMenu'){
+							simplify(smi[1].menu, paths, ms[i].launcher);
+							sort(smi[1].menu);
+						}
+                    }
+                }
+            }
+			
+			return {
+				items: smi[0].menu.items,
+				toolItems: smi[1].menu.items
+			};
+    	}
+    	
+    	return null;
+		
+		/**
+		 * Creates nested arrays that represent the Start Menu.
+		 * 
+		 * @param {array} pMenu The Start Menu
+		 * @param {array} texts The menu texts
+		 */
+		function simplify(pMenu, paths, launcher){
+			var newMenu;
+			var foundMenu;
+			
+			for(var i = 1, len = paths.length; i < len; i++){ // ignore the root (StartMenu, ToolMenu)
+				foundMenu = findMenu(pMenu.items, paths[i]); // text exists?
+				
+				if(!foundMenu){
+					newMenu = {
+						iconCls: 'ux-start-menu-submenu',
+						handler: function(){ return false; },
+						menu: { items: [] },
+						text: paths[i]
+					};
+					pMenu.items.push(newMenu);
+					pMenu = newMenu.menu;
+                }else{
+					pMenu = foundMenu;
+                }
+            }
+			
+			pMenu.items.push(launcher);
+        }
+
+    /**
+     * @param {array} mIds An array of the modulId's to add to the Quick Start panel
+     */
+		function findMenu(pMenu, text){
+			for(var j = 0, jlen = pMenu.length; j < jlen; j++){
+				if(pMenu[j].text === text){
+					return pMenu[j].menu; // found the menu, return it
+				}
+			}
+			return null;
+		}
+		
+		/**
+		 * @param {array} menu The nested array to sort
+		 */
+		function sort(menu){
+			var items = menu.items;
+			for(var i = 0, ilen = items.length; i < ilen; i++){
+				if(items[i].menu){
+					sort(items[i].menu); // use recursion to iterate nested arrays
+				}
+				bubbleSort(items, 0, items.length); // sort the menu items
+			}
+		}
+
+        /**
+        * @param {array} items Menu items to sort
+        * @param {integer} start The start index
+        * @param {integer} stop The stop index
+        */
+        function bubbleSort(items, start, stop){
+            for(var i = stop - 1; i >= start;  i--){
+                for(var j = start; j <= i; j++){
+                    if(items[j+1] && items[j]){
+						if(sortFn(items[j], items[j+1])){
+                            var tempValue = items[j];
+                            items[j] = items[j+1];
+                            items[j+1] = tempValue;
+                        }
+                    }
+                }
+            }
+            return items;
+        }
+    },
+    
+    /**
+     * @param {string} moduleId
+     * 
+     * Provides the handler to the placeholder's launcher until the module it is loaded.
+     * Requests the module.  Passes in the callback and scope as params.
+     */
+    createWindow : function(moduleId){
+        var m = this.requestModule(moduleId, function(m){
+            if(m){
+                m.createWindow();
+            }
+        }, this);
+    },
+    
+    /** 
+     * @param {string} v The moduleId or moduleType you want returned
+     * @param {Function} cb The Function to call when the module is ready/loaded
+     * @param {object} scope The scope in which to execute the function
+     */
+    requestModule : function(v, cb, scope){
+        var m = this.getModule(v);
+        
+        if(m){
+            if(m.loaded === true){
+                cb.call(scope, m);
+            }else{
+                if(cb && scope){
+                    this.requestQueue.push({
+                        moduleId: m.moduleId,
+                        callback: cb,
+                        scope: scope
+                    });
+//                    this.loadModule(m.moduleId, m.launcher.text);
+                    this.loadModule(m);
+                }
+            }
+        }
+    },
+    
+    /**
+     * 
+     * @param {String} moduleId id assigned to the module
+     * @param {String} moduleName launcher.text config property
+     */
+    loadModule : function(m){
+        var notifyWin = this.desktop.showNotification({
+//            html: 'Loading ' + moduleName + '...'
+            html: 'Loading ' + m.launcher.text + '...'
+            , title: 'Please wait'
+        });
+        var loader = m.loader || {};
+        Ext.Ajax.request({
+//            url: this.loader,
+            url: loader.url || this.urlLoad,            
+            params: {
+//                moduleId: moduleId
+                moduleId: m.id,
+                extraParams: loader.params
+            },
+            success: function(o){
+                notifyWin.setIconClass('x-icon-done');
+                notifyWin.setTitle('Finished');
+//                notifyWin.setMessage(moduleName + ' loaded.');
+                notifyWin.setMessage(m.launcher.text + ' loaded.');
+                this.desktop.hideNotification(notifyWin);
+                notifyWin = null;
+        
+                if(o.responseText !== ''){
+                    //responseText should include "
+                    eval(o.responseText);
+//                    this.loadModuleComplete(true, moduleId);
+                    this.loadModuleComplete(true, m.id);
+                }else{
+                    alert('An error occured on the server.');
+                }
+            },
+            failure: function(){
+                alert('Connection to the server failed!');
+            },
+            scope: this
+        });
+    },
+    
+    /**
+     * @param {boolean} success
+     * @param {string} moduleId
+     * 
+     * Will be called when a module is loaded.
+     * Creates an instance of the loaded module.
+     * If a request for this module is waiting in the
+     * queue, it as executed and removed from the queue.
+     */
+    loadModuleComplete : function(success, moduleId){    	
+        if(success === true && moduleId){
+    		var m = this.getModule(moduleId);
+    		m.loaded = true;
+    		m.init();
+    		
+            var q = this.requestQueue;
+            var nq = [];
+            
+            for(var i = 0, len = q.length; i < len; i++){
+                if(q[i].moduleId === moduleId){
+                    q[i].callback.call(q[i].scope, m);
+                }else{
+                    nq.push(q[i]);
+                }
+            }
+            
+            this.requestQueue = nq;
+        }
+    },
+    
+    /**
+     * @param {string} v The moduleId or moduleType you want returned
+     */
+    getModule : function(v){
+        var ms = this.modules;
+        
+        for(var i = 0, len = ms.length; i < len; i++){
+            if(ms[i].moduleId == v || ms[i].moduleType == v){
+                return ms[i];
+            }
+        }
+        
+        return null;
+    },
+
+    
+    /**
+     * @param {Ext.app.Module} m The module to register
+     */
+    registerModule: function(m){
+    	if(!m){ return false; }
+		this.modules.push(m);
+		m.launcher.handler = this.createWindow.createDelegate(this, [m.moduleId]);
+		m.app = this;
+	},
+
+    /**
+     * @param {string} moduleId or moduleType 
+     * @param {array} requests An array of request objects
+     * 
+     * Example:
+     * this.app.makeRequest('module-id', {
+     *    requests: [
+     *       {
+     *          action: 'createWindow',
+     *          params: '',
+     *          callback: this.myCallbackFunction,
+     *          scope: this
+     *       },
+     *       { ... }
+     *    ]
+     * });
+     */
+    makeRequest : function(moduleId, requests){
+        if(moduleId !== '' && Ext.isArray(requests)){
+            var m = this.requestModule(moduleId, function(m){
+                if(m){
+                    m.handleRequest(requests);
+                }
+            }, this);
+        }
+    },
+    
+    /**
+     * @param {string} action The module action
+     * @param {string} moduleId The moduleId property
+     */
+    isAllowedTo : function(action, moduleId){
+    	var p = this.privileges,
+    		a = p[action];
+    	
+    	if(p && a){
+    		for(var i = 0, len = a.length; i < len; i++){
+    			if(a[i] === moduleId){
+    				return true;
+    			}
+    		}
+    	}
+    	
+    	return false;
+    },
+    
+    getDesktop : function(){
+        var test = 1;
+        console.info('getDesktop');
+        return this.desktop;
+    },
+    
+    /**
+     * @param {Function} fn The function to call after the app is ready
+     * @param {object} scope The scope in which to execute the function
+     */
+    onReady : function(fn, scope){
+        if(!this.isReady){
+            this.on('ready', fn, scope);
+        }else{
+            fn.call(scope, this);
+        }
+    },
+    
+    onBeforeUnload : function(e){
+        if(this.fireEvent('beforeunload', this) === false){
+            e.stopEvent();
+        }
+    },
+    
+    /**
+     * Prevent the backspace (history -1) shortcut
+     */
+    preventBackspace : function(){
+        var map = new Ext.KeyMap(document, [{
+            key: Ext.EventObject.BACKSPACE,
+            fn: function(key, e){
+                var t = e.target.tagName;
+                if(t != "INPUT" && t != "TEXTAREA"){
+                    e.stopEvent();
+                }
+            }
+        }]);
+    }
+});
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/core/Desktop.js
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/core/Desktop.js	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/core/Desktop.js	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,390 @@
+/*
+ * qWikiOffice Desktop 0.8.1
+ * Copyright(c) 2007-2008, Integrated Technologies, Inc.
+ * licensing@xxxxxxxxxxxxxxx
+ * 
+ * http://www.qwikioffice.com/license
+ *
+ * NOTE:
+ * This code is based on code from the original Ext JS desktop demo.
+ * I have made many modifications/additions.
+ *
+ * The Ext JS licensing can be viewed here:
+ *
+ * Ext JS Library 2.0 Beta 2
+ * Copyright(c) 2006-2007, Ext JS, LLC.
+ * licensing@xxxxxxxxx
+ * 
+ * http://extjs.com/license
+ */
+
+Ext.Desktop = function(app){
+    
+    this.taskbar = new Ext.ux.TaskBar(app);
+    var taskbar = this.taskbar;
+    
+    this.el = Ext.get('x-desktop');
+    var desktopEl = this.el;
+    
+    var taskbarEl = Ext.get('ux-taskbar');
+    
+    this.shortcuts = new Ext.ux.Shortcuts({
+        renderTo: 'x-desktop',
+        taskbarEl: taskbarEl
+    });
+    
+    var windows = new Ext.WindowGroup();
+    windows.zseed = 10000;
+    var activeWindow;
+        
+    function minimizeWin(win){
+        win.minimized = true;
+        win.hide();
+    }
+
+    function markActive(win){
+        if(activeWindow && activeWindow != win){
+            markInactive(activeWindow);
+        }
+        taskbar.setActiveButton(win.taskButton);
+        activeWindow = win;
+        Ext.fly(win.taskButton.el).addClass('active-win');
+        win.minimized = false;
+    }
+
+    function markInactive(win){
+        if(win == activeWindow){
+            activeWindow = null;
+            Ext.fly(win.taskButton.el).removeClass('active-win');
+        }
+    }
+
+    function removeWin(win){
+        taskbar.taskButtonPanel.remove(win.taskButton);
+        layout();
+    }
+
+    function layout(){
+        desktopEl.setHeight(Ext.lib.Dom.getViewHeight() - taskbarEl.getHeight());
+    }
+    Ext.EventManager.onWindowResize(layout);
+
+    this.layout = layout;
+
+    this.createWindow = function(config, cls){
+        var win = new (cls||Ext.Window)(
+            Ext.applyIf(config||{}, {
+                manager: windows,
+                minimizable: true,
+                maximizable: true
+            })
+        );
+        win.render(desktopEl);
+        win.taskButton = taskbar.taskButtonPanel.add(win);
+
+        win.cmenu = new Ext.menu.Menu({
+            items: [
+
+            ]
+        });
+
+        win.animateTarget = win.taskButton.el;
+        
+        win.on({
+            'activate': {
+                fn: markActive
+            },
+            'beforeshow': {
+                fn: markActive
+            },
+            'deactivate': {
+                fn: markInactive
+            },
+            'minimize': {
+                fn: minimizeWin
+            },
+            'close': {
+                fn: removeWin
+            }
+        });
+        
+        layout();
+        return win;
+    };
+
+    this.getManager = function(){
+        return windows;
+    };
+
+    this.getWindow = function(id){
+        return windows.get(id);
+    };
+    
+    this.getViewHeight = function(){
+        return (Ext.lib.Dom.getViewHeight()-taskbarEl.getHeight());
+    };
+    
+    this.getViewWidth = function(){
+        return Ext.lib.Dom.getViewWidth();
+    };
+    
+    this.getWinWidth = function(){
+        var width = Ext.lib.Dom.getViewWidth();
+        return width < 200 ? 200 : width;
+    };
+        
+    this.getWinHeight = function(){
+        var height = (Ext.lib.Dom.getViewHeight()-taskbarEl.getHeight());
+        return height < 100 ? 100 : height;
+    };
+        
+    this.getWinX = function(width){
+        return (Ext.lib.Dom.getViewWidth() - width) / 2
+    };
+        
+    this.getWinY = function(height){
+        return (Ext.lib.Dom.getViewHeight()-taskbarEl.getHeight() - height) / 2;
+    };
+    
+    this.setBackgroundColor = function(hex){
+        if(hex){
+            Ext.get(document.body).setStyle('background-color', '#'+hex);
+            app.styles.backgroundcolor = hex;
+        }
+    };
+    
+    this.setFontColor = function(hex){
+        if(hex){
+            Ext.util.CSS.updateRule('.ux-shortcut-btn-text', 'color', '#'+hex);
+            app.styles.fontcolor = hex;
+        }
+    };
+    
+    this.setTheme = function(o){
+        if(o && o.id && o.name && o.pathtofile){
+            Ext.util.CSS.swapStyleSheet('theme', o.pathtofile);
+            app.styles.theme = o;
+        }
+    };
+    
+    this.setTransparency = function(v){
+        if(v >= 0 && v <= 100){
+            taskbarEl.addClass("transparent");
+            Ext.util.CSS.updateRule('.transparent','opacity', v/100);
+            Ext.util.CSS.updateRule('.transparent','-moz-opacity', v/100);
+            Ext.util.CSS.updateRule('.transparent','filter', 'alpha(opacity='+v+')');
+            
+            app.styles.transparency = v;
+        }
+    };
+    
+    this.setWallpaper = function(o){
+        if(o && o.id && o.name && o.pathtofile){
+            
+            var notifyWin = this.showNotification({
+                html: 'Loading wallpaper...'
+                , title: 'Please wait'
+            });
+            
+            var wp = new Image();
+            wp.src = o.pathtofile;
+            
+            var task = new Ext.util.DelayedTask(verify, this);
+            task.delay(200);
+            
+            app.styles.wallpaper = o;
+        }
+        
+        function verify(){
+            if(wp.complete){
+                task.cancel();
+                
+                notifyWin.setIconClass('x-icon-done');
+                notifyWin.setTitle('Finished');
+                notifyWin.setMessage('Wallpaper loaded.');
+                this.hideNotification(notifyWin);
+                
+                document.body.background = wp.src;
+            }else{
+                task.delay(200);
+            }
+        }
+    };
+    
+    this.setWallpaperPosition = function(pos){
+        if(pos){
+            if(pos === "center"){
+                var b = Ext.get(document.body);
+                b.removeClass('wallpaper-tile');
+                b.addClass('wallpaper-center');
+            }else if(pos === "tile"){
+                var b = Ext.get(document.body);
+                b.removeClass('wallpaper-center');
+                b.addClass('wallpaper-tile');
+            }			
+            app.styles.wallpaperposition = pos;
+        }
+    };
+    
+    this.showNotification = function(config){
+        var win = new Ext.ux.Notification(Ext.apply({
+            animateTarget: taskbarEl
+            , autoDestroy: true
+            , hideDelay: 5000
+            , html: ''
+            , iconCls: 'x-icon-waiting'
+            , title: ''
+        }, config));
+        win.show();
+
+        return win;
+    };
+    
+    this.hideNotification = function(win, delay){
+        if(win){
+            (function(){ win.animHide(); }).defer(delay || 3000);
+        }
+    };
+    
+    this.addAutoRun = function(id){
+        var m = app.getModule(id),
+            c = app.launchers.autorun;
+            
+        if(m && !m.autorun){
+            m.autorun = true;
+            c.push(id);
+        }
+    };
+    
+    this.removeAutoRun = function(id){
+        var m = app.getModule(id),
+            c = app.launchers.autorun;
+            
+        if(m && m.autorun){
+            var i = 0;
+                
+            while(i < c.length){
+                if(c[i] == id){
+                    c.splice(i, 1);
+                }else{
+                    i++;
+                }
+            }
+            
+            m.autorun = null;
+        }
+    };
+
+    // Private
+    this.addContextMenuItem = function(id){
+        var m = app.getModule(id);
+        if(m && !m.contextMenuItem){
+            /* if(m.moduleType === 'menu'){ // handle menu modules
+                var items = m.items;
+                for(var i = 0, len = items.length; i < len; i++){
+                    m.launcher.menu.items.push(app.getModule(items[i]).launcher);
+                }
+            } */
+            this.cmenu.add(m.launcher);
+        }
+    };
+
+    this.addShortcut = function(id, updateConfig){
+        var m = app.getModule(id);
+        
+        if(m && !m.shortcut){
+            var c = m.launcher;
+            
+            m.shortcut = this.shortcuts.addShortcut({
+                handler: c.handler,
+                iconCls: c.shortcutIconCls,
+                scope: c.scope,
+                text: c.text,
+                tooltip: c.tooltip || ''
+            });
+            
+            if(updateConfig){
+                app.launchers.shortcut.push(id);
+            }
+        }
+        
+    };
+
+    this.removeShortcut = function(id, updateConfig){
+        var m = app.getModule(id);
+        
+        if(m && m.shortcut){
+            this.shortcuts.removeShortcut(m.shortcut);
+            m.shortcut = null;
+            
+            if(updateConfig){
+                var sc = app.launchers.shortcut,
+                    i = 0;
+                while(i < sc.length){
+                    if(sc[i] == id){
+                        sc.splice(i, 1);
+                    }else{
+                        i++;
+                    }
+                }
+            }
+        }
+    };
+
+    this.addQuickStartButton = function(id, updateConfig){
+        var m = app.getModule(id);
+        
+        if(m && !m.quickStartButton){
+            var c = m.launcher;
+            
+            m.quickStartButton = this.taskbar.quickStartPanel.add({
+                handler: c.handler,
+                iconCls: c.iconCls,
+                scope: c.scope,
+                text: c.text,
+                tooltip: c.tooltip || c.text
+            });
+            
+            if(updateConfig){
+                app.launchers.quickstart.push(id);
+            }
+        }
+    };
+    
+    this.removeQuickStartButton = function(id, updateConfig){
+        var m = app.getModule(id);
+        
+        if(m && m.quickStartButton){
+            this.taskbar.quickStartPanel.remove(m.quickStartButton);
+            m.quickStartButton = null;
+            
+            if(updateConfig){
+                var qs = app.launchers.quickstart,
+                    i = 0;
+                while(i < qs.length){
+                    if(qs[i] == id){
+                        qs.splice(i, 1);
+                    }else{
+                        i++;
+                    }
+                }
+            }
+        }
+    };
+
+    layout();
+    
+    this.cmenu = new Ext.menu.Menu();
+    
+    desktopEl.on('contextmenu', function(e){
+        if(e.target.id === desktopEl.id){
+            e.stopEvent();
+            if(!this.cmenu.el){
+                this.cmenu.render();
+            }
+            var xy = e.getXY();
+            xy[1] -= this.cmenu.el.getHeight();
+            this.cmenu.showAt(xy);
+        }
+    }, this);
+};
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/core/DesktopWindow.js
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/core/DesktopWindow.js	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/core/DesktopWindow.js	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,1033 @@
+Ext.ns('Ext.ux.window'); 
+
+/**
+ * An object that represents a group of {@link Ext.ux.window.DesktopWindow} instances
+ * and provides module management in addition to the standard Window Group features.
+ * @class Ext.ux.window.DesktopWindowGroup
+ * @extends Ext.WindowGroup
+ * @constructor
+ */
+Ext.ux.window.DesktopWindowGroup = function (config) {
+    config = config || {};
+    var mgr = new Ext.WindowGroup();
+    mgr.modules = [];
+    Ext.apply(mgr, config);
+    return mgr;
+};
+
+/**
+ * The default global Desktop Window group that is available automatically.
+ * To have more than one group of Desktop Windows create additional instances
+ * of {@link Ext.ux.window.DesktopWindowGroup} as needed.
+ * @class Ext.ux.window.DesktopWindowMgr
+ * @extends Ext.ux.window.DesktopWindowGroup
+ * @singleton
+ */
+Ext.ux.window.DesktopWindowMgr = Ext.ux.window.DesktopWindowGroup(); 
+
+/**
+ * <p>A specialized implementation for the Desktop class.</p>
+ * 
+ * @class Ext.ux.window.DesktopWindow
+ * @extends Ext.Window
+ * @author Michael LeComte (<a href="http://extjs.com/forum/member.php?u=6834";>mjlecomte</a>), inspired by Ext.ux.Notification\ToastWindow (Edouard Fattal)
+ * @license <a href="http://www.gnu.org/licenses/lgpl.html";>LGPL 3.0</a>
+ * @version 0.01 - Nov 1, 2008 (ALPHA!!!)
+ * @donate <form action="https://www.paypal.com/cgi-bin/webscr"; method="post">
+<input type="hidden" name="cmd" value="_s-xclick">
+<input type="image" src="https://www.paypal.com/en_US/i/btn/btn_donate_LG.gif"; border="0" name="submit" alt="Make a donation to support ongoing development">
+<img alt="" border="0" src="https://www.paypal.com/en_US/i/scr/pixel.gif"; width="1" height="1">
+<input type="hidden" name="encrypted" value="-----BEGIN PKCS7-----MIIHTwYJKoZIhvcNAQcEoIIHQDCCBzwCAQExggEwMIIBLAIBADCBlDCBjjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtQYXlQYWwgSW5jLjETMBEGA1UECxQKbGl2ZV9jZXJ0czERMA8GA1UEAxQIbGl2ZV9hcGkxHDAaBgkqhkiG9w0BCQEWDXJlQHBheXBhbC5jb20CAQAwDQYJKoZIhvcNAQEBBQAEgYBuv4ZsDDARUVieb2huOcB8w+eQc1XSuSh24WTsLnJbxGaMJvnTX6tYAcMvfGXXbxrBRxpDbUbyCNP9NY6ZdI2P+Ju9ljkJ22Y5P5Yvz9cv4TJulftmXRa4d/np2vlD7z73bIaytZyS+OcnF0mGt+XV4/gpL3Ypz4ovYY81qQw/lDELMAkGBSsOAwIaBQAwgcwGCSqGSIb3DQEHATAUBggqhkiG9w0DBwQIwu8IsvBpTYSAgagMcAr1pByn0q99o+mHVFCPTOvox/YdxlPICoUbiMmzoxykhY93xEp8d7BhjcjeqFOtqpAp/AGmgPNLvbOvHw33zfvV7IyEmdhDVA46TYtV2iytpqji0OSE1w1iYPlWg8QmlG98mGnKLKIPk2LAWu+lQQENy2ANvAfyLEyhkQCv2RTJybo+cp9ILfKmJ8ocKrpmPJVTWFR8yFdlz6ilWD41GwMGn5oeepWgggOHMIIDgzCCAuygAwIBAgIBADANBgkqhkiG9w0BAQUFADCBjjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtQYXlQYWwgSW5jLjETMBEGA1UECxQKbGl2ZV9jZXJ0czERMA8GA1UEAxQIbGl2ZV9hcGkxHDAaBgkqhkiG9w0BCQEWDXJlQHBheXBhbC5jb20wHhcNMDQwMjEzMTAxMzE1WhcNMzUwMjEzMTAxMzE1WjCBjjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtQYXlQYWwgSW5jLjETMBEGA1UECxQKbGl2ZV9jZXJ0czERMA8GA1UEAxQIbGl2ZV9hcGkxHDAaBgkqhkiG9w0BCQEWDXJlQHBheXBhbC5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMFHTt38RMxLXJyO2SmS+Ndl72T7oKJ4u4uw+6awntALWh03PewmIJuzbALScsTS4sZoS1fKciBGoh11gIfHzylvkdNe/hJl66/RGqrj5rFb08sAABNTzDTiqqNpJeBsYs/c2aiGozptX2RlnBktH+SUNpAajW724Nv2Wvhif6sFAgMBAAGjge4wgeswHQYDVR0OBBYEFJaffLvGbxe9WT9S1wob7BDWZJRrMIG7BgNVHSMEgbMwgbCAFJaffLvGbxe9WT9S1wob7BDWZJRroYGUpIGRMIGOMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExFjAUBgNVBAcTDU1vdW50YWluIFZpZXcxFDASBgNVBAoTC1BheVBhbCBJbmMuMRMwEQYDVQQLFApsaXZlX2NlcnRzMREwDwYDVQQDFAhsaXZlX2FwaTEcMBoGCSqGSIb3DQEJARYNcmVAcGF5cGFsLmNvbYIBADAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4GBAIFfOlaagFrl71+jq6OKidbWFSE+Q4FqROvdgIONth+8kSK//Y/4ihuE4Ymvzn5ceE3S/iBSQQMjyvb+s2TWbQYDwcp129OPIbD9epdr4tJOUNiSojw7BHwYRiPh58S1xGlFgHFXwrEBb3dgNbMUa+u4qectsMAXpVHnD9wIyfmHMYIBmjCCAZYCAQEwgZQwgY4xCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEUMBIGA1UEChMLUGF5UGFsIEluYy4xEzARBgNVBAsUCmxpdmVfY2VydHMxETAPBgNVBAMUCGxpdmVfYXBpMRwwGgYJKoZIhvcNAQkBFg1yZUBwYXlwYWwuY29tAgEAMAkGBSsOAwIaBQCgXTAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0wODA5MDExNjU1MjhaMCMGCSqGSIb3DQEJBDEWBBRJjM3MqtWeXvdDGNeVRPdyXl6vezANBgkqhkiG9w0BAQEFAASBgGUs50PYYWbFQD1DJRvZ1BE63ReFhNijhOopuajEoRfpGZW8m1T4AZbeJfr2pM01fYqNj1TF/RFSmLYgOs9WOTF6Z4EvWtkRsPb5QIbreamV20a3F8x5sL5E5zkup/t9ooqoMAyXVXXvgZfeAxNxN3ZIdVtFB99RNd0FhrxLuyt6-----END PKCS7-----
+">
+</form>
+ */
+Ext.ux.window.DesktopWindow = Ext.extend(Ext.Window, {
+
+    /**
+     * @cfg {Boolean} autoDestroy
+     * The action to take after the Desktop Window has been hidden.  The default is true which
+     * will actually remove the window from the DOM and destroy it.  False will simply hide the
+     * window by setting visibility to hidden and applying negative offsets, keeping the window
+     * available to be redisplayed via the {@link #show} method.
+     */
+    autoDestroy: true,
+
+    /**
+     * @cfg {Boolean} autoHide
+     * {@link #autoHide}
+     * True to have Desktop Window automatically hide itself (defaults to true).
+     */
+    autoHide: true,
+
+    /**
+     * @cfg {Boolean} autoHeight
+     * True to use height:'auto', false to use fixed height (defaults to false).
+     */
+    autoHeight: false,
+			
+    /**
+     * @cfg {String} bodyStyle
+     * Custom CSS styles to be applied to the body element in the format expected by 
+     * Ext.Element.applyStyles (defaults to 'text-align:left;padding:10px;').
+     */
+    bodyStyle: 'text-align:left;padding:10px;',
+
+    /**
+    * @cfg {String} baseCls
+    * The base CSS class to apply to this panel's element (defaults to 'x-window').
+    */
+
+    /**
+     * @cfg {String} buttonAlign
+     * The alignment of any buttons added to this panel. Valid values are 'right', 'left',
+     * and 'center' (defaults to 'center').
+     */
+    buttonAlign: 'center',
+
+    /**
+     * @cfg {String} cls
+     * An optional extra CSS class that will be added to this component's Element (defaults
+     * to 'x-notification'). This can be useful for adding customized styles to the component
+     * or any of its children using standard CSS rules.
+     */
+    cls: 'x-notification',
+
+    /**
+     * @cfg {Boolean} constrain
+     * True to constrain the window to the viewport, false to allow it to fall outside of
+     * the viewport (defaults to true).  Optionally the header only can be constrained using
+     * {@link #constrainHeader}.
+     */
+    constrain: true,
+
+    /**
+     * @cfg {Boolean} constrainHeader
+     * True to constrain the window header to the viewport, allowing the window body to fall
+     * outside of the viewport, false to allow the header to fall outside the viewport (defaults
+     * to true).  Optionally the entire window can be constrained using {@link #constrain}.
+     */
+    constrainHeader: true,
+
+    /**
+     * @cfg {Boolean} draggable
+     * True to allow the window to be dragged by the header bar, false to disable dragging
+     * (defaults to true).  Note that by default the window will be centered in the viewport,
+     * so if dragging is disabled the window may need to be positioned programmatically after
+     * render (e.g., myWindow.setposition(100, 100);).
+     */
+    draggable: true,
+
+    /** @cfg {Boolean} floating */
+    /** @private */
+    floating: true,
+
+    /**
+     * @cfg {Boolean} focusOnShow
+     * True to focus the window when shown (defaults to false).
+     */
+
+    /** @cfg {Boolean} frame */
+    /** @private */
+    frame: true,
+    
+    /**
+     * @cfg {Ext.ux.window.DesktopWindowGroup} manager
+     * A reference to the DesktopWindowGroup that should manage this Desktop Window (defaults 
+     * to {@link Ext.ux.window.DesktopWindowMgr}). Specify a reference to an instance unless
+     * you want a new manager for each instance:
+     * <pre><code>
+     * var group2 = new Ext.ux.window.DesktopWindowGroup({
+     *     //override any defaults or add to base class instance
+     *     groupId: 2, //groupId not implemented at this time
+     *     zseed: 2000 //change the zseed (default = 9000)
+     * });
+     * var mw1 = new Ext.ux.window.DesktopWindow({
+     *     manager: group2//specify the DesktopWindowGroup manager (instead of using default manager)
+     * });
+     * var mw2 = new Ext.ux.window.DesktopWindow({
+     *     manager: group2//specify the DesktopWindowGroup manager (instead of using default manager)
+     * });
+     * var mw3 = new Ext.ux.window.DesktopWindow({
+     *     //will use default manager
+     * });
+     * </pre></code>
+     */
+
+    /**
+     * @cfg {Function} handleHelp
+     * Handler function when the help tool is clicked (defaults to {@link Ext#emptyFn}). 
+     * @param {Object} event The click event.
+     * @param {Object} toolEl The tool Element.
+     * @param {Object} panel The host Panel.
+     */
+    handleHelp: Ext.emptyFn,
+
+    /**
+     * @cfg {Boolean} help
+     * True to display tools for help.  Defaults to true.
+     */
+    help: true,
+
+    /**
+     * @cfg {Object} hideFx
+     * Config object for hide effects settings. An example with defaults shown:
+     * <pre><code>
+     * hideFx: {
+     *     delay: 5000,  //time in milliseconds to delay the start of the effect
+     *     duration: 0.25, //duration of the effect
+     *     mode: 'standard', // null = will not hide
+     *                       // 'standard' = traditional window hide (vanish)
+     *                       // 'standard' = traditional window hide (vanish)
+     *                       // anything else will use the default of ghost
+     *     useProxy: true //default is false to hide window instead
+     * }
+     * </code></pre>
+     */
+    hideFx: {
+        delay: 5000
+    },
+
+    /**
+     * @cfg {String} hoverCls
+     * An extra CSS class that will be added to this component's Element when
+     * hovering over (defaults to 'msg-over').
+     */
+    hoverCls: 'msg-over',
+
+    /**
+     * @cfg {String} iconCls
+     * A CSS class that will provide a background image to be used as the header icon (defaults
+     * to 'x-icon-information'). An example custom icon class would be something like: 
+     * .my-icon { background: url(../images/my-icon.gif) 0 6px no-repeat !important;} 
+     */
+    iconCls: 'x-icon-information',
+
+    /**
+     * @cfg {Boolean} maximizable
+     * True to display the 'maximize' tool button and allow the user to maximize the window, false to hide the button
+     * and disallow maximizing the window (defaults to false).  Note that when a window is maximized, the tool button
+     * will automatically change to a 'restore' button with the appropriate behavior already built-in that will
+     * restore the window to its previous size.
+     */
+
+    /**
+     * @cfg {Boolean} minimizable
+     * True to display the 'minimize' tool button and allow the user to minimize the window, false to hide the button
+     * and disallow minimizing the window (defaults to false).  Note that this button provides no implementation --
+     * the behavior of minimizing a window is implementation-specific, so the minimize event must be handled and a
+     * custom minimize behavior implemented for this option to be useful.
+     */
+
+    /**
+     * @cfg {Number} minHeight
+     * The minimum height in pixels allowed for this window (defaults to 100).  Only applies when resizable = true.
+     */
+    minHeight: 40,
+
+    /**
+     * @cfg {Number} minWidth
+     * The minimum width in pixels allowed for this window (defaults to 200).  Only applies when resizable = true.
+     */
+    minWidth: 200,
+
+    /**
+     * @cfg {Boolean} modal
+     * True to make the window modal and mask everything behind it when displayed, false to display it without
+     * restricting access to other UI elements (defaults to false).
+     */
+
+    /**
+     * @cfg {Array} msgs
+     * An array to hold the message queue for refreshing messages.  Body of the Desktop Window will be updated
+     * from the <b>text</b> element.
+     * <b>Example</b>:
+     * <pre><code>
+     * msgs: [
+     *     {text: 'Some text message 1', url:'http://extjs.com/support/training/'},
+     *     {text: 'Some text message 2 &raquo;', url:'http://extjs.com/support/training/'}
+     * ],
+     * </code></pre>
+     * The first message that will be displayed uses the <b>Title</b> and <b>html</b> config options.
+     */
+    msgs: [],
+
+    /**
+     * @cfg {Boolean} monitorResize
+     * This is automatically managed based on the value of constrain and constrainToHeader
+     */
+    monitorResize : true,
+
+    /**
+     * @cfg {Function} onEsc
+     * Allows override of the built-in processing for the escape key. Default action
+     * is to close the Window (performing whatever action is specified in {@link #closeAction}.
+     * To prevent the Window closing when the escape key is pressed, specify this as
+     * Ext.emptyFn (See {@link Ext#emptyFn}).
+     */
+
+    /**
+     * @cfg {Object} origin
+     * Config object for the message origin with the following sample of default properties:
+     * <b>Example</b>:
+     * <pre><code>
+     * //configure a different origin than the default bottom right corner of the window:
+     * origin: {
+     *     //get window's Ext.element:
+     *     el: Ext.get('northRegion'), //element to align to (defaults to document)
+     *     pos: "bl-bl",//position to align to (see {@link Ext.Element#alignTo} for more details defaults to "br-br").
+     *     offX: 10, //amount to offset horizontally (-20 by default)
+     *     offY: 0 //amount to offset vertically (-20 by default)
+     * },
+     * </code></pre>
+     */
+
+    /**
+     * @cfg {Boolean} pinOnClick
+     * True to display the 'pin' tool button and allow the user to pin the window, false
+     * to hide the button and disallow pinning the window (defaults to true).
+     */
+    pinOnClick: true,
+
+    /**
+     * @cfg {String} pinState
+     * Specify the initial pin state when the window is first shown. Specify null, 'pin', or the default
+     * 'unpin'. <pre>
+     * pinState  effect
+     * --------  ------
+     * null      window will show/hide itself, user can not control
+     * 'pin'     window will initially show itself in pinned state, user will need to click unpin to hide
+     * 'unpin'   window will initially show itself in unpinned state, user will need to click pin to keep open
+     * </pre>
+     */
+    pinState: 'unpin',
+
+    /**
+     * @cfg {Boolean} plain
+     * True to render the window body with a transparent background so that it will blend into the framing
+     * elements, false to add a lighter background color to visually highlight the body element and separate it
+     * more distinctly from the surrounding frame (defaults to false).
+     */
+    plain: false,
+    
+    /**
+     * @cfg {Boolean} resizable
+     * True to allow user resizing at each edge and corner of the window, false to disable resizing (defaults to false).
+     */
+    resizable: false,
+
+    /**
+     * @cfg {String} resizeHandles
+     * A valid {@link Ext.Resizable} handles config string (defaults to 'all').  Only applies when resizable = true.
+     */
+
+    /**
+     * @cfg {String} textHelp
+     * Qtip text to display for help tool (defaults to 'Get hel').  Only applicable if help = true. 
+     */
+    textHelp: 'Get help',
+
+    /**
+     * @cfg {String} textPin
+     * Qtip text to display for pin tool.  Only applicable if {@link pinState} == 'pin' or 'unpin'.
+     */
+    textPin: 'Pin this to prevent closing',
+
+    /**
+     * @cfg {String} textUnpin
+     * Qtip text to display for unpin tool.  Only applicable if {@link pinState} == 'pin' or 'unpin'.
+     */
+    textUnpin: 'Unpin this to close',
+
+    /**
+     * @cfg {Number} x
+     * The X position of the left edge of the Window on initial showing. Defaults to centering the Window within
+     * the width of the Window's container {@link Ext.Element Element) (The Element that the Window is rendered to).
+     */
+
+    /**
+     * @cfg {Number} y
+     * The Y position of the top edge of the Window on initial showing. Defaults to centering the Window within
+     * the height of the Window's container {@link Ext.Element Element) (The Element that the Window is rendered to).
+     */
+
+    /** @private */
+    initHidden : true,
+
+    /** @private */
+    initComponent : function () {
+
+        Ext.apply(this, {
+            collapsible: false,
+            footer: false,
+            minHeight: 20,
+            stateful: false
+        });
+        
+        //if interval is specified automatically show Desktop Windows
+        if (this.interval) {
+            this.startAutoRefresh();
+        } 
+        //set up automatic hide/close of window if so configured
+        if (this.autoHide) {
+            if (this.pinState === 'unpin') {
+                this.task = new Ext.util.DelayedTask(this.hide, this);
+            }
+        } 
+//new
+        else {
+			this.closable = true;
+		}
+//added this.closable
+        
+        //call parent
+        Ext.ux.window.DesktopWindow.superclass.initComponent.call(this);
+
+        //add listeners
+        this.on({
+            hide: {
+                scope: this,
+                fn: function () {
+                    if (this.autoDestroy) {
+                        if (this.fireEvent("beforeclose", this) !== false) {
+                            this.fireEvent('close', this);
+                            this.destroy();
+                        }
+                    }
+                }
+            },
+            mouseout: {
+                scope: this,
+                fn: this.onMouseout
+            }
+        });
+
+        //add events
+        this.addEvents(
+            /**
+             * @event activate
+             * Fires after the window has been visually activated via {@link setActive}.
+             * @param {Ext.ux.window.DesktopWindow} this
+             */
+            /**
+             * @event deactivate
+             * Fires after the window has been visually deactivated via {@link setActive}.
+             * @param {Ext.ux.window.DesktopWindow} this
+             */
+            /**
+             * @event resize
+             * Fires after the window has been resized.
+             * @param {Ext.ux.window.DesktopWindow} this
+             * @param {Number} width The window's new width
+             * @param {Number} height The window's new height
+             */
+            /**
+             * @event maximize
+             * Fires after the window has been maximized.
+             * @param {Ext.ux.window.DesktopWindow} this
+             */
+            /**
+             * @event minimize
+             * Fires after the window has been minimized.
+             * @param {Ext.ux.window.DesktopWindow} this
+             */
+            /**
+             * @event restore
+             * Fires after the window has been restored to its original size after being maximized.
+             * @param {Ext.ux.window.DesktopWindow} this
+             */
+            /**
+             * @event pinned
+             * Fires after the window has been pinned.
+             * @param {Ext.ux.window.DesktopWindow} this
+             */
+            'afterpin',
+            /**
+             * @event unpinned
+             * Fires after the window has been unpinned.
+             * @param {Ext.ux.window.DesktopWindow} this
+             */
+            'afterunpin',
+            /**
+             * @event click
+             * Fires after the window has been clicked.
+             * @param {Ext.ux.window.DesktopWindow} this
+             * @param {Ext.ux.window.DesktopWindow} msg The message from the message array if configured.
+             */
+            'click');
+    },
+
+    //override
+    /** @private */
+    initEvents: function () {
+        
+        //use a slighly enhanced Ext.ux.window.DesktopWindowMgr instead of the default WindowMgr
+        this.manager = this.manager || Ext.ux.window.DesktopWindowMgr;
+
+        //the parent class will register, so no need to do it here:
+        //this.manager = this.manager || Ext.WindowMgr;
+        
+        Ext.ux.window.DesktopWindow.superclass.initEvents.call(this);
+    },
+
+    focus: function () {
+        Ext.ux.window.DesktopWindow.superclass.focus.call(this);
+    },
+    
+    /** @private */
+    toFront: function () {
+        if(this.manager.bringToFront(this)){
+            //only focus if configured as such
+            if(this.focusOnShow){
+                this.focus();
+            }
+        }
+        return this;
+    },
+
+    /** @private */
+    initTools: function () {
+
+        this.addTool({
+            id: 'unpin', // image points left
+            handler: this.handlePin,
+            //set initial visibility (also check if pinState is null)
+            hidden: (!this.pinState || this.pinState === 'pin'), 
+            qtip: this.textPin,
+            scope: this
+        });
+
+        this.addTool({
+            id: 'pin',// image points down
+            handler: this.handleUnpin,
+            hidden: (!this.pinState || this.pinState === 'unpin'), 
+            qtip: this.textUnpin,
+            scope: this
+        });
+
+        if (this.help) {
+            this.addTool({
+                id: 'help',
+                handler: this.handleHelp,
+                qtip: this.textHelp,
+                scope: this
+            });
+        }
+    },
+
+    /** @private */
+    onRender : function (ct, position) {
+        Ext.ux.window.DesktopWindow.superclass.onRender.call(this, ct, position);
+
+        if (this.plain) {
+            this.el.addClass('x-window-plain');
+        }
+
+        // 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.el.dom);
+            this.mask.enableDisplayMode("block");
+            this.mask.hide();
+        }
+    },
+    //override
+    /** @private */
+    onRender: function (ct, position) {
+        /*
+        get here when called by Component class' render method
+        at this point (before calling parent), this.el does not exist yet.
+        so we call parent (default Window Class) onRender...
+        which then calls Panel class onRender...
+        which then calls BoxComponent class onRender...
+        which then calls Component class onRender...
+        and then back to Panel class onRender which 
+            calls Panel class createClasses() method where
+                this.baseCls = 'x-window' and then assigns:
+                this.headerCls
+                this.headerTextClass
+                this.bwrapCls
+                this.tbarCls
+                this.bodyCls
+                this.bbarCls
+                this.footerCls
+            does this.el = ct.createChild(cfg={id: this.id=auto generated, cls: this.baseCls}, position=null) ct=container=viewport
+                Element class createChild() returns Ext.DomHelper.append( ) which calls
+                Element class createHtml(cfg)
+            does this.el.addClass(this.cls) if this.cls is defined
+            special markup for framing...    ***************** adds toolbars, headers, footers, etc.
+                insert Ext.Element.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>
+        */
+        Ext.ux.window.DesktopWindow.superclass.onRender.call(this, ct, position);
+        
+        //after call to parent class onRender this.el exists.
+
+
+        //clip part of the window
+        if (this.clip) {
+            switch (this.clip) {
+            case 'bottom':
+                Ext.destroy(this.getEl().child('.' + this.baseCls + '-bl'));
+                break;
+            }
+        }
+
+        //add a class when hovering over in order to disable
+        //any updates to the window while hovering over
+        if (true) {
+            this.el.addClassOnOver(this.hoverCls);
+        }
+        
+        //add click listener to body
+        Ext.fly(this.body.dom).on('click', this.handleClick, this);
+    },
+
+    /**
+     * Toggles the active pin state.
+     */
+    togglePinState: function () {
+        //check which tool is visible
+        if (this.tools.unpin.isVisible()) {
+            this.handlePin(event, this.tools.unpin, this);
+        } else {
+            this.handleUnpin(event, this.tools.pin, this);
+        }
+    },
+
+    /**
+     * Override to the Panel Class createElement method.  This method is called by
+     * Panel Class' onRender().  Normally the panel class will create a header in the
+     * *-tc class, to utilize the default box class for styling we'll move the header
+     * inside the *-mc class to utilize  
+Ext.Element.boxMarkup:
+<div class="{0}-tl">
+    <div class="{0}-tr">
+        <div class="{0}-tc">
+            ##HEADER##
+            <div class="{0}-header {0}-draggable">
+                <div class="x-tool x-tool-close">
+                </div>
+                <span class="{0}-header-text">
+                </span>
+            </div>
+        </div>
+    </div>
+</div>
+<div class="{0}-ml">
+    <div class="{0}-mr">
+        <div class="{0}-mc">
+            <div class="{0}-body">
+                CONTAINER
+                ###############
+            </div>
+        </div>
+    </div>
+</div>
+<div class="{0}-bl">
+    <div class="{0}-br">
+        <div class="{0}-bc">
+        </div>
+    </div>
+</div>   
+
+
+
+ <div class="x-box-bwrap" id="ext-gen117">
+    <div class="x-box-ml">
+        <div class="x-box-mr">
+            <div class="x-box-mc">
+                <div style="-moz-user-select: none;" id="ext-gen116" class="x-box-header x-unselectable x-window-draggable">
+                    <div id="ext-gen128" class="x-tool x-tool-help">
+                    </div>
+                    <span class="x-box-header-text" id="ext-gen126"><h2>Title</h2></span>
+                </div>
+                <div class="x-box-body" id="ext-gen118" style="height: auto; width: 72px;">
+                    Message
+                </div>
+            </div>
+        </div>
+    </div>
+    <div class="x-box-bl x-panel-nofooter">
+        <div class="x-box-br">
+            <div class="x-box-bc"/>
+        </div>
+    </div>
+</div>
+     * @param {Object} name
+     * @param {Object} pnode
+     *///override panel class method:
+    // private
+    createElement : function (name, pnode) {
+        if (this.shiftHeader) {
+            switch (name) {
+            case 'header':
+                //don't create header yet if putting inside mc, do it when tbar is done
+                return;
+            case 'tbar':
+                Ext.ux.window.DesktopWindow.superclass.createElement.call(this, 'header', pnode);
+                Ext.ux.window.DesktopWindow.superclass.createElement.call(this, name, pnode);
+                return;
+            }
+        }
+        //caught the ones we needed to, call the default implementation
+        Ext.ux.window.DesktopWindow.superclass.createElement.call(this, name, pnode);
+    },
+
+    //override/disable focus, see above.
+    focus: Ext.emptyFn, 
+
+    /** @private */
+    getState : function () {
+        return Ext.apply(Ext.ux.window.DesktopWindow.superclass.getState.call(this) || {}, this.getBox());
+    },
+
+    /**
+     * Handler for when the Desktop Window body is clicked
+     * @param {Object} event The click event.
+     */
+    handleClick: function (event) {
+
+        this.fireEvent('click', this, this.msg);
+        this.togglePinState();
+    },
+
+    /**
+     * Handler for when pin button is clicked
+     * @param {Object} event The click event.
+     * @param {Object} toolEl The tool Element.
+     * @param {Object} panel The host Panel.
+     */
+    handlePin: function (event, toolEl, panel) {
+
+        //hide the unpin button
+        toolEl.hide();
+        
+        //show the pin button
+        this.tools.pin.show();
+
+        this.cancelHiding();
+        
+        this.fireEvent('afterpin', this);
+    },
+
+    /**
+     * Handler for when pin button is clicked
+     * @param {Object} event The click event.
+     * @param {Object} toolEl The tool Element.
+     * @param {Object} panel The host Panel.
+     */
+    handleUnpin: function (event, toolEl, panel) {
+
+        //hide the pin button
+        toolEl.hide();
+        
+        //show the unpin button
+        this.tools.unpin.show();
+
+        this.hide();
+
+        this.fireEvent('afterunpin', this);
+    },
+
+    /**
+     * cancel hiding of the window if {@link #autoHide} is true
+     */
+    cancelHiding: function () {
+        this.addClass('fixed');
+        if (this.autoHide) {
+            if (this.pinState === 'unpin') {
+                this.task.cancel();
+            }
+        }
+        //show the pin button
+        this.tools.pin.show();
+        //make sure the unpin button is hidden
+        this.tools.unpin.hide();
+        
+    },
+
+    //override parent method
+    /** @private */
+    animHide: function () {
+
+        //remove the module of this element from the manager
+        this.manager.modules.remove(this.pos);
+
+        //element to hide and configured Fx
+        var w, fx = this.hideFx || {};
+
+        //animate using a proxy instead of actual element if so configured
+        if (fx.useProxy) {
+            w = this.proxy;
+            this.proxy.setOpacity(0.5);
+            this.proxy.show();
+            var tb = this.getBox(false);
+            this.proxy.setBox(tb);
+            this.el.hide();
+            Ext.apply(fx, tb);
+        } else {
+            w = this.el;
+        }
+        
+        Ext.applyIf(fx, {
+            block: false,//default for window is true
+            callback: this.afterHide,
+            easing: 'easeOut',//'easeNone';
+            remove: true,
+            scope: this
+        });
+        
+        switch (fx.mode) {
+        case 'none':
+            break;
+        case 'slideIn':
+            w[fx.mode]("b", fx);
+//            w.slideIn("b", fx);
+            break;
+        case 'custom':
+            Ext.callback(fx.callback, fx.scope, [this, w, fx]);//callback(cb,scope,args,delay)
+            break;
+        case 'standard':
+            fx.duration = fx.duration || 0.25;
+            fx.opacity = 0;
+            w.shift(fx);
+            break;
+        default:
+            fx.duration = fx.duration || 1;
+            w.ghost("b", fx);
+            break;
+        }
+    },
+
+    //override parent method
+    /** @private */
+    afterShow: function () {
+        Ext.ux.window.DesktopWindow.superclass.afterShow.call(this);
+        
+        //if user moves remove from module manager and cancel hiding
+		this.on('move', function(){
+            //remove the module of this element from the manager
+            this.manager.modules.remove(this.pos);
+            this.cancelHiding();
+		}, this);
+
+        if (this.autoHide) {
+           if (this.pinState === 'unpin') {
+                this.task.delay(this.hideFx.delay);
+            }
+        }
+    },
+
+    /**
+     * some cleanup still needed this method
+     * sizing / placement issues when height of windows changes
+     * should recalculate placement based on window height
+     */
+    /** @private */
+    animShow: function () {
+
+        //don't update if hovering over message
+        //check if visible so it will show initially
+        if (this.el.isVisible() && this.el.hasClass(this.hoverCls)) {
+            return;
+        }
+
+        if (this.msgs.length > 1) {
+            this.updateMsg();
+        }
+/*
+//for reference
+this.el.disableShadow();
+this.setmodule(0, 0);
+
+delete this.el.lastXY;
+delete this.el.lastLT;
+if(this.x === undefined || this.y === undefined){
+    var xy = this.el.getAlignToXY(this.container, 'c-c');
+    var pos = this.el.translatePoints(xy[0], xy[1]);
+    this.x = this.x === undefined? pos.left : this.x;
+    this.y = this.y === undefined? pos.top : this.y;
+}
+this.el.setLeftTop(this.x, this.y);
+
+alignTo        : 'tl',
+alignToXY      :  [ 5, (this.el.getComputedHeight() * -1) + 5],
+slideDirection : 'b'
+
+console.info('this.el.lastXY',this.el.lastXY);
+console.info('this.el.lastLT',this.el.lastLT);
+console.info('this.el.x',this.el.x);
+console.info('this.el.y',this.el.y);
+console.info('this.el.getComputedHeight()',this.el.getComputedHeight());
+console.log('====');
+*/
+
+        //element to hide and configured Fx
+        var w = this.el, fx = this.showFx || {};
+
+        this.origin = this.origin || {};
+
+        //apply defaults if not already configured
+        Ext.applyIf(this.origin, {
+            el: Ext.getDoc(), //defaults to document
+            increment: true, //whether to increment module of subsequent messages
+            pos: "br-br",//module to align to (see {@link Ext.Element#alignTo} for more details defaults to "br-br").
+            offX: -20, //amount to offset horizontally
+            offY: -20, //amount to offset vertically
+            spaY: 5    //vertical spacing between adjacent messages
+        });
+       
+        //track positions of each instance
+        this.pos = 0;
+
+        if (this.origin.increment) {
+            while (this.manager.modules.indexOf(this.pos) > -1) {
+                this.pos++;
+            }
+            this.manager.modules.push(this.pos);
+        }
+
+        var y = this.origin.offY - ((this.getSize().height + this.origin.spaY) * this.pos);            
+        
+//unused t (used for debugging)
+        var t = this.getSize();
+        
+        //set the window size
+        this.setSize(this.width || this.minWidth, this.height || this.minHeight);
+
+        //increment the vertical position of the window
+        if (this.origin.increment) {
+            y = this.origin.offY - ((this.getSize().height + this.origin.spaY) * this.pos);            
+        } else {
+            y = 0;
+        }
+
+        w.alignTo(
+            this.origin.el, // element to align to.
+            this.origin.pos,        // position to align to (see {@link Ext.Element#alignTo} for more details).
+            [ this.origin.offX, y ] // Offset the positioning by [x, y]: 
+        );
+        
+        w.slideIn('b', {
+            duration: fx.duration || 1,
+            callback: this.afterShow,
+            scope: this
+        });
+    },
+
+    onMouseout: function () {
+        //console.info('in onMouseout');
+        //console.info(arguments);
+    },
+
+
+    /**
+     * @param {Object} el
+     * @param {Object} x
+     * @param {Object} y
+     * @private
+     */
+	positionPanel: function (el, x, y) {
+        if(x && typeof x[1] == 'number'){
+            y = x[1];
+            x = x[0];
+        }
+        el.pageX = x;
+        el.pageY = y;
+       	
+        if(x === undefined || y === undefined){ // cannot translate undefined points
+            return;
+        }
+        
+        if(y < 0){ y = 10; }
+        
+        var p = el.translatePoints(x, y);
+        el.setLocation(p.left, p.top);
+        return el;
+    },
+
+    /**
+     * Specify the message to be shown
+     * @param {String} msg Message to update the body with.
+     */
+    setMessage: function (msg) {
+        this.body.update(msg);
+    },
+
+    /**
+     * Set the title of the Desktop Window
+     * @param {String} title Title of Window
+     * @param {String} iconCls icon to use in header area
+     */
+    setTitle: function (title, iconCls) {
+        Ext.ux.window.DesktopWindow.superclass.setTitle.call(this, title, iconCls || this.iconCls);
+    },
+
+    /**
+     * Start recurring messages
+     * @param {Boolean} update Whether to update the message before starting automatic refreshes.
+     */
+
+    startAutoRefresh : function(update){
+        if(update){
+            this.updateMsg(true);
+        }
+        if(this.autoRefreshProcId){
+            clearInterval(this.autoRefreshProcId);
+        }
+        // native javascript function to delay for a specified time before triggering the
+        // execution of a specific function. After triggering the called function the command
+        // doesn't complete. Instead it waits for the specified time again and then triggers
+        // the function again and continues to repeat this process of triggering the function
+        // at the specified intervals until either the web page is unloaded or the clearInterval
+        // function is called.
+        this.autoRefreshProcId = setInterval(this.animShow.createDelegate(this, []), this.interval);
+    },
+
+    /**
+     * Stop recurring messages
+     */
+    stopAutoRefresh : function(){
+        if(this.autoRefreshProcId){
+            clearInterval(this.autoRefreshProcId);
+        }
+    },
+
+    /**
+     * Update the message
+     * @param {String} msg The updated msg
+     */
+    updateMsg: function (msg) {
+
+        //don't update if hovering over message
+        if (this.el && !this.el.hasClass(this.hoverCls)) {
+
+            if (msg) {
+//                console.info('message passed');   
+            } else {
+                this.msgIndex = this.msgs[this.msgIndex + 1] ? this.msgIndex + 1 : 0;
+                this.msg = this.msgs[this.msgIndex];
+            }
+
+            //update the innerHTML of element
+            //this.el.dom.update(this.msg.text);
+            this.body.update(this.msg.text);
+        } else {
+            //console.info('hovering');
+        }
+    }    
+});
+
+//register the xtype
+Ext.reg('desktop-window', Ext.ux.window.DesktopWindow);
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/core/HexField.js
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/core/HexField.js	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/core/HexField.js	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,108 @@
+/**
+ * @author t.murdock
+ *
+ * @class Ext.ux.form.HexField
+ * @extends Ext.form.TextField
+ * 
+ * Will only allow Hex values
+ */
+
+Ext.namespace("Ext.ux.form");
+
+Ext.ux.form.HexField = Ext.extend(Ext.form.TextField,  {
+	initEvents : function(){
+		Ext.ux.form.HexField.superclass.initEvents.call(this);
+		
+		var keyPress = function(e){
+			var k = e.getKey();
+			
+			if(!Ext.isIE && (e.isSpecialKey() || k == e.BACKSPACE || k == e.DELETE)){
+				return;
+			}
+			
+			// allowed text characters
+			var allowed = '0123456789abcdefABCDEF';
+			
+			// get selected text length
+			var selection = new Ext.ux.form.HexField.Selection( document.getElementById(this.id) );
+			var s = selection.create();
+			var selLength = s.end - s.start;
+			
+			// get text character keyed in
+			var c = e.getCharCode();
+			var c = String.fromCharCode(c);
+			var value = c + this.getValue();
+			
+			if(allowed.indexOf(c) === -1 || (value.length > 6 && selLength === 0) ){
+				e.stopEvent();
+			}
+		};
+		this.el.on("keypress", keyPress, this);
+	}
+	
+	, validateValue : function(value){
+		if(!Ext.ux.form.HexField.superclass.validateValue.call(this, value)){
+			return false;
+		}
+		if(!/^[0-9a-fA-F]{6}$/.test(value)){
+			return false;
+		}
+		return true;
+    }
+});
+Ext.reg('hexfield', Ext.ux.form.HexField);
+
+Ext.ux.form.HexField.Selection = function(textareaElement) {
+    this.element = textareaElement;
+};
+
+Ext.ux.form.HexField.Selection.prototype.create = function() {
+    if (document.selection != null && this.element.selectionStart == null) {
+        return this._ieGetSelection();
+    } else {
+        return this._mozillaGetSelection();
+    }
+}
+
+Ext.ux.form.HexField.Selection.prototype._mozillaGetSelection = function() {
+    return { 
+        start: this.element.selectionStart, 
+        end: this.element.selectionEnd 
+    };
+}
+
+Ext.ux.form.HexField.Selection.prototype._ieGetSelection = function() {
+    this.element.focus();
+
+    var range = document.selection.createRange();
+    var bookmark = range.getBookmark();
+
+    var contents = this.element.value;
+    var originalContents = contents;
+    var marker = this._createSelectionMarker();
+    while(contents.indexOf(marker) != -1) {
+        marker = this._createSelectionMarker();
+    }
+
+    var parent = range.parentElement();
+    if (parent == null || parent.type != "text") {
+        return { start: 0, end: 0 };
+    }
+    range.text = marker + range.text + marker;
+    contents = this.element.value;
+
+    var result = {};
+    result.start = contents.indexOf(marker);
+    contents = contents.replace(marker, "");
+    result.end = contents.indexOf(marker);
+
+    this.element.value = originalContents;
+    range.moveToBookmark(bookmark);
+    range.select();
+	
+    return result;
+}
+
+Ext.ux.form.HexField.Selection.prototype._createSelectionMarker = function() {
+    return "##SELECTION_MARKER_" + Math.random() + "##";
+}
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/core/Module.js
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/core/Module.js	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/core/Module.js	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,110 @@
+/*
+ * qWikiOffice Desktop 0.8.1
+ * Copyright(c) 2007-2008, Integrated Technologies, Inc.
+ * licensing@xxxxxxxxxxxxxxx
+ * 
+ * http://www.qwikioffice.com/license
+ *
+ * NOTE:
+ * This code is based on code from the original Ext JS desktop demo.
+ * I have made many modifications/additions.
+ *
+ * The Ext JS licensing can be viewed here:
+ *
+ * Ext JS Library 2.0 Beta 2
+ * Copyright(c) 2006-2007, Ext JS, LLC.
+ * licensing@xxxxxxxxx
+ * 
+ * http://extjs.com/license
+ */
+
+Ext.app.Module = function(config){
+    Ext.apply(this, config);
+    Ext.app.Module.superclass.constructor.call(this);
+    //this.init();//this was the original version's way to initialize the launchers (no longer needed)
+}
+
+Ext.extend(Ext.app.Module, Ext.util.Observable, {
+    /**
+     * Read only. {object}
+     * Override this with the launcher for your module.
+     * 
+     * Example:
+     * 
+     * {
+     *    iconCls: 'pref-icon',
+     *    handler: this.createWindow,
+     *    scope: this,
+     *    shortcutIconCls: 'pref-shortcut-icon',
+     *    text: 'Preferences',
+     *    tooltip: '<b>Preferences</b><br />Allows you to modify your desktop'
+     * }
+     */
+    launcher : null,
+    
+    /**
+     * Read only. {boolean}
+     * Ext.app.App uses this property to determine if the module has been loaded.
+     */
+	loaded : false,
+	/**
+	 * Read only. {string}
+	 * Override this with the menu path for your module.
+	 * Ext.app.App uses this property to add this module to the Start Menu.
+	 * 
+	 * Case sensitive options are:
+	 * 
+	 * 1. StartMenu
+	 * 2. ToolMenu
+	 * 
+	 * Example:
+	 * 
+	 * menuPath: 'StartMenu/Bogus Menu'
+	 */	
+	menuPath : 'StartMenu',
+    /**
+     * Read only. {string}
+     * Override this with the type of your module.
+     * Example: 'system/preferences'
+     */
+    moduleType : null,
+    
+    /**
+     * Read only. {string}
+     * Override this with the unique id of your module.
+     */
+    moduleId : null,
+    
+    /**
+     * Override this to initialize your module.
+     */
+    init : Ext.emptyFn,
+    
+    /**
+     * Override this function to create your modules.
+     * window.
+     */
+    createWindow : Ext.emptyFn,
+    
+    /**
+     * @param {array} An array of request objects
+     *
+     * Override this function to handle requests from other modules.
+     * Expect the passed in param to look like the following.
+     * 
+     * {
+     *    requests: [
+     *       {
+     *          action: 'createWindow',
+     *          params: '',
+     *          callback: this.myCallbackFunction,
+     *          scope: this
+     *       },
+     *       { ... }
+     *    ]
+     * }
+     *
+     * View makeRequest() in App.js for more details.
+     */
+    handleRequest : Ext.emptyFn
+});
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/core/Notification.js
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/core/Notification.js	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/core/Notification.js	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,88 @@
+/*
+ * qWikiOffice Desktop 0.8.0
+ * Copyright(c) 2007-2008, Integrated Technologies, Inc.
+ * licensing@xxxxxxxxxxxxxxx
+ * 
+ * http://www.qwikioffice.com/license
+ *
+ * Ext.ux.Notification is based on code from the Ext JS forum.
+ * I have made some minor modifications.
+ */
+
+Ext.ux.NotificationMgr = {
+    positions: []
+};
+
+Ext.ux.Notification = Ext.extend(Ext.Window, {
+    initComponent : function(){
+        Ext.apply(this, {
+            iconCls: this.iconCls || 'x-icon-information'
+            , width: 200
+            , autoHeight: true
+            , closable: true
+            , plain: false
+            , draggable: false
+            , bodyStyle: 'text-align:left;padding:10px;'
+            , resizable: false
+        });
+        if(this.autoDestroy){
+            this.task = new Ext.util.DelayedTask(this.close, this);
+        }else{
+            this.closable = true;
+        }
+        Ext.ux.Notification.superclass.initComponent.call(this);
+    }
+
+    , setMessage : function(msg){
+        this.body.update(msg);
+    }
+    
+    , setTitle : function(title, iconCls){
+        Ext.ux.Notification.superclass.setTitle.call(this, title, iconCls||this.iconCls);
+    }
+
+    , onRender : function(ct, position) {
+        Ext.ux.Notification.superclass.onRender.call(this, ct, position);
+    }
+
+    , onDestroy : function(){
+        Ext.ux.NotificationMgr.positions.remove(this.pos);
+        Ext.ux.Notification.superclass.onDestroy.call(this);
+    }
+
+    , afterShow : function(){
+        Ext.ux.Notification.superclass.afterShow.call(this);
+        this.on('move', function(){
+            Ext.ux.NotificationMgr.positions.remove(this.pos);
+            if(this.autoDestroy){
+                this.task.cancel();
+            }
+        }, this);
+        if(this.autoDestroy){
+            this.task.delay(this.hideDelay || 5000);
+        }
+    }
+
+    , animShow : function(){
+        this.pos = 0;
+        while(Ext.ux.NotificationMgr.positions.indexOf(this.pos)>-1){
+            this.pos++;
+        }
+        Ext.ux.NotificationMgr.positions.push(this.pos);
+        this.setSize(200,100);
+        this.el.alignTo(this.animateTarget || document, "br-tr", [ -1, -1-((this.getSize().height+10)*this.pos) ]);
+        this.el.slideIn('b', {
+            duration: .7
+            , callback: this.afterShow
+            , scope: this
+        });
+    }
+
+    , animHide : function(){
+        Ext.ux.NotificationMgr.positions.remove(this.pos);
+        this.el.ghost("b", {
+            duration: 1
+            , remove: true
+        });
+    }
+});
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/core/Shortcut.js
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/core/Shortcut.js	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/core/Shortcut.js	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,179 @@
+/*
+ * qWikiOffice Desktop 0.8.1
+ * Copyright(c) 2007-2008, Integrated Technologies, Inc.
+ * licensing@xxxxxxxxxxxxxxx
+ * 
+ * http://www.qwikioffice.com/license
+ */
+
+Ext.namespace("Ext.ux");
+
+Ext.ux.Shortcuts = function(config){
+    var desktopEl = Ext.get(config.renderTo)
+        , taskbarEl = config.taskbarEl
+        , btnHeight = 74
+        , btnWidth = 64
+        , btnPadding = 15
+        , col = null
+        , row = null
+        , items = [];
+    
+    initColRow();
+    
+    function initColRow(){
+        col = {index: 1, x: btnPadding};
+        row = {index: 1, y: btnPadding};
+    }
+    
+    function isOverflow(y){
+        if(y > (Ext.lib.Dom.getViewHeight() - taskbarEl.getHeight())){
+            return true;
+        }
+        return false;
+    }
+    
+    this.addShortcut = function(config){
+        var div = desktopEl.createChild({tag:'div', cls: 'ux-shortcut-item'}),
+            btn = new Ext.ux.ShortcutButton(Ext.apply(config, {
+                text: Ext.util.Format.ellipsis(config.text, 16)
+            }), div);
+        
+        //btn.container.initDD('DesktopShortcuts');
+        
+        items.push(btn);
+        this.setXY(btn.container);
+        
+        return btn;
+    };
+    
+    this.removeShortcut = function(b){
+        var d = document.getElementById(b.container.id);
+        
+        b.destroy();
+        d.parentNode.removeChild(d);
+        
+        var s = [];
+        for(var i = 0, len = items.length; i < len; i++){
+            if(items[i] != b){
+                s.push(items[i]);
+            }
+        }
+        items = s;
+        
+        this.handleUpdate();
+    }
+    
+    this.handleUpdate = function(){
+        initColRow();
+        for(var i = 0, len = items.length; i < len; i++){
+            this.setXY(items[i].container);
+        }
+    }
+    
+    this.setXY = function(item){
+        var bottom = row.y + btnHeight,
+            overflow = isOverflow(row.y + btnHeight);
+        
+        if(overflow && bottom > (btnHeight + btnPadding)){
+            col = {
+                index: col.index++
+                , x: col.x + btnWidth + btnPadding
+            };
+            row = {
+                index: 1
+                , y: btnPadding
+            };
+        }
+        
+        item.setXY([
+            col.x
+            , row.y
+        ]);
+        
+        row.index++;
+        row.y = row.y + btnHeight + btnPadding;
+    };
+    
+    Ext.EventManager.onWindowResize(this.handleUpdate, this, {delay:500});
+};
+
+
+
+/**
+ * @class Ext.ux.ShortcutButton
+ * @extends Ext.Button
+ */
+Ext.ux.ShortcutButton = function(config, el){
+    
+    Ext.ux.ShortcutButton.superclass.constructor.call(this, Ext.apply(config, {
+        renderTo: el,
+        //clickEvent: 'dblclick',
+        template: new Ext.Template(
+            '<div class="ux-shortcut-btn"><div>',
+                '<img src="'+Ext.BLANK_IMAGE_URL+'" />',
+                '<div class="ux-shortcut-btn-text">{0}</div>',
+            '</div></div>')
+    }));
+    
+};
+
+Ext.extend(Ext.ux.ShortcutButton, Ext.Button, {
+
+    buttonSelector : 'div:first',
+    
+    /* onRender : function(){
+        Ext.ux.ShortcutButton.superclass.onRender.apply(this, arguments);
+
+        this.cmenu = new Ext.menu.Menu({
+            items: [{
+                id: 'open',
+                text: 'Open',
+                //handler: this.win.minimize,
+                scope: this.win
+            }, '-', {
+                id: 'remove',
+                iconCls: 'remove',
+                text: 'Remove Shortcut',
+                //handler: this.closeWin.createDelegate(this, this.win, true),
+                scope: this.win
+            }]
+        });
+
+        this.el.on('contextmenu', function(e){
+            e.stopEvent();
+            if(!this.cmenu.el){
+                this.cmenu.render();
+            }
+            var xy = e.getXY();
+            xy[1] -= this.cmenu.el.getHeight();
+            this.cmenu.showAt(xy);
+        }, this);
+    }, */
+    
+    initButtonEl : function(btn, btnEl){
+        Ext.ux.ShortcutButton.superclass.initButtonEl.apply(this, arguments);
+        
+        btn.removeClass("x-btn");
+        
+        if(this.iconCls){
+            if(!this.cls){
+                btn.removeClass(this.text ? 'x-btn-text-icon' : 'x-btn-icon');
+            }
+        }
+    },
+    
+    autoWidth : function(){
+        // do nothing
+    },
+    
+    /**
+     * Sets this shortcut button's text
+     * @param {String} text The button text
+     */
+    setText : function(text){
+        this.text = text;
+        if(this.el){
+            this.el.child("div.ux-shortcut-btn-text").update(text);
+        }
+    }
+});
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/core/StartMenu.js
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/core/StartMenu.js	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/core/StartMenu.js	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,327 @@
+/*
+ * qWikiOffice Desktop 0.8.1
+ * Copyright(c) 2007-2008, Integrated Technologies, Inc.
+ * licensing@xxxxxxxxxxxxxxx
+ * 
+ * http://www.qwikioffice.com/license
+ */
+
+/**
+ * @class Ext.ux.StartMenu
+ * @extends Ext.menu.Menu
+ * A start menu object.
+ * @constructor
+ * Creates a new StartMenu
+ * @param {Object} config Configuration options
+ *
+ * SAMPLE USAGE:
+ *
+ * this.startMenu = new Ext.ux.StartMenu({
+ *		iconCls: 'user',
+ *		height: 300,
+ *		shadow: true,
+ *		title: get_cookie('memberName'),
+ *		toolPanelWidth: 110,
+ *		width: 300
+ *	});
+ *
+ * this.startMenu.add({
+ *		text: 'Grid Window',
+ *		iconCls:'icon-grid',
+ *		handler : this.createWindow,
+ *		scope: this
+ *	});
+ *
+ * this.startMenu.addTool({
+ *		text:'Logout',
+ *		iconCls:'logout',
+ *		handler:function(){ window.location = "logout.php"; },
+ *		scope:this
+ *	});
+ */
+
+Ext.namespace("Ext.ux");
+
+Ext.ux.StartMenu = function(config){
+    Ext.ux.StartMenu.superclass.constructor.call(this, config);
+    
+    var tools = this.toolItems;
+    this.toolItems = new Ext.util.MixedCollection();
+    if(tools){
+        this.addTool.apply(this, tools);
+    }
+};
+
+Ext.extend(Ext.ux.StartMenu, Ext.menu.Menu, {
+    height : 300,
+    toolPanelWidth : 100,
+    width : 300,
+    
+    // private
+    render : function(){
+        if(this.el){
+            return;
+        }
+        var el = this.el = new Ext.Layer({
+            cls: "x-menu ux-start-menu",
+            shadow:this.shadow,
+            constrain: false,
+            parentEl: this.parentEl || document.body,
+            zindex:15000
+        });
+        
+        var header = el.createChild({
+            tag: "div" /*,
+            cls: "x-window-header x-unselectable x-panel-icon "//+this.iconCls */
+        });
+        header.setStyle('padding', '7px 0 0 0');
+        
+        this.header = header;
+        /* Don't create header text span tag.
+         * Can be uncommented.
+        var headerText = header.createChild({
+            tag: "span",
+            cls: "x-window-header-text"
+        }); */
+        var tl = header.wrap({
+            cls: "ux-start-menu-tl"
+        });
+        var tr = header.wrap({
+            cls: "ux-start-menu-tr"
+        });
+        var tc = header.wrap({
+            cls: "ux-start-menu-tc"
+        });
+        
+        this.menuBWrap = el.createChild({
+            tag: "div",
+            cls: "ux-start-menu-body x-border-layout-ct ux-start-menu-body"
+        });
+        var ml = this.menuBWrap.wrap({
+            cls: "ux-start-menu-ml"
+        });
+        var mc = this.menuBWrap.wrap({
+            cls: "ux-start-menu-mc ux-start-menu-bwrap"
+        });
+        
+        this.menuPanel = this.menuBWrap.createChild({
+            tag: "div",
+            cls: "x-panel x-border-panel ux-start-menu-apps-panel opaque"
+        });
+        this.toolsPanel = this.menuBWrap.createChild({
+            tag: "div",
+            cls: "x-panel x-border-panel ux-start-menu-tools-panel"
+        });
+        
+        var bwrap = ml.wrap({cls: "x-window-bwrap"});
+        var bc = bwrap.createChild({
+            tag: "div",
+            cls: "ux-start-menu-bc"
+        });
+        var bl = bc.wrap({
+            cls: "ux-start-menu-bl x-panel-nofooter"
+        });
+        var br = bc.wrap({
+            cls: "ux-start-menu-br"
+        });
+        
+        bc.setStyle({
+            height: '0px',
+            padding: '0 0 6px 0'
+        });
+        
+        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 = this.menuPanel.createChild({
+            tag: "ul",
+            cls: "x-menu-list"});
+        var toolsUl = this.toolsPanel.createChild({
+            tag: "ul",
+            cls: "x-menu-list"
+        });
+        
+        var ulListeners = {
+            "click": {
+                fn: this.onClick,
+                scope: this
+            },
+            "mouseover": {
+                fn: this.onMouseOver,
+                scope: this
+            },
+            "mouseout": {
+                fn: this.onMouseOut,
+                scope: this
+            }
+        };
+        
+        ul.on(ulListeners);
+        
+        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();
+
+        toolsUl.on(ulListeners);
+        
+        this.toolItems.each(
+            function(item){
+                var li = document.createElement("li");
+                li.className = "x-menu-list-item";
+                toolsUl.dom.appendChild(li);
+                item.render(li, this);
+            }, this);
+            
+        this.toolsUl = toolsUl;
+        this.autoWidth();
+             
+        this.menuBWrap.setStyle('position', 'relative');  
+        this.menuBWrap.setHeight(this.height);
+        
+        this.menuPanel.setStyle({
+            padding: '2px',
+            position: 'absolute',
+            overflow: 'auto'
+        });
+        
+        this.toolsPanel.setStyle({
+            padding: '2px 4px 2px 2px',
+            position: 'absolute',
+            overflow: 'auto'
+        });
+        
+        this.setTitle(this.title);
+    },
+    
+    // private
+    findTargetItem : function(e){
+        var t = e.getTarget(".x-menu-list-item", this.ul,  true);
+        if(t && t.menuItemId){
+            if(this.items.get(t.menuItemId)){
+                return this.items.get(t.menuItemId);
+            }else{
+                return this.toolItems.get(t.menuItemId);
+            }
+        }
+    },
+
+    /**
+     * Displays this menu relative to another element
+     * @param {Mixed} 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.ux.StartMenu} 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);
+        
+        var tPanelWidth = this.toolPanelWidth;      
+        var box = this.menuBWrap.getBox();
+        this.menuPanel.setWidth(box.width-tPanelWidth);
+        this.menuPanel.setHeight(box.height);
+        
+        this.toolsPanel.setWidth(tPanelWidth);
+        this.toolsPanel.setX(box.x+box.width-tPanelWidth);
+        this.toolsPanel.setHeight(box.height);
+    },
+    
+    addTool : 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.addToolItem(el);
+            }else if(typeof el == "string"){ // string
+                if(el == "separator" || el == "-"){
+                    item = this.addToolSeparator();
+                }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.addToolMenuItem(el);
+            }
+        }
+        return item;
+    },
+    
+    /**
+     * Adds a separator bar to the Tools
+     * @return {Ext.menu.Item} The menu item that was added
+     */
+    addToolSeparator : function(){
+        return this.addToolItem(new Ext.menu.Separator({itemCls: 'ux-toolmenu-sep'}));
+    },
+
+    addToolItem : function(item){
+        this.toolItems.add(item);
+        if(this.toolsUl){
+            var li = document.createElement("li");
+            li.className = "x-menu-list-item";
+            this.toolsUl.dom.appendChild(li);
+            item.render(li, this);
+            this.delayAutoWidth();
+        }
+        return item;
+    },
+
+    addToolMenuItem : function(config){
+        if(!(config instanceof Ext.menu.Item)){
+            if(typeof config.checked == "boolean"){ // must be check menu item config?
+                config = new Ext.menu.CheckItem(config);
+            }else{
+                config = new Ext.menu.Item(config);
+                //config = new Ext.menu.Adapter(this.getToolButton(config), {canActivate:true});
+            }
+        }
+        return this.addToolItem(config);
+    },
+    
+    setTitle : function(title, iconCls){
+        this.title = title;
+        if(this.header.child('span')){
+            this.header.child('span').update(title);
+        }
+        return this;
+    },
+    
+    getToolButton : function(config){
+        var btn = new Ext.Button({
+            handler: config.handler,
+            //iconCls: config.iconCls,
+            minWidth: this.toolPanelWidth-10,
+            scope: config.scope,
+            text: config.text
+        });
+        
+        return btn;
+    }
+});
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/core/TaskBar.js
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/core/TaskBar.js	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/core/TaskBar.js	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,699 @@
+/*
+ * qWikiOffice Desktop 0.8.1
+ * Copyright(c) 2007-2008, Integrated Technologies, Inc.
+ * licensing@xxxxxxxxxxxxxxx
+ * 
+ * http://www.qwikioffice.com/license
+ */
+
+Ext.namespace("Ext.ux");
+
+/**
+ * @class Ext.ux.TaskBar
+ * @extends Ext.util.Observable
+ */
+Ext.ux.TaskBar = function(app){
+    this.app = app;
+    this.init();
+}
+
+Ext.extend(Ext.ux.TaskBar, Ext.util.Observable, {
+    init : function(){
+        this.startMenu = new Ext.ux.StartMenu(Ext.apply({
+            iconCls: 'user',
+            height: 300,
+            shadow: true,
+            title: 'Todd Murdock',
+            width: 300
+        }, this.app.startConfig));
+        
+        this.startButton = new Ext.Button({
+            text: 'Start',
+            id: 'ux-startbutton',
+            iconCls: 'start',
+            menu: this.startMenu,
+            menuAlign: 'bl-tl',
+            renderTo: 'ux-taskbar-start'
+        });
+        
+        var startWidth = Ext.get('ux-startbutton').getWidth() + 10;
+        
+        var sbBox = new Ext.BoxComponent({
+            el: 'ux-taskbar-start',
+            id: 'TaskBarStart',
+            minWidth: startWidth,
+            region:'west',
+            split: false,
+            width: startWidth
+        });
+        
+        this.quickStartPanel = new Ext.ux.QuickStartPanel({
+            el: 'ux-quickstart-panel',
+            id: 'TaskBarQuickStart',
+            minWidth: 60,
+            region:'west',
+            split: true,
+            width: 94
+        });
+        
+        this.taskButtonPanel = new Ext.ux.TaskButtonsPanel({
+            el: 'ux-taskbuttons-panel',
+            id: 'TaskBarButtons',
+            region:'center'
+        });
+        
+        /* this.trayPanel = new Ext.ux.QuickStartPanel({ // Todo: make the system tray
+            el: 'ux-systemtray-panel',
+            id: 'TaskBarSystemTray',
+            minWidth: 100,
+            region:'east',
+            split: true,
+            width: 180
+        }); */
+        
+        var panelWrap = new Ext.Container({
+            el: 'ux-taskbar-panel-wrap',
+            items: [this.quickStartPanel,this.taskButtonPanel],
+            layout: 'border',
+            region: 'center'
+        });
+                
+        var container = new Ext.ux.TaskBarContainer({
+            el: 'ux-taskbar',
+            layout: 'border',
+            items: [sbBox,panelWrap]
+        });
+        this.el = container.el;
+        
+        return this;
+    },
+    
+    setActiveButton : function(btn){
+        this.taskButtonPanel.setActiveButton(btn);
+    }
+});
+
+
+
+/**
+ * @class Ext.ux.TaskBarContainer
+ * @extends Ext.Container
+ */
+Ext.ux.TaskBarContainer = Ext.extend(Ext.Container, {
+    initComponent : function() {
+        Ext.ux.TaskBarContainer.superclass.initComponent.call(this);
+        
+        this.el = Ext.get(this.el) || Ext.getBody();
+        this.el.setHeight = Ext.emptyFn;
+        this.el.setWidth = Ext.emptyFn;
+        this.el.setSize = Ext.emptyFn;
+        this.el.setStyle({
+            overflow:'hidden',
+            margin:'0',
+            border:'0 none'
+        });
+        this.el.dom.scroll = 'no';
+        this.allowDomMove = false;
+        this.autoWidth = true;
+        this.autoHeight = true;
+        Ext.EventManager.onWindowResize(this.fireResize, this);
+        this.renderTo = this.el;
+    },
+
+    fireResize : function(w, h){
+        this.fireEvent('resize', this, w, h, w, h);
+    }
+});
+
+
+
+/**
+ * @class Ext.ux.TaskButtonsPanel
+ * @extends Ext.BoxComponent
+ */
+Ext.ux.TaskButtonsPanel = Ext.extend(Ext.BoxComponent, {
+    activeButton: null,
+    enableScroll: true,
+    scrollIncrement: 0,
+    scrollRepeatInterval: 400,
+    scrollDuration: .35,
+    animScroll: true,
+    resizeButtons: true,
+    buttonWidth: 168,
+    minButtonWidth: 118,
+    buttonMargin: 0,//2,
+    buttonWidthSet: false,
+    
+    initComponent : function() {
+        Ext.ux.TaskButtonsPanel.superclass.initComponent.call(this);
+        this.on('resize', this.delegateUpdates);
+        this.items = [];
+        
+        this.stripWrap = Ext.get(this.el).createChild({
+            cls: 'ux-taskbuttons-strip-wrap',
+            cn: {
+                tag:'ul', cls:'ux-taskbuttons-strip'
+            }
+        });
+        this.stripSpacer = Ext.get(this.el).createChild({
+            cls:'ux-taskbuttons-strip-spacer'
+        });
+        this.strip = new Ext.Element(this.stripWrap.dom.firstChild);
+        
+        this.edge = this.strip.createChild({
+            tag:'li',
+            cls:'ux-taskbuttons-edge'
+        });
+        this.strip.createChild({
+            cls:'x-clear'
+        });
+    },
+    
+    add : function(win){
+        var li = this.strip.createChild({tag:'li'}, this.edge); // insert before the edge
+        var btn = new Ext.ux.TaskBar.TaskButton(win, li);
+        
+        this.items.push(btn);
+        
+        if(!this.buttonWidthSet){
+            this.lastButtonWidth = btn.container.getWidth();
+        }
+        
+        this.setActiveButton(btn);
+        return btn;
+    },
+    
+    remove : function(btn){
+        var li = document.getElementById(btn.container.id);
+        btn.destroy();
+        li.parentNode.removeChild(li);
+        
+        var s = [];
+        for(var i = 0, len = this.items.length; i < len; i++) {
+            if(this.items[i] != btn){
+                s.push(this.items[i]);
+            }
+        }
+        this.items = s;
+        
+        this.delegateUpdates();
+    },
+    
+    setActiveButton : function(btn){
+        this.activeButton = btn;
+        this.delegateUpdates();
+    },
+    
+    delegateUpdates : function(){
+        /*if(this.suspendUpdates){
+            return;
+        }*/
+        if(this.resizeButtons && this.rendered){
+            this.autoSize();
+        }
+        if(this.enableScroll && this.rendered){
+            this.autoScroll();
+        }
+    },
+    
+    autoSize : function(){
+        var count = this.items.length;
+        var ow = this.el.dom.offsetWidth;
+        var aw = this.el.dom.clientWidth;
+
+        if(!this.resizeButtons || count < 1 || !aw){ // !aw for display:none
+            return;
+        }
+        
+        var each = Math.max(Math.min(Math.floor((aw-4) / count) - this.buttonMargin, this.buttonWidth), this.minButtonWidth); // -4 for float errors in IE
+        var btns = this.stripWrap.dom.getElementsByTagName('button');
+        
+        this.lastButtonWidth = Ext.get(btns[0].id).findParent('li').offsetWidth;
+        
+        for(var i = 0, len = btns.length; i < len; i++) {            
+            var btn = btns[i];
+            
+            var tw = Ext.get(btns[i].id).findParent('li').offsetWidth;
+            var iw = btn.offsetWidth;
+            
+            btn.style.width = (each - (tw-iw)) + 'px';
+        }
+    },
+    
+    autoScroll : function(){
+        var count = this.items.length;
+        var ow = this.el.dom.offsetWidth;
+        var tw = this.el.dom.clientWidth;
+        
+        var wrap = this.stripWrap;
+        var cw = wrap.dom.offsetWidth;
+        var pos = this.getScrollPos();
+        var l = this.edge.getOffsetsTo(this.stripWrap)[0] + pos;
+        
+        if(!this.enableScroll || count < 1 || cw < 20){ // 20 to prevent display:none issues
+            return;
+        }
+        
+        wrap.setWidth(tw); // moved to here because of problem in Safari
+        
+        if(l <= tw){
+            wrap.dom.scrollLeft = 0;
+            //wrap.setWidth(tw); moved from here because of problem in Safari
+            if(this.scrolling){
+                this.scrolling = false;
+                this.el.removeClass('x-taskbuttons-scrolling');
+                this.scrollLeft.hide();
+                this.scrollRight.hide();
+            }
+        }else{
+            if(!this.scrolling){
+                this.el.addClass('x-taskbuttons-scrolling');
+            }
+            tw -= wrap.getMargins('lr');
+            wrap.setWidth(tw > 20 ? tw : 20);
+            if(!this.scrolling){
+                if(!this.scrollLeft){
+                    this.createScrollers();
+                }else{
+                    this.scrollLeft.show();
+                    this.scrollRight.show();
+                }
+            }
+            this.scrolling = true;
+            if(pos > (l-tw)){ // ensure it stays within bounds
+                wrap.dom.scrollLeft = l-tw;
+            }else{ // otherwise, make sure the active button is still visible
+                this.scrollToButton(this.activeButton, true); // true to animate
+            }
+            this.updateScrollButtons();
+        }
+    },
+
+    createScrollers : function(){
+        var h = this.el.dom.offsetHeight; //var h = this.stripWrap.dom.offsetHeight;
+        
+        // left
+        var sl = this.el.insertFirst({
+            cls:'ux-taskbuttons-scroller-left'
+        });
+        sl.setHeight(h);
+        sl.addClassOnOver('ux-taskbuttons-scroller-left-over');
+        this.leftRepeater = new Ext.util.ClickRepeater(sl, {
+            interval : this.scrollRepeatInterval,
+            handler: this.onScrollLeft,
+            scope: this
+        });
+        this.scrollLeft = sl;
+
+        // right
+        var sr = this.el.insertFirst({
+            cls:'ux-taskbuttons-scroller-right'
+        });
+        sr.setHeight(h);
+        sr.addClassOnOver('ux-taskbuttons-scroller-right-over');
+        this.rightRepeater = new Ext.util.ClickRepeater(sr, {
+            interval : this.scrollRepeatInterval,
+            handler: this.onScrollRight,
+            scope: this
+        });
+        this.scrollRight = sr;
+    },
+    
+    getScrollWidth : function(){
+        return this.edge.getOffsetsTo(this.stripWrap)[0] + this.getScrollPos();
+    },
+
+    getScrollPos : function(){
+        return parseInt(this.stripWrap.dom.scrollLeft, 10) || 0;
+    },
+
+    getScrollArea : function(){
+        return parseInt(this.stripWrap.dom.clientWidth, 10) || 0;
+    },
+
+    getScrollAnim : function(){
+        return {
+            duration: this.scrollDuration,
+            callback: this.updateScrollButtons,
+            scope: this
+        };
+    },
+
+    getScrollIncrement : function(){
+        return (this.scrollIncrement || this.lastButtonWidth+2);
+    },
+    
+    /* getBtnEl : function(item){
+        return document.getElementById(item.id);
+    }, */
+    
+    scrollToButton : function(item, animate){
+        item = item.el.dom.parentNode; // li
+        if(!item){ return; }
+        var el = item; //this.getBtnEl(item);
+        var pos = this.getScrollPos(), area = this.getScrollArea();
+        var left = Ext.fly(el).getOffsetsTo(this.stripWrap)[0] + pos;
+        var right = left + el.offsetWidth;
+        if(left < pos){
+            this.scrollTo(left, animate);
+        }else if(right > (pos + area)){
+            this.scrollTo(right - area, animate);
+        }
+    },
+    
+    scrollTo : function(pos, animate){
+        this.stripWrap.scrollTo('left', pos, animate ? this.getScrollAnim() : false);
+        if(!animate){
+            this.updateScrollButtons();
+        }
+    },
+    
+    onScrollRight : function(){
+        var sw = this.getScrollWidth()-this.getScrollArea();
+        var pos = this.getScrollPos();
+        var s = Math.min(sw, pos + this.getScrollIncrement());
+        if(s != pos){
+            this.scrollTo(s, this.animScroll);
+        }        
+    },
+
+    onScrollLeft : function(){
+        var pos = this.getScrollPos();
+        var s = Math.max(0, pos - this.getScrollIncrement());
+        if(s != pos){
+            this.scrollTo(s, this.animScroll);
+        }
+    },
+    
+    updateScrollButtons : function(){
+        var pos = this.getScrollPos();
+        this.scrollLeft[pos == 0 ? 'addClass' : 'removeClass']('ux-taskbuttons-scroller-left-disabled');
+        this.scrollRight[pos >= (this.getScrollWidth()-this.getScrollArea()) ? 'addClass' : 'removeClass']('ux-taskbuttons-scroller-right-disabled');
+    }
+});
+
+
+
+/**
+ * @class Ext.ux.TaskBar.TaskButton
+ * @extends Ext.Button
+ */
+Ext.ux.TaskBar.TaskButton = function(win, el){
+    this.win = win;
+    
+    Ext.ux.TaskBar.TaskButton.superclass.constructor.call(this, {
+        iconCls: win.iconCls,
+        text: Ext.util.Format.ellipsis(win.title, 12),
+        tooltip: win.taskbuttonTooltip || win.title,
+        renderTo: el,
+        handler : function(){
+            if(win.minimized || win.hidden){
+                win.show();
+            }else if(win == win.manager.getActive()){
+                win.minimize();
+            }else{
+                win.toFront();
+            }
+        },
+        clickEvent:'mousedown'
+    });
+};
+
+Ext.extend(Ext.ux.TaskBar.TaskButton, Ext.Button, {
+    onRender : function(){
+        Ext.ux.TaskBar.TaskButton.superclass.onRender.apply(this, arguments);
+
+        this.cmenu = new Ext.menu.Menu({
+            items: [{
+                id: 'restore',
+                text: 'Restore',
+                handler: function(){
+                    if(!this.win.isVisible()){
+                        this.win.show();
+                    }else{
+                        this.win.restore();
+                    }
+                },
+                scope: this
+            },{
+                id: 'minimize',
+                text: 'Minimize',
+                handler: this.win.minimize,
+                scope: this.win
+            },{
+                id: 'maximize',
+                text: 'Maximize',
+                handler: this.win.maximize,
+                scope: this.win
+            }, '-', {
+                id: 'close',
+                text: 'Close',
+                handler: this.closeWin.createDelegate(this, this.win, true),
+                scope: this.win
+            }]
+        });
+
+        this.cmenu.on('beforeshow', function(){
+            var items = this.cmenu.items.items;
+            var w = this.win;
+            items[0].setDisabled(w.maximized !== true && w.hidden !== true);
+            items[1].setDisabled(w.minimized === true);
+            items[2].setDisabled(w.maximized === true || w.hidden === true);
+            items[2].setDisabled(w.maximizable === false);
+            items[3].setDisabled(w.closable === false);
+        }, this);
+
+        this.el.on('contextmenu', function(e){
+            e.stopEvent();
+            if(!this.cmenu.el){
+                this.cmenu.render();
+            }
+            var xy = e.getXY();
+            xy[1] -= this.cmenu.el.getHeight();
+            this.cmenu.showAt(xy);
+        }, this);
+    },
+    
+    closeWin : function(cMenu, e, win){
+        if(!win.isVisible()){
+            win.show();
+        }else{
+            win.restore();
+        }
+        win.close();
+    },
+    
+    /**
+     * override so autoWidth() is not called
+     * @param {String} text The text for the button
+     */
+    setText : function(text){
+        if(text){
+            this.text = text;
+            if(this.el){
+                this.el.child("td.x-btn-center " + this.buttonSelector).update(Ext.util.Format.ellipsis(text, 12));
+            }
+        }
+    },
+    
+    /**
+     * @param {String/Object} tooltip The tooltip for the button - can be a string or QuickTips config object
+     */
+    setTooltip : function(text){
+        if(text){
+            this.tooltip = text;
+            var btnEl = this.el.child(this.buttonSelector);
+            Ext.QuickTips.unregister(btnEl.id);
+            
+            if(typeof this.tooltip == 'object'){                
+                Ext.QuickTips.register(Ext.apply({
+                      target: btnEl.id
+                }, this.tooltip));
+            } else {
+                btnEl.dom[this.tooltipType] = this.tooltip;
+            }
+        }
+    }
+});
+
+
+
+/**
+ * @class Ext.ux.QuickStartPanel
+ * @extends Ext.BoxComponent
+ */
+Ext.ux.QuickStartPanel = Ext.extend(Ext.BoxComponent, {
+    enableMenu: true,
+    
+    initComponent : function(){
+        Ext.ux.QuickStartPanel.superclass.initComponent.call(this);
+        
+        this.on('resize', this.delegateUpdates);
+        
+        this.menu = new Ext.menu.Menu();
+        
+        this.items = [];
+        
+        this.stripWrap = Ext.get(this.el).createChild({
+            cls: 'ux-quickstart-strip-wrap',
+            cn: {tag:'ul', cls:'ux-quickstart-strip'}
+        });
+        
+        this.stripSpacer = Ext.get(this.el).createChild({
+            cls:'ux-quickstart-strip-spacer'
+        });
+        
+        this.strip = new Ext.Element(this.stripWrap.dom.firstChild);
+        
+        this.edge = this.strip.createChild({
+            tag:'li',
+            cls:'ux-quickstart-edge'
+        });
+        
+        this.strip.createChild({
+            cls:'x-clear'
+        });
+    },
+    
+    add : function(config){
+        var li = this.strip.createChild({tag:'li'}, this.edge); // insert before the edge
+        
+        var btn = new Ext.Button(Ext.apply(config, {
+            cls:'x-btn-icon',
+            menuText: config.text,
+            renderTo: li,
+            text: '' // do not display text
+        }));
+        
+        this.items.push(btn);
+        
+        this.delegateUpdates();
+        
+        return btn;
+    },
+    
+    remove : function(btn){
+        var li = document.getElementById(btn.container.id);
+        btn.destroy();
+        li.parentNode.removeChild(li);
+        
+        var s = [];
+        for(var i = 0, len = this.items.length; i < len; i++) {
+            if(this.items[i] != btn){
+                s.push(this.items[i]);
+            }
+        }
+        this.items = s;
+        
+        this.delegateUpdates();
+    },
+    
+    menuAdd : function(config){
+        this.menu.add(config);
+    },
+    
+    delegateUpdates : function(){
+        if(this.enableMenu && this.rendered){
+            this.showButtons();
+            this.clearMenu();
+            this.autoMenu();
+        }
+    },
+    
+    showButtons : function(){
+        var count = this.items.length;
+        
+        for(var i = 0; i < count; i++){
+            this.items[i].show(); 	
+        }
+    },
+    
+    clearMenu : function(){
+        this.menu.removeAll();
+    },
+    
+    autoMenu : function(){
+        var count = this.items.length;
+        var ow = this.el.dom.offsetWidth;
+        var tw = this.el.dom.clientWidth;
+        
+        var wrap = this.stripWrap;
+        var cw = wrap.dom.offsetWidth;
+        var l = this.edge.getOffsetsTo(this.stripWrap)[0];
+        
+        if(!this.enableMenu || count < 1 || cw < 20){ // 20 to prevent display:none issues
+            return;
+        }
+        
+        wrap.setWidth(tw);
+        
+        if(l <= tw){
+            if(this.showingMenu){
+                this.showingMenu = false;
+                this.menuButton.hide();
+            }
+        }else{
+            tw -= wrap.getMargins('lr');
+            
+            wrap.setWidth(tw > 20 ? tw : 20);
+            
+            if(!this.showingMenu){
+                if(!this.menuButton){
+                    this.createMenuButton();
+                }else{
+                    this.menuButton.show();
+                }
+            }
+            
+            mo = this.getMenuButtonPos();
+            
+            for(var i = count-1; i >= 0; i--){
+                var bo = this.items[i].el.dom.offsetLeft + this.items[i].el.dom.offsetWidth;
+                
+                if(bo > mo){
+                    this.items[i].hide();
+
+                    var ic = this.items[i].initialConfig,
+                        config = {
+                            iconCls: ic.iconCls,
+                            handler: ic.handler,
+                            scope: ic.scope,
+                            text: ic.menuText
+                        };
+                    
+                    this.menuAdd(config);
+                }else{
+                    this.items[i].show();
+                }
+            }
+            
+            this.showingMenu = true;
+        }
+    },
+    
+    createMenuButton : function(){
+        
+        var h = this.el.dom.offsetHeight;
+
+        var mb = this.el.insertFirst({
+            cls:'ux-quickstart-menubutton-wrap'
+        });
+        
+        mb.setHeight(h);
+        
+        var btn = new Ext.Button({
+            cls:'x-btn-icon',
+            id: 'ux-quickstart-menubutton',
+            menu: this.menu,
+            renderTo: mb
+        });
+        
+        mb.setWidth(Ext.get('ux-quickstart-menubutton').getWidth());
+        
+        this.menuButton = mb;
+    },
+    
+    getMenuButtonPos : function(){
+        return this.menuButton.dom.offsetLeft;
+    }
+});
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/dialogs/colorpicker/ColorPicker.js
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/dialogs/colorpicker/ColorPicker.js	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/dialogs/colorpicker/ColorPicker.js	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,676 @@
+/**
+ * Original code is taken from vtswingkid's (Ext JS Forum member) form.ux.ColorPickerField
+ * URL: http://extjs.com/forum/showthread.php?t=47450
+ * 
+ * Additional modifications have been made to the Ext.ux.ColorDialog by Todd Murdock.
+ */
+
+/**
+ * @class Ext.ux.ColorPicker
+ * @extends Ext.BoxComponent
+ * This is a color picker.
+ * @license: LGPLv3
+ * @author: Amon
+ * @constructor
+ * Creates a new ColorPicker
+ * @param {Object} config Configuration options
+ * @version 1.1.2
+ */
+
+Ext.namespace("Ext.ux", "Ext.ux.menu");
+
+Ext.ux.ColorPicker = Ext.extend( Ext.BoxComponent, {
+	// will need to update css 'height' if more than one color box is enabled
+	showWebSafeColorbox : false,
+	showInverseColorbox : false,
+	showColorbox : true,
+	
+	initComponent: function() {
+		this.applyDefaultsCP();
+		Ext.ux.ColorPicker.superclass.initComponent.apply( this, arguments );
+		this.addEvents('select');
+	},
+	
+	onRender: function() {
+		Ext.ux.ColorPicker.superclass.onRender.apply( this, arguments );
+		// check if container, self-container or renderTo exists
+		this.body = this.body || ( this.container || ( this.renderTo || Ext.DomHelper.append( Ext.getBody(), {}, true ) ) );
+		if( !this.el ) {
+			this.el = this.body;
+			if( this.cls ) { Ext.get( this.el ).addClass( this.cls ); }
+		}
+		// render this component
+		this.renderComponent();
+	},
+	
+	applyDefaultsCP: function() {
+		Ext.apply( this, {
+			'cls': 'x-cp-mainpanel',
+			'resizable': this.resizable || false,
+			'HSV': {
+				h: 0,
+				s: 0,
+				v: 0
+			},
+			updateMode: null
+		});
+	},
+	
+	renderComponent: function() {
+		// create RGB Slider
+		Ext.DomHelper.append( this.body, {
+			'id': this.cpGetId( 'rgb' ),
+			'cls': 'x-cp-rgbpicker'
+		});
+		
+		// Create HUE Slider
+		Ext.DomHelper.append( this.body, {
+			'id': this.cpGetId( 'hue' ),
+			'cls': 'x-cp-huepicker'
+		});
+		
+		// Initialize HUE Picker DD
+		this.huePicker = Ext.DomHelper.append( this.body, { 'cls': 'x-cp-hueslider' });
+		this.hueDD = new Ext.dd.DD( this.huePicker, 'huePicker' );
+		this.hueDD.constrainTo( this.cpGetId( 'hue' ), {'top':-7,'right':-3,'bottom':-7,'left':-3} );
+		this.hueDD.onDrag = this.moveHuePicker.createDelegate( this );
+		
+		// initialize onclick on the rgb picker
+		Ext.get( this.cpGetId( 'hue' ) ).on( 'mousedown', this.clickHUEPicker.createDelegate( this ) );
+		
+		// initialize start position
+		Ext.get( this.huePicker ).moveTo( Ext.get( this.cpGetId( 'hue' ) ).getLeft() - 3, Ext.get( this.cpGetId( 'hue' ) ).getTop() - 7 );
+		
+		// Initialize RGB Picker DD
+		this.rgbPicker = Ext.DomHelper.append( this.body, { 'cls': 'x-cp-rgbslider' });
+		this.rgbDD = new Ext.dd.DD( this.rgbPicker, 'rgbPicker' );
+		this.rgbDD.constrainTo( this.cpGetId( 'rgb' ), -7 );
+		this.rgbDD.onDrag = this.moveRGBPicker.createDelegate( this );
+		
+		// initialize onclick on the rgb picker
+		Ext.get( this.cpGetId( 'rgb' ) ).on( 'mousedown', this.clickRGBPicker.createDelegate( this ) );
+		// initialize start position
+		Ext.get( this.rgbPicker ).moveTo( Ext.get( this.cpGetId( 'rgb' ) ).getLeft() - 7, Ext.get( this.cpGetId( 'rgb' ) ).getTop() - 7 );
+		
+		// Create color divs and Form elements
+		this.formPanel = new Ext.form.FormPanel({
+			'border': false,
+			'renderTo': Ext.DomHelper.append( this.body, {
+							'id': this.cpGetId( 'fCont' ),
+							'cls': 'x-cp-formcontainer'
+						}, true ),
+			'frame': false,
+			'labelAlign': 'left',
+			'labelWidth': 10,
+			'items': [{ // Color box
+				'border': false,
+				'layout': 'form',
+				'id': this.cpGetId( 'cCont' )
+			},{
+				'bodyStyle': 'padding-top:10px;',
+				'border': false,
+				'layout': 'column',
+				'items': [{ // RGB fields
+					'border': false,
+					'columnWidth': .5,
+					'layout': 'form',
+					'defaultType': 'numberfield',
+					'defaults': {
+						'width': 30,
+						'value': 0,
+						'minValue': 0,
+						'maxValue': 255,
+						'allowBlank': false,
+						'labelSeparator': '',
+						'enableKeyEvents': true
+					},
+					'items': [{
+						'fieldLabel': 'R',
+						'id': this.cpGetId( 'iRed' )
+					},{
+						'fieldLabel': 'G',
+						'id': this.cpGetId( 'iGreen' )
+					},{
+						'fieldLabel': 'B',
+						'id': this.cpGetId( 'iBlue' )
+					}]
+				},{ // HSV Fields
+					'border': false,
+					'columnWidth': .5,
+					'layout': 'form',
+					'defaultType': 'numberfield',
+					'defaults': {
+						'width': 30,
+						'value': 0,
+						'minValue': 0,
+						'maxValue': 255,
+						'allowBlank': false,
+						'labelSeparator': '',
+						'enableKeyEvents': true
+					},
+					'items': [{
+						'fieldLabel': 'H',
+						'maxValue': 360,
+						'id': this.cpGetId( 'iHue' )
+					},{
+						'fieldLabel': 'S',
+						'id': this.cpGetId( 'iSat' )
+					},{
+						'fieldLabel': 'V',
+						'id': this.cpGetId( 'iVal' )
+					}]
+				},{ // HEX field panel
+				'border': false,
+				'layout': 'form',
+				'labelAlign': 'left',
+				'items': [{
+					'width': 88,
+					'value': '000000',
+					'labelSeparator': '',
+					'allowBlank': false,
+					'fieldLabel': '#',
+					'id': this.cpGetId( 'iHexa' ),
+					'value': '000000',
+					'xtype': 'hexfield',
+					'enableKeyEvents': true
+					// 'regex': /^[0-9a-fA-F]{6}$/
+				}]
+			}]
+			}]
+		});
+		
+		Ext.getCmp( this.cpGetId( 'iRed' ) ).on( 'keyup', this.updateFromIRGB.createDelegate( this ), {buffer: 750} );
+		Ext.getCmp( this.cpGetId( 'iGreen' ) ).on( 'keyup', this.updateFromIRGB.createDelegate( this ), {buffer: 750} );
+		Ext.getCmp( this.cpGetId( 'iBlue' ) ).on( 'keyup', this.updateFromIRGB.createDelegate( this ), {buffer: 750} );
+		Ext.getCmp( this.cpGetId( 'iHue' ) ).on( 'keyup', this.updateFromIHSV.createDelegate( this ), {buffer: 750} );
+		Ext.getCmp( this.cpGetId( 'iSat' ) ).on( 'keyup', this.updateFromIHSV.createDelegate( this ), {buffer: 750} );
+		Ext.getCmp( this.cpGetId( 'iVal' ) ).on( 'keyup', this.updateFromIHSV.createDelegate( this ), {buffer: 750} );
+		Ext.getCmp( this.cpGetId( 'iHexa' ) ).on( 'keyup', this.updateFromIHexa.createDelegate( this ), {buffer: 750} );
+		
+		var cContBody = Ext.getCmp( this.cpGetId( 'cCont' ) ).body;
+		
+		if(this.showWebSafeColorbox === true){ // show web save color box
+			Ext.DomHelper.append( cContBody, { 'cls': 'x-cp-colorbox', 'id': this.cpGetId( 'cWebSafe' ) }, true ).update( 'Websafe' );
+			Ext.get( this.cpGetId( 'cWebSafe' ) ).on( 'click', this.updateFromBox.createDelegate( this ) );
+		}
+		if(this.showInverseColorbox === true){ // show inverse color box
+			Ext.DomHelper.append( cContBody, { 'cls': 'x-cp-colorbox', 'id': this.cpGetId( 'cInverse' ) }, true ).update( 'Inverse' );
+			Ext.get( this.cpGetId( 'cInverse' ) ).on( 'click', this.updateFromBox.createDelegate( this ) );
+		}
+		if(this.showColorbox === true){ // show color box
+			Ext.DomHelper.append( cContBody, { 'cls': 'x-cp-colorbox', 'id': this.cpGetId( 'cColor' ) }, true );//.update( 'Pick Color' );
+			Ext.get( this.cpGetId( 'cColor' ) ).on( 'click', this.selectColor.createDelegate( this ) );
+		}
+		
+		Ext.DomHelper.append( this.body, {'tag':'br','cls':'x-cp-clearfloat'});
+	},
+	
+	cpGetId: function( postfix ) {
+		return this.getId() + '__' + ( postfix || 'cp' );
+	},
+	
+	updateRGBPosition: function( x, y ) {
+		this.updateMode = 'click';
+		x = x < 0 ? 0 : x;
+		x = x > 181 ? 181 : x;
+		y = y < 0 ? 0 : y;
+		y = y > 181 ? 181 : y;
+		this.HSV.s = this.getSaturation( x );
+		this.HSV.v = this.getValue( y );
+		Ext.get( this.rgbPicker ).moveTo( Ext.get( this.cpGetId( 'rgb' ) ).getLeft() + x - 7, Ext.get( this.cpGetId( 'rgb' ) ).getTop() + y - 7, ( this.animateMove || true ) );
+		this.updateColor();
+	},
+	
+	updateHUEPosition: function( y ) {
+		this.updateMode = 'click';
+		y = y < 1 ? 1 : y;
+		y = y > 181 ? 181 : y;
+		this.HSV.h = Math.round( 360 / 181 * ( 181 - y ) );
+		Ext.get( this.huePicker ).moveTo( Ext.get( this.huePicker ).getLeft(), Ext.get( this.cpGetId( 'hue' ) ).getTop() + y - 7, ( this.animateMove || true ) );
+		this.updateRGBPicker( this.HSV.h );
+		this.updateColor();
+	},
+	
+	clickRGBPicker: function( event, element ) {
+		this.updateRGBPosition( event.xy[0] - Ext.get( this.cpGetId( 'rgb' ) ).getLeft() , event.xy[1] - Ext.get( this.cpGetId( 'rgb' ) ).getTop() );
+	},
+	
+	clickHUEPicker: function( event, element ) {
+		this.updateHUEPosition( event.xy[1] - Ext.get( this.cpGetId( 'hue' ) ).getTop() );
+	},
+	
+	moveRGBPicker: function( event ) {
+		this.rgbDD.constrainTo( this.cpGetId( 'rgb' ), -7 );
+		this.updateRGBPosition( Ext.get( this.rgbPicker ).getLeft() - Ext.get( this.cpGetId( 'rgb' ) ).getLeft() + 7 , Ext.get( this.rgbPicker ).getTop() - Ext.get( this.cpGetId( 'rgb' ) ).getTop() + 7 );
+	},
+	
+	moveHuePicker: function( event ) {
+		this.hueDD.constrainTo( this.cpGetId( 'hue' ), {'top':-7,'right':-3,'bottom':-7,'left':-3} );
+		this.updateHUEPosition( Ext.get( this.huePicker ).getTop() - Ext.get( this.cpGetId( 'hue' ) ).getTop() + 7 );
+	},
+	
+	updateRGBPicker: function( newValue ) {
+		this.updateMode = 'click';
+		Ext.get( this.cpGetId( 'rgb' ) ).setStyle({ 'background-color': '#' + this.rgbToHex( this.hsvToRgb( newValue, 1, 1 ) ) });
+		this.updateColor();
+	},
+	
+	updateColor: function() {
+		var rgb = this.hsvToRgb( this.HSV.h, this.HSV.s, this.HSV.v );
+		var websafe = this.websafe( rgb );
+		var invert = this.invert( rgb );
+		var wsInvert = this.invert( websafe );
+		if( this.updateMode !== 'hexa' ) {
+			Ext.getCmp( this.cpGetId( 'iHexa' ) ).setValue( this.rgbToHex( rgb ) );
+		}
+		if( this.updateMode !== 'rgb' ) {
+			Ext.getCmp( this.cpGetId( 'iRed' ) ).setValue( rgb[0] );
+			Ext.getCmp( this.cpGetId( 'iGreen' ) ).setValue( rgb[1] );
+			Ext.getCmp( this.cpGetId( 'iBlue' ) ).setValue( rgb[2] );
+		}
+		if( this.updateMode !== 'hsv' ) {
+			Ext.getCmp( this.cpGetId( 'iHue' ) ).setValue( Math.round( this.HSV.h ) );
+			Ext.getCmp( this.cpGetId( 'iSat' ) ).setValue( Math.round( this.HSV.s * 100 ) );
+			Ext.getCmp( this.cpGetId( 'iVal' ) ).setValue( Math.round( this.HSV.v * 100 ) );
+		}
+		
+		if(this.showColorbox === true){
+			Ext.get( this.cpGetId( 'cColor' ) ).setStyle({
+				'background': '#' + this.rgbToHex( rgb ),
+				'color': '#' + this.rgbToHex( invert )
+			});
+			//Ext.getDom( this.cpGetId( 'cColor' ) ).title = '#'+this.rgbToHex( rgb );
+		}
+		
+		if(this.showInverseColorbox === true){
+			Ext.get( this.cpGetId( 'cInverse' ) ).setStyle({
+				'background': '#' + this.rgbToHex( invert ),
+				'color': '#' + this.rgbToHex( rgb )
+			});
+			//Ext.getDom( this.cpGetId( 'cInverse' ) ).title = '#'+this.rgbToHex( invert );
+		}
+		
+		if(this.showWebSafeColorbox === true){
+			Ext.get( this.cpGetId( 'cWebSafe' ) ).setStyle({
+				'background': '#' + this.rgbToHex( websafe ),
+				'color': '#' + this.rgbToHex( wsInvert )
+			});
+			//Ext.getDom( this.cpGetId( 'cWebSafe' ) ).title = '#'+this.rgbToHex( websafe );
+		}
+		
+		if( this.updateMode !== 'click' ) {
+			Ext.get( this.huePicker ).moveTo( Ext.get( this.huePicker ).getLeft(), Ext.get( this.cpGetId( 'hue' ) ).getTop() + this.getHPos( Ext.getCmp( this.cpGetId( 'iHue' ) ).getValue() ) - 7, ( this.animateMove || true ) );
+			Ext.get( this.rgbPicker ).moveTo( Ext.get( this.cpGetId( 'rgb' ) ).getLeft() + this.getSPos( Ext.getCmp( this.cpGetId( 'iSat' ) ).getValue() / 100 ) - 7, Ext.get( this.cpGetId( 'hue' ) ).getTop() + this.getVPos( Ext.getCmp( this.cpGetId( 'iVal' ) ).getValue() / 100 ) - 7, ( this.animateMove || true ) );
+		}
+		
+		Ext.get( this.cpGetId( 'rgb' ) ).setStyle({ 'background-color': '#' + this.rgbToHex( this.hsvToRgb( Ext.getCmp( this.cpGetId( 'iHue' ) ).getValue(), 1, 1 ) ) });
+	
+		this.selectColor(); // fire the 'select' event now
+	},
+	
+	setColor: function(c) {
+		if(!/^[0-9a-fA-F]{6}$/.test(c))return;
+		Ext.getCmp( this.cpGetId( 'iHexa' ) ).setValue(c);
+		this.updateFromIHexa();
+	},
+	
+	getColor: function(){
+		return Ext.getCmp( this.cpGetId( 'iHexa' ) ).getValue();
+	},
+	
+	updateFromIRGB: function( input, newValue, oldValue ) {
+		this.updateMode = 'rgb';
+		var temp = this.rgbToHsv( Ext.getCmp( this.cpGetId( 'iRed' ) ).getValue(), Ext.getCmp( this.cpGetId( 'iGreen' ) ).getValue(), Ext.getCmp( this.cpGetId( 'iBlue' ) ).getValue() );
+		this.HSV = { h: temp[0], s:temp[1], v:temp[2]};
+		this.updateColor();
+	},
+	
+	updateFromIHSV: function( input, newValue, oldValue ) {
+		this.updateMode = 'hsv';
+		this.HSV = { h: Ext.getCmp( this.cpGetId( 'iHue' ) ).getValue(), s:Ext.getCmp( this.cpGetId( 'iSat' ) ).getValue() / 100, v:Ext.getCmp( this.cpGetId( 'iVal' ) ).getValue() / 100};
+		this.updateColor();
+	},
+	
+	updateFromIHexa: function( input, e) {
+		var value = Ext.getCmp( this.cpGetId( 'iHexa' ) ).getValue();
+		if(!/^[0-9a-fA-F]{6}$/.test(value))return;
+		
+		this.updateMode = 'hexa';
+		var temp = this.rgbToHsv( this.hexToRgb( value ) );
+		this.HSV = { h: temp[0], s:temp[1], v:temp[2]};
+		this.updateColor();
+	},
+	
+	updateFromBox: function( event, element ) {
+		this.updateMode = 'click';
+		var temp = this.rgbToHsv( this.hexToRgb( Ext.get( element ).getColor( 'backgroundColor', '', '' ) ) );
+		this.HSV = { h: temp[0], s:temp[1], v:temp[2]};
+		this.updateColor();
+	},
+
+	selectColor: function( event, element ) {
+		//this.fireEvent('select', this, Ext.get( element ).getColor( 'backgroundColor', '', '' ));
+		this.fireEvent( 'select', this, this.getColor() );
+	},
+	/**
+	 * Convert HSV color format to RGB color format
+	 * @param {Integer/Array( h, s, v )} h
+	 * @param {Integer} s (optional)
+	 * @param {Integer} v (optional)
+	 * @return {Array}
+	 */
+	hsvToRgb: function( h, s, v ) {
+		if( h instanceof Array ) { return this.hsvToRgb.call( this, h[0], h[1], h[2] ); }
+		var r, g, b, i, f, p, q, t;
+	    i = Math.floor( ( h / 60 ) % 6 );
+	    f = ( h / 60 ) - i;
+	    p = v * ( 1 - s );
+	    q = v * ( 1 - f * s );
+	    t = v * ( 1 - ( 1 - f ) * s );
+	    switch(i) {
+	        case 0: r=v; g=t; b=p; break;
+	        case 1: r=q; g=v; b=p; break;
+	        case 2: r=p; g=v; b=t; break;
+	        case 3: r=p; g=q; b=v; break;
+	        case 4: r=t; g=p; b=v; break;
+	        case 5: r=v; g=p; b=q; break;
+	    }
+	    return [this.realToDec( r ), this.realToDec( g ), this.realToDec( b )];
+	},
+	/**
+	 * Convert RGB color format to HSV color format
+	 * @param {Integer/Array( r, g, b )} r
+	 * @param {Integer} g (optional)
+	 * @param {Integer} b (optional)
+	 * @return {Array}
+	 */
+	rgbToHsv: function( r, g, b ) {
+		if( r instanceof Array ) { return this.rgbToHsv.call( this, r[0], r[1], r[2] ); }
+        r = r / 255;
+        g = g / 255;
+        b = b / 255;
+        var min, max, delta, h, s, v;
+        min = Math.min( Math.min( r, g ), b );
+        max = Math.max( Math.max( r, g ), b );
+        delta = max - min;
+        switch (max) {
+            case min: h = 0; break;
+            case r:   h = 60 * ( g - b ) / delta;
+                      if ( g < b ) { h += 360; }
+                      break;
+            case g:   h = ( 60 * ( b - r ) / delta ) + 120; break;
+            case b:   h = ( 60 * ( r - g ) / delta ) + 240; break;
+        }
+        s = ( max === 0 ) ? 0 : 1 - ( min / max );
+        return [Math.round( h ), s, max];
+	},
+	/**
+	 * Convert a float to decimal
+	 * @param {Float} n
+	 * @return {Integer}
+	 */
+	realToDec: function( n ) {
+		return Math.min( 255, Math.round( n * 256 ) );
+	},
+	/**
+	 * Convert RGB color format to Hexa color format
+	 * @param {Integer/Array( r, g, b )} r
+	 * @param {Integer} g (optional)
+	 * @param {Integer} b (optional)
+	 * @return {String}
+	 */
+	rgbToHex: function( r, g, b ) {
+		if( r instanceof Array ) { return this.rgbToHex.call( this, r[0], r[1], r[2] ); }
+		return this.decToHex( r ) + this.decToHex( g ) + this.decToHex( b );
+	},
+	/**
+	 * Convert an integer to hexa
+	 * @param {Integer} n
+	 * @return {String}
+	 */
+	decToHex: function( n ) {
+		var HCHARS = '0123456789ABCDEF';
+        n = parseInt(n, 10);
+        n = ( !isNaN( n )) ? n : 0;
+        n = (n > 255 || n < 0) ? 0 : n;
+        return HCHARS.charAt( ( n - n % 16 ) / 16 ) + HCHARS.charAt( n % 16 );
+	},
+	/**
+	 * Return with position of a character in this.HCHARS string
+	 * @private
+	 * @param {Char} c
+	 * @return {Integer}
+	 */
+	getHCharPos: function( c ) {
+		var HCHARS = '0123456789ABCDEF';
+		return HCHARS.indexOf( c.toUpperCase() );
+	},
+	/**
+	 * Convert a hexa string to decimal
+	 * @param {String} hex
+	 * @return {Integer}
+	 */
+	hexToDec: function( hex ) {
+        var s = hex.split('');
+        return ( ( this.getHCharPos( s[0] ) * 16 ) + this.getHCharPos( s[1] ) );
+	},
+	/**
+	 * Convert a hexa string to RGB color format
+	 * @param {String} hex
+	 * @return {Array}
+	 */
+	hexToRgb: function( hex ) {
+		return [ this.hexToDec( hex.substr(0, 2) ), this.hexToDec( hex.substr(2, 2) ), this.hexToDec( hex.substr(4, 2) ) ];
+	},
+	/**
+	 * Convert Y coordinate to HUE value
+	 * @private
+	 * @param {Integer} y
+	 * @return {Integer}
+	 */
+	getHue: function( y ) {
+		var hue = 360 - Math.round( ( ( 181 - y ) / 181 ) * 360 );
+		return hue === 360 ? 0 : hue;
+	},
+	/**
+	 * Convert HUE value to Y coordinate
+	 * @private
+	 * @param {Integer} hue
+	 * @return {Integer}
+	 */
+	getHPos: function( hue ) {
+		return 181 - hue * ( 181 / 360 );
+	},
+	/**
+	 * Convert X coordinate to Saturation value
+	 * @private
+	 * @param {Integer} x
+	 * @return {Integer}
+	 */
+	getSaturation: function( x ) {
+		return x / 181;
+	},
+	/**
+	 * Convert Saturation value to Y coordinate
+	 * @private
+	 * @param {Integer} saturation
+	 * @return {Integer}
+	 */
+	getSPos: function( saturation ) {
+		return saturation * 181;
+	},
+	/**
+	 * Convert Y coordinate to Brightness value
+	 * @private
+	 * @param {Integer} y
+	 * @return {Integer}
+	 */
+	getValue: function( y ) {
+		return ( 181 - y ) / 181;
+	},
+	/**
+	 * Convert Brightness value to Y coordinate
+	 * @private
+	 * @param {Integer} value
+	 * @return {Integer}
+	 */
+	getVPos: function( value ) {
+		return 181 - ( value * 181 );
+	},
+	/**
+	 * Not documented yet
+	 */
+	checkSafeNumber: function( v ) {
+	    if ( !isNaN( v ) ) {
+	        v = Math.min( Math.max( 0, v ), 255 );
+	        var i, next;
+	        for( i=0; i<256; i=i+51 ) {
+	            next = i + 51;
+	            if ( v>=i && v<=next ) { return ( v - i > 25 ) ? next : i; }
+	        }
+	    }
+	    return v;
+	},
+	/**
+	 * Not documented yet
+	 */
+	websafe: function( r, g, b ) {
+		if( r instanceof Array ) { return this.websafe.call( this, r[0], r[1], r[2] ); }
+		return [this.checkSafeNumber( r ), this.checkSafeNumber( g ), this.checkSafeNumber( b )];
+	},
+	/**
+	 * Not documented yet
+	 */
+	invert: function( r, g, b ) {
+		if( r instanceof Array ) { return this.invert.call( this, r[0], r[1], r[2] ); }
+		return [255-r,255-g,255-b];
+	}
+});
+/**
+ *
+ */
+Ext.ux.ColorDialog = Ext.extend( Ext.Window, {
+	constructor: function(config){
+		config = config || {};
+		Ext.applyIf(config, {
+			buttons: [{
+					handler: this.onOk,
+					scope: this,
+					text: 'Ok'
+				},{
+					handler: this[this.closeAction].createDelegate(this, []),
+					scope: this,
+					text: 'Cancel'
+			}]
+		});
+		Ext.ux.ColorDialog.superclass.constructor.apply(this, [config]);
+	},
+	initComponent: function() {
+		this.width = ( !this.width || this.width < 353 ) ? 353 : this.width;
+		this.applyDefaultsCP();
+		Ext.ux.ColorDialog.superclass.initComponent.apply( this, arguments );
+	},
+	onRender: function() {
+		Ext.ux.ColorDialog.superclass.onRender.apply( this, arguments );
+		this.renderComponent();
+	},
+	onOk: function(){
+		//this.selectColor(); // will fire the 'select' event
+		if(this.callback && this.scope){
+			this.callback.call( this.scope, this.getColor() );
+		}
+		this[this.closeAction]();
+	},
+	show : function(hex, cb, scope){ // override the superclass show() so the callback is not called from show()
+		if(!this.rendered){
+            this.render(Ext.getBody());
+        }
+        if(this.hidden === false){
+            this.toFront();
+            return;
+        }
+        if(this.fireEvent("beforeshow", this) === false){
+            return;
+        }
+        if(cb){
+            this.callback = cb;
+        }
+        if(scope){
+        	this.scope = scope;
+        }
+        this.hidden = false;
+        this.beforeShow();
+       	this.afterShow();
+       	hex = hex || '000000';
+        this.setColor(hex);
+	}
+});
+Ext.applyIf( Ext.ux.ColorDialog.prototype, Ext.ux.ColorPicker.prototype );
+/**
+ *
+ */
+Ext.ux.ColorPanel = Ext.extend( Ext.Panel, {
+	initComponent: function() {
+		this.width = ( !this.width || this.width < 300 ) ? 300 : this.width;
+		this.applyDefaultsCP();
+		Ext.ux.ColorPanel.superclass.initComponent.apply( this, arguments );
+	},
+	onRender: function() {
+		Ext.ux.ColorPanel.superclass.onRender.apply( this, arguments );
+		this.renderComponent();
+	}
+});
+Ext.applyIf( Ext.ux.ColorPanel.prototype, Ext.ux.ColorPicker.prototype );
+/**
+ * Register Color* for Lazy Rendering
+ */
+Ext.reg( 'colorpicker', Ext.ux.ColorPicker );
+Ext.reg( 'colordialog', Ext.ux.ColorDialog );
+Ext.reg( 'colorpanel', Ext.ux.ColorPanel );
+
+
+
+/**
+ * @class Ext.ux.form.ColorPickerField
+ * @extends Ext.form.TriggerField
+ * This class makes Ext.ux.ColorPicker available as a form field.
+ * @license: BSD
+ * @author: Robert B. Williams (extjs id: vtswingkid)
+ * @constructor
+ * Creates a new ColorPickerField
+ * @param {Object} config Configuration options
+ * @version 1.1.2
+ */
+
+Ext.ux.menu.ColorItem = function(config){
+	if(!config)config={};
+	config.style="width:350px;";
+    Ext.ux.menu.ColorItem.superclass.constructor.call(this, new Ext.ux.ColorPicker(config), config);
+    this.picker = this.component;
+	this.addEvents('select');
+    this.picker.on("render", function(picker){
+        picker.getEl().swallowEvent("click");
+    });
+	this.picker.on("select", this.onSelect, this);	
+};
+Ext.extend(Ext.ux.menu.ColorItem, Ext.menu.Adapter, {
+    // private
+    onSelect : function(picker, color){
+        this.fireEvent("select", this, color, picker);
+        Ext.ux.menu.ColorItem.superclass.handleClick.call(this);
+    }
+});
+
+Ext.ux.menu.ColorMenu = function(config){
+    Ext.ux.menu.ColorMenu.superclass.constructor.call(this, config);
+    this.plain = true;
+    var ci = new Ext.ux.menu.ColorItem(config);
+    this.add(ci);
+    this.picker = ci.picker;
+    this.relayEvents(ci, ["select"]);	
+};
+Ext.extend(Ext.ux.menu.ColorMenu, Ext.menu.Menu, {
+    beforeDestroy : function() {
+        this.picker.destroy();
+    }
+});
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/dialogs/colorpicker/colorpicker.css
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/dialogs/colorpicker/colorpicker.css	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/dialogs/colorpicker/colorpicker.css	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,73 @@
+.x-cp-rgbpicker {
+	background-image: url(images/mask.png);
+	background-repeat: no-repeat;
+	background-color: red;
+	width: 182px;
+	height: 182px;
+	margin: 7px 0 7px 7px;
+	float: left;
+	cursor: pointer;
+	_cursor: hand;
+	_background-image:none;
+	_filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='system/dialogs/colorpicker/mask.png',sizingMethod='scale');
+}
+.x-cp-rgbslider {
+	position: relative;
+	left: -7px;
+	top: -7px;
+	width: 15px;
+	height: 15px;
+	background-image: url(images/slider-rgb.gif) !important;
+	background-repeat: no-repeat;
+	cursor: pointer;
+	_cursor: hand;
+}
+.x-cp-huepicker {
+	height: 183px;
+	width: 9px;
+	float: left;
+	margin: 7px 0 0 10px;
+	background-image: url(images/hue.png) !important;
+	background-repeat: no-repeat;
+	cursor: pointer;
+	_cursor: hand;
+}
+.x-cp-hueslider {
+	position: relative;
+	left: -3px;
+	top: -7px;
+	width: 15px;
+	height: 15px;
+	background-image: url(images/slider-rgb.gif) !important;
+	background-repeat: no-repeat;
+	cursor: pointer;
+	_cursor: hand;
+}
+.x-cp-formcontainer {
+	float: left;
+	width: 116px;
+	padding: 0;
+	border: none;
+	margin: -22px 0 0 15px !important;
+}
+.x-cp-formcontainer .x-panel-body {
+	background-color:transparent;
+}
+.x-cp-clearfloat {
+	clear: both;
+}
+.x-cp-colorbox {
+	margin: 0 13px 0 15px;
+	border: 1px solid black;
+	text-align: center;
+	font-size: 10px;
+	/* height: 12px; */
+	height: 69px;
+	font-weight: bold;
+	padding: 0;
+	/* cursor: pointer;
+	_cursor: hand; */
+}
+.x-cp-formcontainer input {
+	text-align: right;
+}
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/dialogs/colorpicker/images/hue.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/dialogs/colorpicker/images/hue.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/dialogs/colorpicker/images/mask.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/dialogs/colorpicker/images/mask.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/dialogs/colorpicker/images/slider-rgb.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/dialogs/colorpicker/images/slider-rgb.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/cookies.js
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/cookies.js	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/cookies.js	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,85 @@
+/*
+ * SAMPLE CODE AT BOTTOM!!!
+ *
+ * You need to put the name and values in quotes when you call the function, like this:
+ * set_cookie( 'mycookie', 'visited 9 times', 30, '/', '', '' );. Don't forget to put in empty quotes for the unused parameters or
+ * you'll get an error when you run the code. This makes the cookie named 'mycookie', with the value of 'visited 9 times', and with 
+ * a life of 30 days, and the cookie is set to your root folder.
+ *
+ * The Set_Cookie values for 'domain' and 'secure' are not utilized. Use 'domain' on the Javascript cookie if you are using it on a 
+ * subdomain, like widgets.yoursite.com, where the cookie is set on the widgets subdomain, but you need it to be accessible over the
+ * whole yoursite.com domain.
+ *
+ * It's good practice to not assume the path to the site root will be set the way you want it by default, so do this manually as a 
+ * rule, '/'. If no value is set for expires, it will only last as long as the current session of the visitor, and will be automatically 
+ * deleted when they close their browser. 
+ */
+
+function set_cookie(name, value, expires, path, domain, secure) 
+{
+	// set time, it's in milliseconds
+	var today = new Date();
+	today.setTime( today.getTime() );
+	/*
+	if the expires variable is set, make the correct 
+	expires time, the current script below will set 
+	it for x number of days, to make it for hours, 
+	delete * 24, for minutes, delete * 60 * 24
+	*/
+	if ( expires )
+	{
+	expires = expires * 1000 * 60 * 60 * 24;
+	}
+	var expires_date = new Date( today.getTime() + (expires) );
+	
+	document.cookie = name + "=" +escape( value ) +
+	( ( expires ) ? ";expires=" + expires_date.toGMTString() : "" ) + 
+	( ( path ) ? ";path=" + path : "" ) + 
+	( ( domain ) ? ";domain=" + domain : "" ) +
+	( ( secure ) ? ";secure" : "" );
+}
+
+/*
+ * This will retrieve the cookie by name, if the cookie does not exist, it will return false, so you can do things like 
+ * if ( Get_Cookie( 'your_cookie' ) ) do something.
+ */
+
+function get_cookie(name) {
+	var start = document.cookie.indexOf(name + "=");
+	var len = start + name.length + 1;
+	if ((!start) && (name != document.cookie.substring(0, name.length )))
+	{
+		return null;
+	}
+	if (start == -1) return null;
+	var end = document.cookie.indexOf(";", len);
+	if (end == -1) end = document.cookie.length;
+	return unescape(document.cookie.substring(len, end));
+}
+
+/*
+ * Here all you need to do is put in: Delete_Cookie('cookie name', '/', '') and the cookie will be deleted. Remember to match 
+ * the cookie name, path, and domain to what you have it in Set_Cookie exactly, or you may get some very hard to diagnose errors.
+ */
+
+// this deletes the cookie when called
+function Delete_Cookie(name, path, domain) {
+	if(Get_Cookie(name)) document.cookie = name + "=" + ((path) ? ";path=" + path : "") + ((domain) ? ";domain=" + domain : "" ) + ";expires=Thu, 01-Jan-1970 00:00:01 GMT";
+}
+
+/*
+ * SAMPLE CODE
+ *
+ * <script type="text/javascript">
+ * // remember, these are the possible parameters for Set_Cookie:
+ * // name, value, expires, path, domain, secure
+ * Set_Cookie( 'test', 'it works', '', '/', '', '' );
+ * if ( Get_Cookie( 'test' ) ) alert( Get_Cookie('test'));
+ * // and these are the parameters for Delete_Cookie:
+ * // name, path, domain
+ * // make sure you use the same parameters in Set and Delete Cookie.
+ * Delete_Cookie('test', '/', '');
+ * ( Get_Cookie( 'test' ) ) ? alert( Get_Cookie('test')) : 
+ * alert( 'it is gone');
+ * </script>
+ */
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/ext-login.js
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/ext-login.js	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/ext-login.js	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,106 @@
+/*
+ * Ext JS Library 2.1
+ * Copyright(c) 2006-2008, Ext JS, LLC.
+ * licensing@xxxxxxxxx
+ * 
+ * http://extjs.com/license
+ */
+
+
+Ext={version:"2.1"};window["undefined"]=window["undefined"];Ext.apply=function(C,D,B){if(B){Ext.apply(C,B)}if(C&&D&&typeof D=="object"){for(var A in D){C[A]=D[A]}}return C};(function(){var idSeed=0;var ua=navigator.userAgent.toLowerCase();var isStrict=document.compatMode=="CSS1Compat",isOpera=ua.indexOf("opera")>-1,isSafari=(/webkit|khtml/).test(ua),isSafari3=isSafari&&ua.indexOf("webkit/5")!=-1,isIE=!isOpera&&ua.indexOf("msie")>-1,isIE7=!isOpera&&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),isAir=(ua.indexOf("adobeair")!=-1),isLinux=(ua.indexOf("linux")!=-1),isSecure=window.location.href.toLowerCase().indexOf("https")===0;if(isIE&&!isIE7){try{document.execCommand("BackgroundImageCache",false,true)}catch(e){}}Ext.apply(Ext,{isStrict:isStrict,isSecure:isSecure,isReady:false,enableGarbageCollector:true,enableListenerCollection: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 cache={};for(var b in o){var parts=b.split("@");if(parts[1]){var s=parts[0];if(!cache[s]){cache[s]=Ext.select(s)}cache[s].on(parts[1],o[b])}}cache=null},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},extend:function(){var io=function(o){for(var m in o){this[m]=o[m]}};var oc=Object.prototype.constructor;return function(sb,sp,overrides){if(typeof sp=="object"){overrides=sp;sp=sb;sb=overrides.constructor!=oc?overrides.constructor: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==oc){spp.constructor=sp}sb.override=function(o){Ext.override(sb,o)};sbp.override=io;Ext.override(sb,overrides);sb.extend=function(o){Ext.extend(sb,o)};return sb}}(),override:function(origclass,overrides){if(overrides){var p=origclass.prototype;for(var method in overrides){p[method]=overrides[method]}}},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]]}}},urlEncode:function(o){if(!o){return""}var buf=[];for(var key in o){var ov=o[key],k=encodeURIComponent(key);var type=typeof ov;if(type=="undefined"){buf.push(k,"=&")}else{if(type!="function"&&type!="object"){buf.push(k,"=",encodeURIComponent(ov),"&")}else{if(Ext.isArray(ov)){if(ov.length){for(var i=0,len=ov.length;i<len;i++){buf.push(k,"=",encodeURIComponent(ov[i]===undefined?"":ov[i]),"&")}}else{buf.push(k,"=&")}}}}}buf.pop();return buf.join("")},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},each:function(array,fn,scope){if(!Ext.isArray(array)){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}}},combine:function(){var as=arguments,l=as.length,r=[];for(var i=0;i<l;i++){var a=as[i];if(Ext.isArray(a)){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},escapeRe:function(s){return s.replace(/([.*+?^${}()|[\]\/\\])/g,"\\$1")},callback:function(cb,scope,args,delay){if(typeof cb=="function"){if(delay){cb.defer(delay,scope,args||[])}else{cb.apply(scope,args||[])}}},getDom:function(el){if(!el||!document){return null}return el.dom?el.dom:(typeof el=="string"?document.getElementById(el):el)},getDoc:function(){return Ext.get(document)},getBody:function(){return Ext.get(document.body||document.documentElement)},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(typeof as.destroy=="function"){as.destroy()}else{if(as.dom){as.removeAllListeners();as.remove()}}}}},removeNode:isIE?function(){var d;return function(n){if(n&&n.tagName!="BODY"){d=d||document.createElement("div");d.appendChild(n);d.innerHTML=""}}}():function(n){if(n&&n.parentNode&&n.tagName!="BODY"){n.parentNode.removeChild(n)}},type:function(o){if(o===undefined||o===null){return false}if(o.htmlElement){return"element"}var t=typeof o;if(t=="object"&&o.nodeName){switch(o.nodeType){case 1:return"element";case 3:return(/\S/).test(o.nodeValue)?"textnode":"whitespace"}}if(t=="object"||t=="function"){switch(o.constructor){case Array:return"array";case RegExp:return"regexp"}if(typeof o.length=="number"&&typeof o.item=="function"){return"nodelist"}}return t},isEmpty:function(v,allowBlank){return v===null||v===undefined||(!allowBlank?v==="":false)},value:function(v,defaultValue,allowBlank){return Ext.isEmpty(v,allowBlank)?defaultValue:v},isArray:function(v){return v&&typeof v.pop=="function"},isDate:function(v){return v&&typeof v.getFullYear=="function"},isOpera:isOpera,isSafari:isSafari,isSafari3:isSafari3,isSafari2:isSafari&&!isSafari3,isIE:isIE,isIE6:isIE&&!isIE7,isIE7:isIE7,isGecko:isGecko,isBorderBox:isBorderBox,isLinux:isLinux,isWindows:isWindows,isMac:isMac,isAir:isAir,useShims:((isIE&&!isIE7)||(isGecko&&isMac))});Ext.ns=Ext.namespace})();Ext.ns("Ext","Ext.util","Ext.grid","Ext.dd","Ext.tree","Ext.data","Ext.form","Ext.menu","Ext.state","Ext.lib","Ext.layout","Ext.app","Ext.ux");Ext.apply(Function.prototype,{createCallback:function(){var A=arguments;var B=this;return function(){return B.apply(window,A)}},createDelegate:function(C,B,A){var D=this;return function(){var F=B||arguments;if(A===true){F=Array.prototype.slice.call(arguments,0);F=F.concat(B)}else{if(typeof A=="number"){F=Array.prototype.slice.call(arguments,0);var E=[A,0].concat(B);Array.prototype.splice.apply(F,E)}}return D.apply(C||window,F)}},defer:function(C,E,B,A){var D=this.createDelegate(E,B,A);if(C){return setTimeout(D,C)}D();return 0},createSequence:function(B,A){if(typeof B!="function"){return this}var C=this;return function(){var D=C.apply(this||window,arguments);B.apply(A||this||window,arguments);return D}},createInterceptor:function(B,A){if(typeof B!="function"){return this}var C=this;return function(){B.target=this;B.method=C;if(B.apply(A||this||window,arguments)===false){return }return C.apply(this||window,arguments)}}});Ext.applyIf(String,{escape:function(A){return A.replace(/('|\\)/g,"\\$1")},leftPad:function(D,B,C){var A=new String(D);if(!C){C=" "}while(A.length<B){A=C+A}return A.toString()},format:function(B){var A=Array.prototype.slice.call(arguments,1);return B.replace(/\{(\d+)\}/g,function(C,D){return A[D]})}});String.prototype.toggle=function(B,A){return this==B?A:B};String.prototype.trim=function(){var A=/^\s+|\s+$/g;return function(){return this.replace(A,"")}}();Ext.applyIf(Number.prototype,{constrain:function(B,A){return Math.min(Math.max(this,B),A)}});Ext.applyIf(Array.prototype,{indexOf:function(C){for(var B=0,A=this.length;B<A;B++){if(this[B]==C){return B}}return -1},remove:function(B){var A=this.indexOf(B);if(A!=-1){this.splice(A,1)}return this}});Date.prototype.getElapsed=function(A){return Math.abs((A||new Date()).getTime()-this.getTime())};
+
+
+(function(){var B;Ext.lib.Dom={getViewWidth:function(E){return E?this.getDocumentWidth():this.getViewportWidth()},getViewHeight:function(E){return E?this.getDocumentHeight():this.getViewportHeight()},getDocumentHeight:function(){var E=(document.compatMode!="CSS1Compat")?document.body.scrollHeight:document.documentElement.scrollHeight;return Math.max(E,this.getViewportHeight())},getDocumentWidth:function(){var E=(document.compatMode!="CSS1Compat")?document.body.scrollWidth:document.documentElement.scrollWidth;return Math.max(E,this.getViewportWidth())},getViewportHeight:function(){if(Ext.isIE){return Ext.isStrict?document.documentElement.clientHeight:document.body.clientHeight}else{return self.innerHeight}},getViewportWidth:function(){if(Ext.isIE){return Ext.isStrict?document.documentElement.clientWidth:document.body.clientWidth}else{return self.innerWidth}},isAncestor:function(F,G){F=Ext.getDom(F);G=Ext.getDom(G);if(!F||!G){return false}if(F.contains&&!Ext.isSafari){return F.contains(G)}else{if(F.compareDocumentPosition){return !!(F.compareDocumentPosition(G)&16)}else{var E=G.parentNode;while(E){if(E==F){return true}else{if(!E.tagName||E.tagName.toUpperCase()=="HTML"){return false}}E=E.parentNode}return false}}},getRegion:function(E){return Ext.lib.Region.getRegion(E)},getY:function(E){return this.getXY(E)[1]},getX:function(E){return this.getXY(E)[0]},getXY:function(G){var F,K,M,N,J=(document.body||document.documentElement);G=Ext.getDom(G);if(G==J){return[0,0]}if(G.getBoundingClientRect){M=G.getBoundingClientRect();N=C(document).getScroll();return[M.left+N.left,M.top+N.top]}var O=0,L=0;F=G;var E=C(G).getStyle("position")=="absolute";while(F){O+=F.offsetLeft;L+=F.offsetTop;if(!E&&C(F).getStyle("position")=="absolute"){E=true}if(Ext.isGecko){K=C(F);var P=parseInt(K.getStyle("borderTopWidth"),10)||0;var H=parseInt(K.getStyle("borderLeftWidth"),10)||0;O+=H;L+=P;if(F!=G&&K.getStyle("overflow")!="visible"){O+=H;L+=P}}F=F.offsetParent}if(Ext.isSafari&&E){O-=J.offsetLeft;L-=J.offsetTop}if(Ext.isGecko&&!E){var I=C(J);O+=parseInt(I.getStyle("borderLeftWidth"),10)||0;L+=parseInt(I.getStyle("borderTopWidth"),10)||0}F=G.parentNode;while(F&&F!=J){if(!Ext.isOpera||(F.tagName!="TR"&&C(F).getStyle("display")!="inline")){O-=F.scrollLeft;L-=F.scrollTop}F=F.parentNode}return[O,L]},setXY:function(E,F){E=Ext.fly(E,"_setXY");E.position();var G=E.translatePoints(F);if(F[0]!==false){E.dom.style.left=G.left+"px"}if(F[1]!==false){E.dom.style.top=G.top+"px"}},setX:function(F,E){this.setXY(F,[E,false])},setY:function(E,F){this.setXY(E,[false,F])}};Ext.lib.Event=function(){var F=false;var G=[];var K=[];var I=0;var H=[];var E=0;var J=null;return{POLL_RETRYS:200,POLL_INTERVAL:20,EL:0,TYPE:1,FN:2,WFN:3,OBJ:3,ADJ_SCOPE:4,_interval:null,startInterval:function(){if(!this._interval){var L=this;var M=function(){L._tryPreloadAttach()};this._interval=setInterval(M,this.POLL_INTERVAL)}},onAvailable:function(N,L,O,M){H.push({id:N,fn:L,obj:O,override:M,checkReady:false});I=this.POLL_RETRYS;this.startInterval()},addListener:function(Q,M,P){Q=Ext.getDom(Q);if(!Q||!P){return false}if("unload"==M){K[K.length]=[Q,M,P];return true}var O=function(R){return typeof Ext!="undefined"?P(Ext.lib.Event.getEvent(R)):false};var L=[Q,M,P,O];var N=G.length;G[N]=L;this.doAdd(Q,M,O,false);return true},removeListener:function(S,O,R){var Q,N;S=Ext.getDom(S);if(!R){return this.purgeElement(S,false,O)}if("unload"==O){for(Q=0,N=K.length;Q<N;Q++){var M=K[Q];if(M&&M[0]==S&&M[1]==O&&M[2]==R){K.splice(Q,1);return true}}return false}var L=null;var P=arguments[3];if("undefined"==typeof P){P=this._getCacheIndex(S,O,R)}if(P>=0){L=G[P]}if(!S||!L){return false}this.doRemove(S,O,L[this.WFN],false);delete G[P][this.WFN];delete G[P][this.FN];G.splice(P,1);return true},getTarget:function(N,M){N=N.browserEvent||N;var L=N.target||N.srcElement;return this.resolveTextNode(L)},resolveTextNode:function(L){if(Ext.isSafari&&L&&3==L.nodeType){return L.parentNode}else{return L}},getPageX:function(M){M=M.browserEvent||M;var L=M.pageX;if(!L&&0!==L){L=M.clientX||0;if(Ext.isIE){L+=this.getScroll()[1]}}return L},getPageY:function(L){L=L.browserEvent||L;var M=L.pageY;if(!M&&0!==M){M=L.clientY||0;if(Ext.isIE){M+=this.getScroll()[0]}}return M},getXY:function(L){L=L.browserEvent||L;return[this.getPageX(L),this.getPageY(L)]},getRelatedTarget:function(M){M=M.browserEvent||M;var L=M.relatedTarget;if(!L){if(M.type=="mouseout"){L=M.toElement}else{if(M.type=="mouseover"){L=M.fromElement}}}return this.resolveTextNode(L)},getTime:function(N){N=N.browserEvent||N;if(!N.time){var M=new Date().getTime();try{N.time=M}catch(L){this.lastError=L;return M}}return N.time},stopEvent:function(L){this.stopPropagation(L);this.preventDefault(L)},stopPropagation:function(L){L=L.browserEvent||L;if(L.stopPropagation){L.stopPropagation()}else{L.cancelBubble=true}},preventDefault:function(L){L=L.browserEvent||L;if(L.preventDefault){L.preventDefault()}else{L.returnValue=false}},getEvent:function(M){var L=M||window.event;if(!L){var N=this.getEvent.caller;while(N){L=N.arguments[0];if(L&&Event==L.constructor){break}N=N.caller}}return L},getCharCode:function(L){L=L.browserEvent||L;return L.charCode||L.keyCode||0},_getCacheIndex:function(Q,N,P){for(var O=0,M=G.length;O<M;++O){var L=G[O];if(L&&L[this.FN]==P&&L[this.EL]==Q&&L[this.TYPE]==N){return O}}return -1},elCache:{},getEl:function(L){return document.getElementById(L)},clearCache:function(){},_load:function(M){F=true;var L=Ext.lib.Event;if(Ext.isIE){L.doRemove(window,"load",L._load)}},_tryPreloadAttach:function(){if(this.locked){return false}this.locked=true;var R=!F;if(!R){R=(I>0)}var Q=[];for(var M=0,L=H.length;M<L;++M){var P=H[M];if(P){var O=this.getEl(P.id);if(O){if(!P.checkReady||F||O.nextSibling||(document&&document.body)){var N=O;if(P.override){if(P.override===true){N=P.obj}else{N=P.override}}P.fn.call(N,P.obj);H[M]=null}}else{Q.push(P)}}}I=(Q.length===0)?0:I-1;if(R){this.startInterval()}else{clearInterval(this._interval);this._interval=null}this.locked=false;return true},purgeElement:function(P,Q,N){var R=this.getListeners(P,N);if(R){for(var O=0,L=R.length;O<L;++O){var M=R[O];this.removeListener(P,M.type,M.fn)}}if(Q&&P&&P.childNodes){for(O=0,L=P.childNodes.length;O<L;++O){this.purgeElement(P.childNodes[O],Q,N)}}},getListeners:function(M,R){var P=[],L;if(!R){L=[G,K]}else{if(R=="unload"){L=[K]}else{L=[G]}}for(var O=0;O<L.length;++O){var T=L[O];if(T&&T.length>0){for(var Q=0,S=T.length;Q<S;++Q){var N=T[Q];if(N&&N[this.EL]===M&&(!R||R===N[this.TYPE])){P.push({type:N[this.TYPE],fn:N[this.FN],obj:N[this.OBJ],adjust:N[this.ADJ_SCOPE],index:Q})}}}}return(P.length)?P:null},_unload:function(S){var R=Ext.lib.Event,P,O,M,L,N;for(P=0,L=K.length;P<L;++P){M=K[P];if(M){var Q=window;if(M[R.ADJ_SCOPE]){if(M[R.ADJ_SCOPE]===true){Q=M[R.OBJ]}else{Q=M[R.ADJ_SCOPE]}}M[R.FN].call(Q,R.getEvent(S),M[R.OBJ]);K[P]=null;M=null;Q=null}}K=null;if(G&&G.length>0){O=G.length;while(O){N=O-1;M=G[N];if(M){R.removeListener(M[R.EL],M[R.TYPE],M[R.FN],N)}O=O-1}M=null;R.clearCache()}R.doRemove(window,"unload",R._unload)},getScroll:function(){var L=document.documentElement,M=document.body;if(L&&(L.scrollTop||L.scrollLeft)){return[L.scrollTop,L.scrollLeft]}else{if(M){return[M.scrollTop,M.scrollLeft]}else{return[0,0]}}},doAdd:function(){if(window.addEventListener){return function(O,M,N,L){O.addEventListener(M,N,(L))}}else{if(window.attachEvent){return function(O,M,N,L){O.attachEvent("on"+M,N)}}else{return function(){}}}}(),doRemove:function(){if(window.removeEventListener){return function(O,M,N,L){O.removeEventListener(M,N,(L))}}else{if(window.detachEvent){return function(N,L,M){N.detachEvent("on"+L,M)}}else{return function(){}}}}()}}();var D=Ext.lib.Event;D.on=D.addListener;D.un=D.removeListener;if(document&&document.body){D._load()}else{D.doAdd(window,"load",D._load)}D.doAdd(window,"unload",D._unload);D._tryPreloadAttach();Ext.lib.Ajax={request:function(K,I,E,J,F){if(F){var G=F.headers;if(G){for(var H in G){if(G.hasOwnProperty(H)){this.initHeader(H,G[H],false)}}}if(F.xmlData){if(!G||!G["Content-Type"]){this.initHeader("Content-Type","text/xml",false)}K=(K?K:(F.method?F.method:"POST"));J=F.xmlData}else{if(F.jsonData){if(!G||!G["Content-Type"]){this.initHeader("Content-Type","application/json",false)}K=(K?K:(F.method?F.method:"POST"));J=typeof F.jsonData=="object"?Ext.encode(F.jsonData):F.jsonData}}}return this.asyncRequest(K,I,E,J)},serializeForm:function(F){if(typeof F=="string"){F=(document.getElementById(F)||document.forms[F])}var G,E,H,J,K="",M=false;for(var L=0;L<F.elements.length;L++){G=F.elements[L];J=F.elements[L].disabled;E=F.elements[L].name;H=F.elements[L].value;if(!J&&E){switch(G.type){case"select-one":case"select-multiple":for(var I=0;I<G.options.length;I++){if(G.options[I].selected){if(Ext.isIE){K+=encodeURIComponent(E)+"="+encodeURIComponent(G.options[I].attributes["value"].specified?G.options[I].value:G.options[I].text)+"&"}else{K+=encodeURIComponent(E)+"="+encodeURIComponent(G.options[I].hasAttribute("value")?G.options[I].value:G.options[I].text)+"&"}}}break;case"radio":case"checkbox":if(G.checked){K+=encodeURIComponent(E)+"="+encodeURIComponent(H)+"&"}break;case"file":case undefined:case"reset":case"button":break;case"submit":if(M==false){K+=encodeURIComponent(E)+"="+encodeURIComponent(H)+"&";M=true}break;default:K+=encodeURIComponent(E)+"="+encodeURIComponent(H)+"&";break}}}K=K.substr(0,K.length-1);return K},headers:{},hasHeaders:false,useDefaultHeader:true,defaultPostHeader:"application/x-www-form-urlencoded",useDefaultXhrHeader:true,defaultXhrHeader:"XMLHttpRequest",hasDefaultHeaders:true,defaultHeaders:{},poll:{},timeout:{},pollInterval:50,transactionId:0,setProgId:function(E){this.activeX.unshift(E)},setDefaultPostHeader:function(E){this.useDefaultHeader=E},setDefaultXhrHeader:function(E){this.useDefaultXhrHeader=E},setPollingInterval:function(E){if(typeof E=="number"&&isFinite(E)){this.pollInterval=E}},createXhrObject:function(I){var H,E;try{E=new XMLHttpRequest();H={conn:E,tId:I}}catch(G){for(var F=0;F<this.activeX.length;++F){try{E=new ActiveXObject(this.activeX[F]);H={conn:E,tId:I};break}catch(G){}}}finally{return H}},getConnectionObject:function(){var F;var G=this.transactionId;try{F=this.createXhrObject(G);if(F){this.transactionId++}}catch(E){}finally{return F}},asyncRequest:function(I,F,H,E){var G=this.getConnectionObject();if(!G){return null}else{G.conn.open(I,F,true);if(this.useDefaultXhrHeader){if(!this.defaultHeaders["X-Requested-With"]){this.initHeader("X-Requested-With",this.defaultXhrHeader,true)}}if(E&&this.useDefaultHeader&&(!this.hasHeaders||!this.headers["Content-Type"])){this.initHeader("Content-Type",this.defaultPostHeader)}if(this.hasDefaultHeaders||this.hasHeaders){this.setHeader(G)}this.handleReadyState(G,H);G.conn.send(E||null);return G}},handleReadyState:function(F,G){var E=this;if(G&&G.timeout){this.timeout[F.tId]=window.setTimeout(function(){E.abort(F,G,true)},G.timeout)}this.poll[F.tId]=window.setInterval(function(){if(F.conn&&F.conn.readyState==4){window.clearInterval(E.poll[F.tId]);delete E.poll[F.tId];if(G&&G.timeout){window.clearTimeout(E.timeout[F.tId]);delete E.timeout[F.tId]}E.handleTransactionResponse(F,G)}},this.pollInterval)},handleTransactionResponse:function(I,J,E){if(!J){this.releaseObject(I);return }var G,F;try{if(I.conn.status!==undefined&&I.conn.status!=0){G=I.conn.status}else{G=13030}}catch(H){G=13030}if(G>=200&&G<300){F=this.createResponseObject(I,J.argument);if(J.success){if(!J.scope){J.success(F)}else{J.success.apply(J.scope,[F])}}}else{switch(G){case 12002:case 12029:case 12030:case 12031:case 12152:case 13030:F=this.createExceptionObject(I.tId,J.argument,(E?E:false));if(J.failure){if(!J.scope){J.failure(F)}else{J.failure.apply(J.scope,[F])}}break;default:F=this.createResponseObject(I,J.argument);if(J.failure){if(!J.scope){J.failure(F)}else{J.failure.apply(J.scope,[F])}}}}this.releaseObject(I);F=null},createResponseObject:function(E,K){var H={};var M={};try{var G=E.conn.getAllResponseHeaders();var J=G.split("\n");for(var I=0;I<J.length;I++){var F=J[I].indexOf(":");if(F!=-1){M[J[I].substring(0,F)]=J[I].substring(F+2)}}}catch(L){}H.tId=E.tId;H.status=E.conn.status;H.statusText=E.conn.statusText;H.getResponseHeader=M;H.getAllResponseHeaders=G;H.responseText=E.conn.responseText;H.responseXML=E.conn.responseXML;if(typeof K!==undefined){H.argument=K}return H},createExceptionObject:function(L,H,E){var J=0;var K="communication failure";var G=-1;var F="transaction aborted";var I={};I.tId=L;if(E){I.status=G;I.statusText=F}else{I.status=J;I.statusText=K}if(H){I.argument=H}return I},initHeader:function(E,H,G){var F=(G)?this.defaultHeaders:this.headers;if(F[E]===undefined){F[E]=H}else{F[E]=H+","+F[E]}if(G){this.hasDefaultHeaders=true}else{this.hasHeaders=true}},setHeader:function(E){if(this.hasDefaultHeaders){for(var F in this.defaultHeaders){if(this.defaultHeaders.hasOwnProperty(F)){E.conn.setRequestHeader(F,this.defaultHeaders[F])}}}if(this.hasHeaders){for(var F in this.headers){if(this.headers.hasOwnProperty(F)){E.conn.setRequestHeader(F,this.headers[F])}}this.headers={};this.hasHeaders=false}},resetDefaultHeaders:function(){delete this.defaultHeaders;this.defaultHeaders={};this.hasDefaultHeaders=false},abort:function(F,G,E){if(this.isCallInProgress(F)){F.conn.abort();window.clearInterval(this.poll[F.tId]);delete this.poll[F.tId];if(E){delete this.timeout[F.tId]}this.handleTransactionResponse(F,G,true);return true}else{return false}},isCallInProgress:function(E){if(E.conn){return E.conn.readyState!=4&&E.conn.readyState!=0}else{return false}},releaseObject:function(E){E.conn=null;E=null},activeX:["MSXML2.XMLHTTP.3.0","MSXML2.XMLHTTP","Microsoft.XMLHTTP"]};Ext.lib.Region=function(G,H,E,F){this.top=G;this[1]=G;this.right=H;this.bottom=E;this.left=F;this[0]=F};Ext.lib.Region.prototype={contains:function(E){return(E.left>=this.left&&E.right<=this.right&&E.top>=this.top&&E.bottom<=this.bottom)},getArea:function(){return((this.bottom-this.top)*(this.right-this.left))},intersect:function(I){var G=Math.max(this.top,I.top);var H=Math.min(this.right,I.right);var E=Math.min(this.bottom,I.bottom);var F=Math.max(this.left,I.left);if(E>=G&&H>=F){return new Ext.lib.Region(G,H,E,F)}else{return null}},union:function(I){var G=Math.min(this.top,I.top);var H=Math.max(this.right,I.right);var E=Math.max(this.bottom,I.bottom);var F=Math.min(this.left,I.left);return new Ext.lib.Region(G,H,E,F)},constrainTo:function(E){this.top=this.top.constrain(E.top,E.bottom);this.bottom=this.bottom.constrain(E.top,E.bottom);this.left=this.left.constrain(E.left,E.right);this.right=this.right.constrain(E.left,E.right);return this},adjust:function(G,F,E,H){this.top+=G;this.left+=F;this.right+=H;this.bottom+=E;return this}};Ext.lib.Region.getRegion=function(H){var J=Ext.lib.Dom.getXY(H);var G=J[1];var I=J[0]+H.offsetWidth;var E=J[1]+H.offsetHeight;var F=J[0];return new Ext.lib.Region(G,I,E,F)};Ext.lib.Point=function(E,F){if(Ext.isArray(E)){F=E[1];E=E[0]}this.x=this.right=this.left=this[0]=E;this.y=this.top=this.bottom=this[1]=F};Ext.lib.Point.prototype=new Ext.lib.Region();Ext.lib.Anim={scroll:function(H,F,I,J,E,G){return this.run(H,F,I,J,E,G,Ext.lib.Scroll)},motion:function(H,F,I,J,E,G){return this.run(H,F,I,J,E,G,Ext.lib.Motion)},color:function(H,F,I,J,E,G){return this.run(H,F,I,J,E,G,Ext.lib.ColorAnim)},run:function(I,F,K,L,E,H,G){G=G||Ext.lib.AnimBase;if(typeof L=="string"){L=Ext.lib.Easing[L]}var J=new G(I,F,K,L);J.animateX(function(){Ext.callback(E,H)});return J}};function C(E){if(!B){B=new Ext.Element.Flyweight()}B.dom=E;return B}if(Ext.isIE){function A(){var E=Function.prototype;delete E.createSequence;delete E.defer;delete E.createDelegate;delete E.createCallback;delete E.createInterceptor;window.detachEvent("onunload",A)}window.attachEvent("onunload",A)}Ext.lib.AnimBase=function(F,E,G,H){if(F){this.init(F,E,G,H)}};Ext.lib.AnimBase.prototype={toString:function(){var E=this.getEl();var F=E.id||E.tagName;return("Anim "+F)},patterns:{noNegatives:/width|height|opacity|padding/i,offsetAttribute:/^((width|height)|(top|left))$/,defaultUnit:/width|height|top$|bottom$|left$|right$/i,offsetUnit:/\d+(em|%|en|ex|pt|in|cm|mm|pc)$/i},doMethod:function(E,G,F){return this.method(this.currentFrame,G,F-G,this.totalFrames)},setAttribute:function(E,G,F){if(this.patterns.noNegatives.test(E)){G=(G>0)?G:0}Ext.fly(this.getEl(),"_anim").setStyle(E,G+F)},getAttribute:function(E){var G=this.getEl();var I=C(G).getStyle(E);if(I!=="auto"&&!this.patterns.offsetUnit.test(I)){return parseFloat(I)}var F=this.patterns.offsetAttribute.exec(E)||[];var J=!!(F[3]);var H=!!(F[2]);if(H||(C(G).getStyle("position")=="absolute"&&J)){I=G["offset"+F[0].charAt(0).toUpperCase()+F[0].substr(1)]}else{I=0}return I},getDefaultUnit:function(E){if(this.patterns.defaultUnit.test(E)){return"px"}return""},animateX:function(G,E){var F=function(){this.onComplete.removeListener(F);if(typeof G=="function"){G.call(E||this,this)}};this.onComplete.addListener(F,this);this.animate()},setRuntimeAttribute:function(F){var K;var G;var H=this.attributes;this.runtimeAttributes[F]={};var J=function(L){return(typeof L!=="undefined")};if(!J(H[F]["to"])&&!J(H[F]["by"])){return false}K=(J(H[F]["from"]))?H[F]["from"]:this.getAttribute(F);if(J(H[F]["to"])){G=H[F]["to"]}else{if(J(H[F]["by"])){if(K.constructor==Array){G=[];for(var I=0,E=K.length;I<E;++I){G[I]=K[I]+H[F]["by"][I]}}else{G=K+H[F]["by"]}}}this.runtimeAttributes[F].start=K;this.runtimeAttributes[F].end=G;this.runtimeAttributes[F].unit=(J(H[F].unit))?H[F]["unit"]:this.getDefaultUnit(F)},init:function(G,L,K,E){var F=false;var H=null;var J=0;G=Ext.getDom(G);this.attributes=L||{};this.duration=K||1;this.method=E||Ext.lib.Easing.easeNone;this.useSeconds=true;this.currentFrame=0;this.totalFrames=Ext.lib.AnimMgr.fps;this.getEl=function(){return G};this.isAnimated=function(){return F};this.getStartTime=function(){return H};this.runtimeAttributes={};this.animate=function(){if(this.isAnimated()){return false}this.currentFrame=0;this.totalFrames=(this.useSeconds)?Math.ceil(Ext.lib.AnimMgr.fps*this.duration):this.duration;Ext.lib.AnimMgr.registerElement(this)};this.stop=function(O){if(O){this.currentFrame=this.totalFrames;this._onTween.fire()}Ext.lib.AnimMgr.stop(this)};var N=function(){this.onStart.fire();this.runtimeAttributes={};for(var O in this.attributes){this.setRuntimeAttribute(O)}F=true;J=0;H=new Date()};var M=function(){var Q={duration:new Date()-this.getStartTime(),currentFrame:this.currentFrame};Q.toString=function(){return("duration: "+Q.duration+", currentFrame: "+Q.currentFrame)};this.onTween.fire(Q);var P=this.runtimeAttributes;for(var O in P){this.setAttribute(O,this.doMethod(O,P[O].start,P[O].end),P[O].unit)}J+=1};var I=function(){var O=(new Date()-H)/1000;var P={duration:O,frames:J,fps:J/O};P.toString=function(){return("duration: "+P.duration+", frames: "+P.frames+", fps: "+P.fps)};F=false;J=0;this.onComplete.fire(P)};this._onStart=new Ext.util.Event(this);this.onStart=new Ext.util.Event(this);this.onTween=new Ext.util.Event(this);this._onTween=new Ext.util.Event(this);this.onComplete=new Ext.util.Event(this);this._onComplete=new Ext.util.Event(this);this._onStart.addListener(N);this._onTween.addListener(M);this._onComplete.addListener(I)}};Ext.lib.AnimMgr=new function(){var G=null;var F=[];var E=0;this.fps=1000;this.delay=1;this.registerElement=function(J){F[F.length]=J;E+=1;J._onStart.fire();this.start()};this.unRegister=function(K,J){K._onComplete.fire();J=J||I(K);if(J!=-1){F.splice(J,1)}E-=1;if(E<=0){this.stop()}};this.start=function(){if(G===null){G=setInterval(this.run,this.delay)}};this.stop=function(L){if(!L){clearInterval(G);for(var K=0,J=F.length;K<J;++K){if(F[0].isAnimated()){this.unRegister(F[0],0)}}F=[];G=null;E=0}else{this.unRegister(L)}};this.run=function(){for(var L=0,J=F.length;L<J;++L){var K=F[L];if(!K||!K.isAnimated()){continue}if(K.currentFrame<K.totalFrames||K.totalFrames===null){K.currentFrame+=1;if(K.useSeconds){H(K)}K._onTween.fire()}else{Ext.lib.AnimMgr.stop(K,L)}}};var I=function(L){for(var K=0,J=F.length;K<J;++K){if(F[K]==L){return K}}return -1};var H=function(K){var N=K.totalFrames;var M=K.currentFrame;var L=(K.currentFrame*K.duration*1000/K.totalFrames);var J=(new Date()-K.getStartTime());var O=0;if(J<K.duration*1000){O=Math.round((J/L-1)*K.currentFrame)}else{O=N-(M+1)}if(O>0&&isFinite(O)){if(K.currentFrame+O>=N){O=N-(M+1)}K.currentFrame+=O}}};Ext.lib.Bezier=new function(){this.getPosition=function(I,H){var J=I.length;var G=[];for(var F=0;F<J;++F){G[F]=[I[F][0],I[F][1]]}for(var E=1;E<J;++E){for(F=0;F<J-E;++F){G[F][0]=(1-H)*G[F][0]+H*G[parseInt(F+1,10)][0];G[F][1]=(1-H)*G[F][1]+H*G[parseInt(F+1,10)][1]}}return[G[0][0],G[0][1]]}};(function(){Ext.lib.ColorAnim=function(I,H,J,K){Ext.lib.ColorAnim.superclass.constructor.call(this,I,H,J,K)};Ext.extend(Ext.lib.ColorAnim,Ext.lib.AnimBase);var F=Ext.lib;var G=F.ColorAnim.superclass;var E=F.ColorAnim.prototype;E.toString=function(){var H=this.getEl();var I=H.id||H.tagName;return("ColorAnim "+I)};E.patterns.color=/color$/i;E.patterns.rgb=/^rgb\(([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\)$/i;E.patterns.hex=/^#?([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})$/i;E.patterns.hex3=/^#?([0-9A-F]{1})([0-9A-F]{1})([0-9A-F]{1})$/i;E.patterns.transparent=/^transparent|rgba\(0, 0, 0, 0\)$/;E.parseColor=function(H){if(H.length==3){return H}var I=this.patterns.hex.exec(H);if(I&&I.length==4){return[parseInt(I[1],16),parseInt(I[2],16),parseInt(I[3],16)]}I=this.patterns.rgb.exec(H);if(I&&I.length==4){return[parseInt(I[1],10),parseInt(I[2],10),parseInt(I[3],10)]}I=this.patterns.hex3.exec(H);if(I&&I.length==4){return[parseInt(I[1]+I[1],16),parseInt(I[2]+I[2],16),parseInt(I[3]+I[3],16)]}return null};E.getAttribute=function(H){var J=this.getEl();if(this.patterns.color.test(H)){var K=C(J).getStyle(H);if(this.patterns.transparent.test(K)){var I=J.parentNode;K=C(I).getStyle(H);while(I&&this.patterns.transparent.test(K)){I=I.parentNode;K=C(I).getStyle(H);if(I.tagName.toUpperCase()=="HTML"){K="#fff"}}}}else{K=G.getAttribute.call(this,H)}return K};E.doMethod=function(I,M,J){var L;if(this.patterns.color.test(I)){L=[];for(var K=0,H=M.length;K<H;++K){L[K]=G.doMethod.call(this,I,M[K],J[K])}L="rgb("+Math.floor(L[0])+","+Math.floor(L[1])+","+Math.floor(L[2])+")"}else{L=G.doMethod.call(this,I,M,J)}return L};E.setRuntimeAttribute=function(I){G.setRuntimeAttribute.call(this,I);if(this.patterns.color.test(I)){var K=this.attributes;var M=this.parseColor(this.runtimeAttributes[I].start);var J=this.parseColor(this.runtimeAttributes[I].end);if(typeof K[I]["to"]==="undefined"&&typeof K[I]["by"]!=="undefined"){J=this.parseColor(K[I].by);for(var L=0,H=M.length;L<H;++L){J[L]=M[L]+J[L]}}this.runtimeAttributes[I].start=M;this.runtimeAttributes[I].end=J}}})();Ext.lib.Easing={easeNone:function(F,E,H,G){return H*F/G+E},easeIn:function(F,E,H,G){return H*(F/=G)*F+E},easeOut:function(F,E,H,G){return -H*(F/=G)*(F-2)+E},easeBoth:function(F,E,H,G){if((F/=G/2)<1){return H/2*F*F+E}return -H/2*((--F)*(F-2)-1)+E},easeInStrong:function(F,E,H,G){return H*(F/=G)*F*F*F+E},easeOutStrong:function(F,E,H,G){return -H*((F=F/G-1)*F*F*F-1)+E},easeBothStrong:function(F,E,H,G){if((F/=G/2)<1){return H/2*F*F*F*F+E}return -H/2*((F-=2)*F*F*F-2)+E},elasticIn:function(G,E,K,J,F,I){if(G==0){return E}if((G/=J)==1){return E+K}if(!I){I=J*0.3}if(!F||F<Math.abs(K)){F=K;var H=I/4}else{var H=I/(2*Math.PI)*Math.asin(K/F)}return -(F*Math.pow(2,10*(G-=1))*Math.sin((G*J-H)*(2*Math.PI)/I))+E},elasticOut:function(G,E,K,J,F,I){if(G==0){return E}if((G/=J)==1){return E+K}if(!I){I=J*0.3}if(!F||F<Math.abs(K)){F=K;var H=I/4}else{var H=I/(2*Math.PI)*Math.asin(K/F)}return F*Math.pow(2,-10*G)*Math.sin((G*J-H)*(2*Math.PI)/I)+K+E},elasticBoth:function(G,E,K,J,F,I){if(G==0){return E}if((G/=J/2)==2){return E+K}if(!I){I=J*(0.3*1.5)}if(!F||F<Math.abs(K)){F=K;var H=I/4}else{var H=I/(2*Math.PI)*Math.asin(K/F)}if(G<1){return -0.5*(F*Math.pow(2,10*(G-=1))*Math.sin((G*J-H)*(2*Math.PI)/I))+E}return F*Math.pow(2,-10*(G-=1))*Math.sin((G*J-H)*(2*Math.PI)/I)*0.5+K+E},backIn:function(F,E,I,H,G){if(typeof G=="undefined"){G=1.70158}return I*(F/=H)*F*((G+1)*F-G)+E},backOut:function(F,E,I,H,G){if(typeof G=="undefined"){G=1.70158}return I*((F=F/H-1)*F*((G+1)*F+G)+1)+E},backBoth:function(F,E,I,H,G){if(typeof G=="undefined"){G=1.70158}if((F/=H/2)<1){return I/2*(F*F*(((G*=(1.525))+1)*F-G))+E}return I/2*((F-=2)*F*(((G*=(1.525))+1)*F+G)+2)+E},bounceIn:function(F,E,H,G){return H-Ext.lib.Easing.bounceOut(G-F,0,H,G)+E},bounceOut:function(F,E,H,G){if((F/=G)<(1/2.75)){return H*(7.5625*F*F)+E}else{if(F<(2/2.75)){return H*(7.5625*(F-=(1.5/2.75))*F+0.75)+E}else{if(F<(2.5/2.75)){return H*(7.5625*(F-=(2.25/2.75))*F+0.9375)+E}}}return H*(7.5625*(F-=(2.625/2.75))*F+0.984375)+E},bounceBoth:function(F,E,H,G){if(F<G/2){return Ext.lib.Easing.bounceIn(F*2,0,H,G)*0.5+E}return Ext.lib.Easing.bounceOut(F*2-G,0,H,G)*0.5+H*0.5+E}};(function(){Ext.lib.Motion=function(K,J,L,M){if(K){Ext.lib.Motion.superclass.constructor.call(this,K,J,L,M)}};Ext.extend(Ext.lib.Motion,Ext.lib.ColorAnim);var H=Ext.lib;var I=H.Motion.superclass;var F=H.Motion.prototype;F.toString=function(){var J=this.getEl();var K=J.id||J.tagName;return("Motion "+K)};F.patterns.points=/^points$/i;F.setAttribute=function(J,L,K){if(this.patterns.points.test(J)){K=K||"px";I.setAttribute.call(this,"left",L[0],K);I.setAttribute.call(this,"top",L[1],K)}else{I.setAttribute.call(this,J,L,K)}};F.getAttribute=function(J){if(this.patterns.points.test(J)){var K=[I.getAttribute.call(this,"left"),I.getAttribute.call(this,"top")]}else{K=I.getAttribute.call(this,J)}return K};F.doMethod=function(J,N,K){var M=null;if(this.patterns.points.test(J)){var L=this.method(this.currentFrame,0,100,this.totalFrames)/100;M=H.Bezier.getPosition(this.runtimeAttributes[J],L)}else{M=I.doMethod.call(this,J,N,K)}return M};F.setRuntimeAttribute=function(S){if(this.patterns.points.test(S)){var K=this.getEl();var M=this.attributes;var J;var O=M["points"]["control"]||[];var L;var P,R;if(O.length>0&&!Ext.isArray(O[0])){O=[O]}else{var N=[];for(P=0,R=O.length;P<R;++P){N[P]=O[P]}O=N}Ext.fly(K,"_anim").position();if(G(M["points"]["from"])){Ext.lib.Dom.setXY(K,M["points"]["from"])}else{Ext.lib.Dom.setXY(K,Ext.lib.Dom.getXY(K))}J=this.getAttribute("points");if(G(M["points"]["to"])){L=E.call(this,M["points"]["to"],J);var Q=Ext.lib.Dom.getXY(this.getEl());for(P=0,R=O.length;P<R;++P){O[P]=E.call(this,O[P],J)}}else{if(G(M["points"]["by"])){L=[J[0]+M["points"]["by"][0],J[1]+M["points"]["by"][1]];for(P=0,R=O.length;P<R;++P){O[P]=[J[0]+O[P][0],J[1]+O[P][1]]}}}this.runtimeAttributes[S]=[J];if(O.length>0){this.runtimeAttributes[S]=this.runtimeAttributes[S].concat(O)}this.runtimeAttributes[S][this.runtimeAttributes[S].length]=L}else{I.setRuntimeAttribute.call(this,S)}};var E=function(J,L){var K=Ext.lib.Dom.getXY(this.getEl());J=[J[0]-K[0]+L[0],J[1]-K[1]+L[1]];return J};var G=function(J){return(typeof J!=="undefined")}})();(function(){Ext.lib.Scroll=function(I,H,J,K){if(I){Ext.lib.Scroll.superclass.constructor.call(this,I,H,J,K)}};Ext.extend(Ext.lib.Scroll,Ext.lib.ColorAnim);var F=Ext.lib;var G=F.Scroll.superclass;var E=F.Scroll.prototype;E.toString=function(){var H=this.getEl();var I=H.id||H.tagName;return("Scroll "+I)};E.doMethod=function(H,K,I){var J=null;if(H=="scroll"){J=[this.method(this.currentFrame,K[0],I[0]-K[0],this.totalFrames),this.method(this.currentFrame,K[1],I[1]-K[1],this.totalFrames)]}else{J=G.doMethod.call(this,H,K,I)}return J};E.getAttribute=function(H){var J=null;var I=this.getEl();if(H=="scroll"){J=[I.scrollLeft,I.scrollTop]}else{J=G.getAttribute.call(this,H)}return J};E.setAttribute=function(H,K,J){var I=this.getEl();if(H=="scroll"){I.scrollLeft=K[0];I.scrollTop=K[1]}else{G.setAttribute.call(this,H,K,J)}}})()})();
+
+
+Ext.DomHelper=function(){var L=null;var F=/^(?:br|frame|hr|img|input|link|meta|range|spacer|wbr|area|param|col)$/i;var B=/^table|tbody|tr|td$/i;var A=function(T){if(typeof T=="string"){return T}var O="";if(Ext.isArray(T)){for(var R=0,P=T.length;R<P;R++){O+=A(T[R])}return O}if(!T.tag){T.tag="div"}O+="<"+T.tag;for(var N in T){if(N=="tag"||N=="children"||N=="cn"||N=="html"||typeof T[N]=="function"){continue}if(N=="style"){var S=T["style"];if(typeof S=="function"){S=S.call()}if(typeof S=="string"){O+=" style=\""+S+"\""}else{if(typeof S=="object"){O+=" style=\"";for(var Q in S){if(typeof S[Q]!="function"){O+=Q+":"+S[Q]+";"}}O+="\""}}}else{if(N=="cls"){O+=" class=\""+T["cls"]+"\""}else{if(N=="htmlFor"){O+=" for=\""+T["htmlFor"]+"\""}else{O+=" "+N+"=\""+T[N]+"\""}}}}if(F.test(T.tag)){O+="/>"}else{O+=">";var U=T.children||T.cn;if(U){O+=A(U)}else{if(T.html){O+=T.html}}O+="</"+T.tag+">"}return O};var M=function(T,O){var S;if(Ext.isArray(T)){S=document.createDocumentFragment();for(var R=0,P=T.length;R<P;R++){M(T[R],S)}}else{if(typeof T=="string"){S=document.createTextNode(T)}else{S=document.createElement(T.tag||"div");var Q=!!S.setAttribute;for(var N in T){if(N=="tag"||N=="children"||N=="cn"||N=="html"||N=="style"||typeof T[N]=="function"){continue}if(N=="cls"){S.className=T["cls"]}else{if(Q){S.setAttribute(N,T[N])}else{S[N]=T[N]}}}Ext.DomHelper.applyStyles(S,T.style);var U=T.children||T.cn;if(U){M(U,S)}else{if(T.html){S.innerHTML=T.html}}}}if(O){O.appendChild(S)}return S};var I=function(S,Q,P,R){L.innerHTML=[Q,P,R].join("");var N=-1,O=L;while(++N<S){O=O.firstChild}return O};var J="<table>",E="</table>",C=J+"<tbody>",K="</tbody>"+E,H=C+"<tr>",D="</tr>"+K;var G=function(N,O,Q,P){if(!L){L=document.createElement("div")}var R;var S=null;if(N=="td"){if(O=="afterbegin"||O=="beforeend"){return }if(O=="beforebegin"){S=Q;Q=Q.parentNode}else{S=Q.nextSibling;Q=Q.parentNode}R=I(4,H,P,D)}else{if(N=="tr"){if(O=="beforebegin"){S=Q;Q=Q.parentNode;R=I(3,C,P,K)}else{if(O=="afterend"){S=Q.nextSibling;Q=Q.parentNode;R=I(3,C,P,K)}else{if(O=="afterbegin"){S=Q.firstChild}R=I(4,H,P,D)}}}else{if(N=="tbody"){if(O=="beforebegin"){S=Q;Q=Q.parentNode;R=I(2,J,P,E)}else{if(O=="afterend"){S=Q.nextSibling;Q=Q.parentNode;R=I(2,J,P,E)}else{if(O=="afterbegin"){S=Q.firstChild}R=I(3,C,P,K)}}}else{if(O=="beforebegin"||O=="afterend"){return }if(O=="afterbegin"){S=Q.firstChild}R=I(2,J,P,E)}}}Q.insertBefore(R,S);return R};return{useDom:false,markup:function(N){return A(N)},applyStyles:function(P,Q){if(Q){P=Ext.fly(P);if(typeof Q=="string"){var O=/\s?([a-z\-]*)\:\s?([^;]*);?/gi;var R;while((R=O.exec(Q))!=null){P.setStyle(R[1],R[2])}}else{if(typeof Q=="object"){for(var N in Q){P.setStyle(N,Q[N])}}else{if(typeof Q=="function"){Ext.DomHelper.applyStyles(P,Q.call())}}}}},insertHtml:function(P,R,Q){P=P.toLowerCase();if(R.insertAdjacentHTML){if(B.test(R.tagName)){var O;if(O=G(R.tagName.toLowerCase(),P,R,Q)){return O}}switch(P){case"beforebegin":R.insertAdjacentHTML("BeforeBegin",Q);return R.previousSibling;case"afterbegin":R.insertAdjacentHTML("AfterBegin",Q);return R.firstChild;case"beforeend":R.insertAdjacentHTML("BeforeEnd",Q);return R.lastChild;case"afterend":R.insertAdjacentHTML("AfterEnd",Q);return R.nextSibling}throw"Illegal insertion point -> \""+P+"\""}var N=R.ownerDocument.createRange();var S;switch(P){case"beforebegin":N.setStartBefore(R);S=N.createContextualFragment(Q);R.parentNode.insertBefore(S,R);return R.previousSibling;case"afterbegin":if(R.firstChild){N.setStartBefore(R.firstChild);S=N.createContextualFragment(Q);R.insertBefore(S,R.firstChild);return R.firstChild}else{R.innerHTML=Q;return R.firstChild}case"beforeend":if(R.lastChild){N.setStartAfter(R.lastChild);S=N.createContextualFragment(Q);R.appendChild(S);return R.lastChild}else{R.innerHTML=Q;return R.lastChild}case"afterend":N.setStartAfter(R);S=N.createContextualFragment(Q);R.parentNode.insertBefore(S,R.nextSibling);return R.nextSibling}throw"Illegal insertion point -> \""+P+"\""},insertBefore:function(N,P,O){return this.doInsert(N,P,O,"beforeBegin")},insertAfter:function(N,P,O){return this.doInsert(N,P,O,"afterEnd","nextSibling")},insertFirst:function(N,P,O){return this.doInsert(N,P,O,"afterBegin","firstChild")},doInsert:function(Q,S,R,T,P){Q=Ext.getDom(Q);var O;if(this.useDom){O=M(S,null);(P==="firstChild"?Q:Q.parentNode).insertBefore(O,P?Q[P]:Q)}else{var N=A(S);O=this.insertHtml(T,Q,N)}return R?Ext.get(O,true):O},append:function(P,R,Q){P=Ext.getDom(P);var O;if(this.useDom){O=M(R,null);P.appendChild(O)}else{var N=A(R);O=this.insertHtml("beforeEnd",P,N)}return Q?Ext.get(O,true):O},overwrite:function(N,P,O){N=Ext.getDom(N);N.innerHTML=A(P);return O?Ext.get(N.firstChild,true):N.firstChild},createTemplate:function(O){var N=A(O);return new Ext.Template(N)}}}();
+
+
+Ext.Template=function(E){var B=arguments;if(Ext.isArray(E)){E=E.join("")}else{if(B.length>1){var C=[];for(var D=0,A=B.length;D<A;D++){if(typeof B[D]=="object"){Ext.apply(this,B[D])}else{C[C.length]=B[D]}}E=C.join("")}}this.html=E;if(this.compiled){this.compile()}};Ext.Template.prototype={applyTemplate:function(B){if(this.compiled){return this.compiled(B)}var A=this.disableFormats!==true;var E=Ext.util.Format,C=this;var D=function(G,I,L,H){if(L&&A){if(L.substr(0,5)=="this."){return C.call(L.substr(5),B[I],B)}else{if(H){var K=/^\s*['"](.*)["']\s*$/;H=H.split(",");for(var J=0,F=H.length;J<F;J++){H[J]=H[J].replace(K,"$1")}H=[B[I]].concat(H)}else{H=[B[I]]}return E[L].apply(E,H)}}else{return B[I]!==undefined?B[I]:""}};return this.html.replace(this.re,D)},set:function(A,B){this.html=A;this.compiled=null;if(B){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=", values"}}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(/\\/g,"\\\\").replace(/(\r\n|\n)/g,"\\n").replace(/'/g,"\\'").replace(this.re,fn)+"';};"}else{body=["this.compiled = function(values){ return ['"];body.push(this.html.replace(/\\/g,"\\\\").replace(/(\r\n|\n)/g,"\\n").replace(/'/g,"\\'").replace(this.re,fn));body.push("'].join('');};");body=body.join("")}eval(body);return this},call:function(C,B,A){return this[C](B,A)},insertFirst:function(B,A,C){return this.doInsert("afterBegin",B,A,C)},insertBefore:function(B,A,C){return this.doInsert("beforeBegin",B,A,C)},insertAfter:function(B,A,C){return this.doInsert("afterEnd",B,A,C)},append:function(B,A,C){return this.doInsert("beforeEnd",B,A,C)},doInsert:function(C,E,B,A){E=Ext.getDom(E);var D=Ext.DomHelper.insertHtml(C,E,this.applyTemplate(B));return A?Ext.get(D,true):D},overwrite:function(B,A,C){B=Ext.getDom(B);B.innerHTML=this.applyTemplate(A);return C?Ext.get(B.firstChild,true):B.firstChild}};Ext.Template.prototype.apply=Ext.Template.prototype.applyTemplate;Ext.DomHelper.Template=Ext.Template;Ext.Template.from=function(B,A){B=Ext.getDom(B);return new Ext.Template(B.value||B.innerHTML,A||"")};
+
+
+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-\*]+)/;var nthRe=/(\d*)n\+?(\d*)/,nthRe2=/\D/;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 children(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){if(!v){return c}var r=[],ri=-1,cn;for(var i=0,ci;ci=c[i];i++){if((" "+ci.className+" ").indexOf(v)!=-1){r[++ri]=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=[],ri=-1,cs;if(!ns){return result}tagName=tagName||"*";if(typeof ns.getElementsByTagName!="undefined"){ns=[ns]}if(!mode){for(var i=0,ni;ni=ns[i];i++){cs=ni.getElementsByTagName(tagName);for(var j=0,ci;ci=cs[j];j++){result[++ri]=ci}}}else{if(mode=="/"||mode==">"){var utag=tagName.toUpperCase();for(var i=0,ni,cn;ni=ns[i];i++){cn=ni.children||ni.childNodes;for(var j=0,cj;cj=cn[j];j++){if(cj.nodeName==utag||cj.nodeName==tagName||tagName=="*"){result[++ri]=cj}}}}else{if(mode=="+"){var utag=tagName.toUpperCase();for(var i=0,n;n=ns[i];i++){while((n=n.nextSibling)&&n.nodeType!=1){}if(n&&(n.nodeName==utag||n.nodeName==tagName||tagName=="*")){result[++ri]=n}}}else{if(mode=="~"){for(var i=0,n;n=ns[i];i++){while((n=n.nextSibling)&&(n.nodeType!=1||(tagName=="*"||n.tagName.toLowerCase()!=tagName))){}if(n){result[++ri]=n}}}}}}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=[],ri=-1;tagName=tagName.toLowerCase();for(var i=0,ci;ci=cs[i];i++){if(ci.nodeType==1&&ci.tagName.toLowerCase()==tagName){r[++ri]=ci}}return r}function byId(cs,attr,id){if(cs.tagName||cs==document){cs=[cs]}if(!id){return cs}var r=[],ri=-1;for(var i=0,ci;ci=cs[i];i++){if(ci&&ci.id==id){r[++ri]=ci;return r}}return r}function byAttribute(cs,attr,value,op,custom){var r=[],ri=-1,st=custom=="{";var f=Ext.DomQuery.operators[op];for(var i=0,ci;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[++ri]=ci}}return r}function byPseudo(cs,name,value){return Ext.DomQuery.pseudos[name](cs,value)}var isIE=window.ActiveXObject?true:false;eval("var batch = 30803;");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,ri=-1;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[++ri]=cs[j]}for(j=i+1;cj=cs[j];j++){if(cj._nodup!=d){cj._nodup=d;r[++ri]=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){type=type||"select";var fn=["var f = function(root){\n var mode; ++batch; var n = root || document;\n"];var q=path,mode,lq;var tk=Ext.DomQuery.matchers;var tklen=tk.length;var mm;var lmode=q.match(modeRe);if(lmode&&lmode[1]){fn[fn.length]="mode=\""+lmode[1].replace(trimRe,"")+"\";";q=q.replace(lmode[1],"")}while(path.substr(0,1)=="/"){path=path.substr(1)}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].replace(trimRe,"")+"\";";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)}}if(paths.length>1){return nodup(results)}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||v===undefined||v==="")?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=Ext.isArray(el);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},"|=":function(a,v){return a&&(a==v||a.substr(0,v.length+1)==v+"-")},"~=":function(a,v){return a&&(" "+a+" ").indexOf(" "+v+" ")!=-1}},pseudos:{"first-child":function(c){var r=[],ri=-1,n;for(var i=0,ci;ci=n=c[i];i++){while((n=n.previousSibling)&&n.nodeType!=1){}if(!n){r[++ri]=ci}}return r},"last-child":function(c){var r=[],ri=-1,n;for(var i=0,ci;ci=n=c[i];i++){while((n=n.nextSibling)&&n.nodeType!=1){}if(!n){r[++ri]=ci}}return r},"nth-child":function(c,a){var r=[],ri=-1;var m=nthRe.exec(a=="even"&&"2n"||a=="odd"&&"2n+1"||!nthRe2.test(a)&&"n+"+a||a);var f=(m[1]||1)-0,l=m[2]-0;for(var i=0,n;n=c[i];i++){var pn=n.parentNode;if(batch!=pn._batch){var j=0;for(var cn=pn.firstChild;cn;cn=cn.nextSibling){if(cn.nodeType==1){cn.nodeIndex=++j}}pn._batch=batch}if(f==1){if(l==0||n.nodeIndex==l){r[++ri]=n}}else{if((n.nodeIndex+l)%f==0){r[++ri]=n}}}return r},"only-child":function(c){var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){if(!prev(ci)&&!next(ci)){r[++ri]=ci}}return r},"empty":function(c){var r=[],ri=-1;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[++ri]=ci}}return r},"contains":function(c,v){var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){if((ci.textContent||ci.innerText||"").indexOf(v)!=-1){r[++ri]=ci}}return r},"nodeValue":function(c,v){var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){if(ci.firstChild&&ci.firstChild.nodeValue==v){r[++ri]=ci}}return r},"checked":function(c){var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){if(ci.checked==true){r[++ri]=ci}}return r},"not":function(c,ss){return Ext.DomQuery.filter(c,ss,true)},"any":function(c,selectors){var ss=selectors.split("|");var r=[],ri=-1,s;for(var i=0,ci;ci=c[i];i++){for(var j=0;s=ss[j];j++){if(Ext.DomQuery.is(ci,s)){r[++ri]=ci;break}}}return r},"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=[],ri=-1;for(var i=0,ci;ci=c[i];i++){if(s(ss,ci).length>0){r[++ri]=ci}}return r},"next":function(c,ss){var is=Ext.DomQuery.is;var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){var n=next(ci);if(n&&is(n,ss)){r[++ri]=ci}}return r},"prev":function(c,ss){var is=Ext.DomQuery.is;var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){var n=prev(ci);if(n&&is(n,ss)){r[++ri]=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(){if(this.eventsSuspended!==true){var A=this.events[arguments[0].toLowerCase()];if(typeof A=="object"){return A.fire.apply(A,Array.prototype.slice.call(arguments,1))}}return true},filterOptRe:/^(?:scope|delay|buffer|single)$/,addListener:function(A,C,B,F){if(typeof A=="object"){F=A;for(var E in F){if(this.filterOptRe.test(E)){continue}if(typeof F[E]=="function"){this.addListener(E,F[E],F.scope,F)}else{this.addListener(E,F[E].fn,F[E].scope,F[E])}}return }F=(!F||typeof F=="boolean")?{}:F;A=A.toLowerCase();var D=this.events[A]||true;if(typeof D=="boolean"){D=new Ext.util.Event(this,A);this.events[A]=D}D.addListener(C,B,F)},removeListener:function(A,C,B){var D=this.events[A.toLowerCase()];if(typeof D=="object"){D.removeListener(C,B)}},purgeListeners:function(){for(var A in this.events){if(typeof this.events[A]=="object"){this.events[A].clearListeners()}}},relayEvents:function(F,D){var E=function(G){return function(){return this.fireEvent.apply(this,Ext.combine(G,Array.prototype.slice.call(arguments,0)))}};for(var C=0,A=D.length;C<A;C++){var B=D[C];if(!this.events[B]){this.events[B]=true}F.on(B,E(B),this)}},addEvents:function(D){if(!this.events){this.events={}}if(typeof D=="string"){for(var C=0,A=arguments,B;B=A[C];C++){if(!this.events[A[C]]){this.events[A[C]]=true}}}else{Ext.applyIf(this.events,D)}},hasListener:function(A){var B=this.events[A];return typeof B=="object"&&B.listeners.length>0},suspendEvents:function(){this.eventsSuspended=true},resumeEvents:function(){this.eventsSuspended=false},getMethodEvent:function(G){if(!this.methodEvents){this.methodEvents={}}var F=this.methodEvents[G];if(!F){F={};this.methodEvents[G]=F;F.originalFn=this[G];F.methodName=G;F.before=[];F.after=[];var C,B,D;var E=this;var A=function(J,I,H){if((B=J.apply(I||E,H))!==undefined){if(typeof B==="object"){if(B.returnValue!==undefined){C=B.returnValue}else{C=B}if(B.cancel===true){D=true}}else{if(B===false){D=true}else{C=B}}}};this[G]=function(){C=B=undefined;D=false;var I=Array.prototype.slice.call(arguments,0);for(var J=0,H=F.before.length;J<H;J++){A(F.before[J].fn,F.before[J].scope,I);if(D){return C}}if((B=F.originalFn.apply(E,I))!==undefined){C=B}for(var J=0,H=F.after.length;J<H;J++){A(F.after[J].fn,F.after[J].scope,I);if(D){return C}}return C}}return F},beforeMethod:function(D,B,A){var C=this.getMethodEvent(D);C.before.push({fn:B,scope:A})},afterMethod:function(D,B,A){var C=this.getMethodEvent(D);C.after.push({fn:B,scope:A})},removeMethodListener:function(F,D,C){var E=this.getMethodEvent(F);for(var B=0,A=E.before.length;B<A;B++){if(E.before[B].fn==D&&E.before[B].scope==C){E.before.splice(B,1);return }}for(var B=0,A=E.after.length;B<A;B++){if(E.after[B].fn==D&&E.after[B].scope==C){E.after.splice(B,1);return }}}};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(C,B,A){C.fireEvent=C.fireEvent.createInterceptor(B,A)};Ext.util.Observable.releaseCapture=function(A){A.fireEvent=Ext.util.Observable.prototype.fireEvent};(function(){var B=function(F,G,E){var D=new Ext.util.DelayedTask();return function(){D.delay(G.buffer,F,E,Array.prototype.slice.call(arguments,0))}};var C=function(F,G,E,D){return function(){G.removeListener(E,D);return F.apply(D,arguments)}};var A=function(E,F,D){return function(){var G=Array.prototype.slice.call(arguments,0);setTimeout(function(){E.apply(D,G)},F.delay||10)}};Ext.util.Event=function(E,D){this.name=D;this.obj=E;this.listeners=[]};Ext.util.Event.prototype={addListener:function(G,F,E){F=F||this.obj;if(!this.isListening(G,F)){var D=this.createListener(G,F,E);if(!this.firing){this.listeners.push(D)}else{this.listeners=this.listeners.slice(0);this.listeners.push(D)}}},createListener:function(G,F,H){H=H||{};F=F||this.obj;var D={fn:G,scope:F,options:H};var E=G;if(H.delay){E=A(E,H,F)}if(H.single){E=C(E,this,G,F)}if(H.buffer){E=B(E,H,F)}D.fireFn=E;return D},findListener:function(I,H){H=H||this.obj;var F=this.listeners;for(var G=0,D=F.length;G<D;G++){var E=F[G];if(E.fn==I&&E.scope==H){return G}}return -1},isListening:function(E,D){return this.findListener(E,D)!=-1},removeListener:function(F,E){var D;if((D=this.findListener(F,E))!=-1){if(!this.firing){this.listeners.splice(D,1)}else{this.listeners=this.listeners.slice(0);this.listeners.splice(D,1)}return true}return false},clearListeners:function(){this.listeners=[]},fire:function(){var F=this.listeners,I,D=F.length;if(D>0){this.firing=true;var G=Array.prototype.slice.call(arguments,0);for(var H=0;H<D;H++){var E=F[H];if(E.fireFn.apply(E.scope||this.obj||window,arguments)===false){this.firing=false;return false}}this.firing=false}return true}}})();
+
+
+Ext.EventManager=function(){var T,M,I=false;var K,S,C,O;var L=Ext.lib.Event;var N=Ext.lib.Dom;var B=function(){if(!I){I=true;Ext.isReady=true;if(M){clearInterval(M)}if(Ext.isGecko||Ext.isOpera){document.removeEventListener("DOMContentLoaded",B,false)}if(Ext.isIE){var D=document.getElementById("ie-deferred-loader");if(D){D.onreadystatechange=null;D.parentNode.removeChild(D)}}if(T){T.fire();T.clearListeners()}}};var A=function(){T=new Ext.util.Event();if(Ext.isGecko||Ext.isOpera){document.addEventListener("DOMContentLoaded",B,false)}else{if(Ext.isIE){document.write("<s"+"cript id=\"ie-deferred-loader\" defer=\"defer\" src=\"/"+"/:\"></s"+"cript>");var D=document.getElementById("ie-deferred-loader");D.onreadystatechange=function(){if(this.readyState=="complete"){B()}}}else{if(Ext.isSafari){M=setInterval(function(){var E=document.readyState;if(E=="complete"){B()}},10)}}}L.on(window,"load",B)};var R=function(E,U){var D=new Ext.util.DelayedTask(E);return function(V){V=new Ext.EventObjectImpl(V);D.delay(U.buffer,E,null,[V])}};var P=function(V,U,D,E){return function(W){Ext.EventManager.removeListener(U,D,E);V(W)}};var F=function(D,E){return function(U){U=new Ext.EventObjectImpl(U);setTimeout(function(){D(U)},E.delay||10)}};var J=function(U,E,D,Y,X){var Z=(!D||typeof D=="boolean")?{}:D;Y=Y||Z.fn;X=X||Z.scope;var W=Ext.getDom(U);if(!W){throw"Error listening for \""+E+"\". Element \""+U+"\" doesn't exist."}var V=function(b){b=Ext.EventObject.setEvent(b);var a;if(Z.delegate){a=b.getTarget(Z.delegate,W);if(!a){return }}else{a=b.target}if(Z.stopEvent===true){b.stopEvent()}if(Z.preventDefault===true){b.preventDefault()}if(Z.stopPropagation===true){b.stopPropagation()}if(Z.normalized===false){b=b.browserEvent}Y.call(X||W,b,a,Z)};if(Z.delay){V=F(V,Z)}if(Z.single){V=P(V,W,E,Y)}if(Z.buffer){V=R(V,Z)}Y._handlers=Y._handlers||[];Y._handlers.push([Ext.id(W),E,V]);L.on(W,E,V);if(E=="mousewheel"&&W.addEventListener){W.addEventListener("DOMMouseScroll",V,false);L.on(window,"unload",function(){W.removeEventListener("DOMMouseScroll",V,false)})}if(E=="mousedown"&&W==document){Ext.EventManager.stoppedMouseDownEvent.addListener(V)}return V};var G=function(E,U,Z){var D=Ext.id(E),a=Z._handlers,X=Z;if(a){for(var V=0,Y=a.length;V<Y;V++){var W=a[V];if(W[0]==D&&W[1]==U){X=W[2];a.splice(V,1);break}}}L.un(E,U,X);E=Ext.getDom(E);if(U=="mousewheel"&&E.addEventListener){E.removeEventListener("DOMMouseScroll",X,false)}if(U=="mousedown"&&E==document){Ext.EventManager.stoppedMouseDownEvent.removeListener(X)}};var H=/^(?:scope|delay|buffer|single|stopEvent|preventDefault|stopPropagation|normalized|args|delegate)$/;var Q={addListener:function(U,D,W,V,E){if(typeof D=="object"){var Y=D;for(var X in Y){if(H.test(X)){continue}if(typeof Y[X]=="function"){J(U,X,Y,Y[X],Y.scope)}else{J(U,X,Y[X])}}return }return J(U,D,E,W,V)},removeListener:function(E,D,U){return G(E,D,U)},onDocumentReady:function(U,E,D){if(I){T.addListener(U,E,D);T.fire();T.clearListeners();return }if(!T){A()}T.addListener(U,E,D)},onWindowResize:function(U,E,D){if(!K){K=new Ext.util.Event();S=new Ext.util.DelayedTask(function(){K.fire(N.getViewWidth(),N.getViewHeight())});L.on(window,"resize",this.fireWindowResize,this)}K.addListener(U,E,D)},fireWindowResize:function(){if(K){if((Ext.isIE||Ext.isAir)&&S){S.delay(50)}else{K.fire(N.getViewWidth(),N.getViewHeight())}}},onTextResize:function(V,U,D){if(!C){C=new Ext.util.Event();var E=new Ext.Element(document.createElement("div"));E.dom.className="x-text-resize";E.dom.innerHTML="X";E.appendTo(document.body);O=E.dom.offsetHeight;setInterval(function(){if(E.dom.offsetHeight!=O){C.fire(O,O=E.dom.offsetHeight)}},this.textResizeInterval)}C.addListener(V,U,D)},removeResizeListener:function(E,D){if(K){K.removeListener(E,D)}},fireResize:function(){if(K){K.fire(N.getViewWidth(),N.getViewHeight())}},ieDeferSrc:false,textResizeInterval:50};Q.on=Q.addListener;Q.un=Q.removeListener;Q.stoppedMouseDownEvent=new Ext.util.Event();return Q}();Ext.onReady=Ext.EventManager.onDocumentReady;Ext.onReady(function(){var B=Ext.getBody();if(!B){return }var A=[Ext.isIE?"ext-ie "+(Ext.isIE6?"ext-ie6":"ext-ie7"):Ext.isGecko?"ext-gecko":Ext.isOpera?"ext-opera":Ext.isSafari?"ext-safari":""];if(Ext.isMac){A.push("ext-mac")}if(Ext.isLinux){A.push("ext-linux")}if(Ext.isBorderBox){A.push("ext-border-box")}if(Ext.isStrict){var C=B.dom.parentNode;if(C){C.className+=" ext-strict"}}B.addClass(A.join(" "))});Ext.EventObject=function(){var B=Ext.lib.Event;var A={63234:37,63235:39,63232:38,63233:40,63276:33,63277:34,63272:46,63273:36,63275:35};var C=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(D){if(D){this.setEvent(D.browserEvent||D)}};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(D){if(D==this||(D&&D.browserEvent)){return D}this.browserEvent=D;if(D){this.button=D.button?C[D.button]:(D.which?D.which-1:-1);if(D.type=="click"&&this.button==-1){this.button=0}this.type=D.type;this.shiftKey=D.shiftKey;this.ctrlKey=D.ctrlKey||D.metaKey;this.altKey=D.altKey;this.keyCode=D.keyCode;this.charCode=D.charCode;this.target=B.getTarget(D);this.xy=B.getXY(D)}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)}B.stopEvent(this.browserEvent)}},preventDefault:function(){if(this.browserEvent){B.preventDefault(this.browserEvent)}},isNavKeyPress:function(){var D=this.keyCode;D=Ext.isSafari?(A[D]||D):D;return(D>=33&&D<=40)||D==this.RETURN||D==this.TAB||D==this.ESC},isSpecialKey:function(){var D=this.keyCode;return(this.type=="keypress"&&this.ctrlKey)||D==9||D==13||D==40||D==27||(D==16)||(D==17)||(D>=18&&D<=20)||(D>=33&&D<=35)||(D>=36&&D<=39)||(D>=44&&D<=45)},stopPropagation:function(){if(this.browserEvent){if(this.browserEvent.type=="mousedown"){Ext.EventManager.stoppedMouseDownEvent.fire(this)}B.stopPropagation(this.browserEvent)}},getCharCode:function(){return this.charCode||this.keyCode},getKey:function(){var D=this.keyCode||this.charCode;return Ext.isSafari?(A[D]||D):D},getPageX:function(){return this.xy[0]},getPageY:function(){return this.xy[1]},getTime:function(){if(this.browserEvent){return B.getTime(this.browserEvent)}return null},getXY:function(){return this.xy},getTarget:function(E,F,D){return E?Ext.fly(this.target).findParent(E,F,D):(D?Ext.get(this.target):this.target)},getRelatedTarget:function(){if(this.browserEvent){return B.getRelatedTarget(this.browserEvent)}return null},getWheelDelta:function(){var D=this.browserEvent;var E=0;if(D.wheelDelta){E=D.wheelDelta/120}else{if(D.detail){E=-D.detail/3}}return E},hasModifier:function(){return((this.ctrlKey||this.altKey)||this.shiftKey)?true:false},within:function(E,F){var D=this[F?"getRelatedTarget":"getTarget"]();return D&&Ext.fly(E).contains(D)},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}var id=dom.id;if(forceNew!==true&&id&&Ext.Element.cache[id]){return Ext.Element.cache[id]}this.dom=dom;this.id=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)||0.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},scrollIntoView:function(container,hscroll){var c=Ext.getDom(container)||Ext.getBody().dom;var el=this.dom;var o=this.getOffsetsTo(c),l=o[0]+c.scrollLeft,t=o[1]+c.scrollTop,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(el.offsetHeight>ch||t<ct){c.scrollTop=t}else{if(b>cb){c.scrollTop=b-ch}}c.scrollTop=c.scrollTop;if(hscroll!==false){if(el.offsetWidth>c.clientWidth||l<cl){c.scrollLeft=l}else{if(r>cr){c.scrollLeft=r-c.clientWidth}}c.scrollLeft=c.scrollLeft}return this},scrollChildIntoView:function(child,hscroll){Ext.fly(child,"_scrollChildIntoView").scrollIntoView(this,hscroll)},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(selector,unique,this.dom)},query:function(selector,unique){return Ext.DomQuery.select(selector,this.dom)},child:function(selector,returnDom){var n=Ext.DomQuery.selectNode(selector,this.dom);return returnDom?n:Ext.get(n)},down:function(selector,returnDom){var n=Ext.DomQuery.selectNode(" > "+selector,this.dom);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(0.01);this.setVisible(true)}this.anim({opacity:{to:(visible?1:0)}},this.preanim(arguments,1),null,0.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(Ext.isArray(className)){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(Ext.isArray(className)){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.style.filter=="string"){var m=el.style.filter.match(/alpha\(opacity=(.*)\)/i);if(m){var fv=parseFloat(m[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)},getOffsetsTo:function(el){var o=this.getXY();var e=Ext.fly(el,"_internal").getXY();return[o[0]-e[0],o[1]-e[1]]},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;h=contentHeight!==true?h:h-this.getBorderWidth("tb")-this.getPadding("tb");return h<0?0:h},getWidth:function(contentWidth){var w=this.dom.offsetWidth||0;w=contentWidth!==true?w:w-this.getBorderWidth("lr")-this.getPadding("lr");return w<0?0:w},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)}},getStyleSize:function(){var w,h,d=this.dom,s=d.style;if(s.width&&s.width!="auto"){w=parseInt(s.width,10);if(Ext.isBorderBox){w-=this.getFrameWidth("lr")}}if(s.height&&s.height!="auto"){h=parseInt(s.height,10);if(Ext.isBorderBox){h-=this.getFrameWidth("tb")}}return{width:w||this.getWidth(true),height:h||this.getHeight(true)}},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,0.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")}}},setOverflow:function(v){if(v=="auto"&&Ext.isMac&&Ext.isGecko){this.dom.style.overflow="hidden";(function(){this.dom.style.overflow="auto"}).defer(1,this)}else{this.dom.style.overflow=v}},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*0.5);y=r(h*0.5);break;case"t":x=r(w*0.5);y=0;break;case"l":x=0;y=r(h*0.5);break;case"r":x=w;y=r(h*0.5);break;case"b":x=r(w*0.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);if(!el||!el.dom){throw"Element.alignToXY with an element that doesn't exist"}var d=this.dom;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];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+scrollX){x=swapX?r.left-w:dw+scrollX-w}if(x<scrollX){x=swapX?r.right:scrollX}if((y+h)>dh+scrollY){y=swapY?r.top-h:dh+scrollY-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,proposedXY){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=proposedXY||(!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}}(),adjustForConstraints:function(xy,parent,offsets){return this.getConstrainToXY(parent||document,false,offsets,xy)||xy},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){if(typeof this.dom.style.filter=="string"&&(/alpha/i).test(this.dom.style.filter)){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)},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){if(window.execScript){window.execScript(match[2])}else{window.eval(match[2])}}}}var el=document.getElementById(id);if(el){Ext.removeNode(el)}if(typeof callback=="function"){callback()}});dom.innerHTML=html.replace(/(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)/ig,"");return this},load:function(){var um=this.getUpdater();um.update.apply(um,arguments);return this},getUpdater:function(){if(!this.updateManager){this.updateManager=new Ext.Updater(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,onlyContentBox){return onlyContentBox&&Ext.isBorderBox?0:(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,v,w;for(var i=0,len=sides.length;i<len;i++){v=this.getStyle(styles[sides.charAt(i)]);if(v){w=parseInt(v,10);if(w){val+=(w>=0?w:-1*w)}}}return val},createProxy:function(config,renderTo,matchBox){config=typeof config=="object"?config:{tag:"div",cls:config};var proxy;if(renderTo){proxy=Ext.DomHelper.append(renderTo,config,true)}else{proxy=Ext.DomHelper.insertBefore(this.dom,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._maskMsg){this._maskMsg.remove()}if(this._mask){this._mask.remove()}this._mask=Ext.DomHelper.append(this.dom,{cls:"ext-el-mask"},true);this.addClass("x-masked");this._mask.setDisplayed(true);if(typeof msg=="string"){this._maskMsg=Ext.DomHelper.append(this.dom,{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)}if(Ext.isIE&&!(Ext.isIE7&&Ext.isStrict)&&this.getStyle("height")=="auto"){this._mask.setSize(this.dom.clientWidth,this.getHeight())}return this._mask},unmask:function(){if(this._mask){if(this._maskMsg){this._maskMsg.remove();delete this._maskMsg}this._mask.remove();delete this._mask}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(){Ext.removeNode(this.dom);delete El.cache[this.dom.id]},hover:function(overFn,outFn,scope){var preOverFn=function(e){if(!e.within(this,true)){overFn.apply(scope||this,arguments)}};var preOutFn=function(e){if(!e.within(this,true)){outFn.apply(scope||this,arguments)}};this.on("mouseover",preOverFn,this.dom);this.on("mouseout",preOutFn,this.dom);return this},addClassOnOver:function(className){this.hover(function(){Ext.fly(this,"_internal").addClass(className)},function(){Ext.fly(this,"_internal").removeClass(className)});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.getDoc();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(Ext.isArray(eventName)){for(var i=0,len=eventName.length;i<len;i++){this.on(eventName[i],fn)}return this}this.on(eventName,fn);return this},parent:function(selector,returnDom){return this.matchNode("parentNode","parentNode",selector,returnDom)},next:function(selector,returnDom){return this.matchNode("nextSibling","nextSibling",selector,returnDom)},prev:function(selector,returnDom){return this.matchNode("previousSibling","previousSibling",selector,returnDom)},first:function(selector,returnDom){return this.matchNode("nextSibling","firstChild",selector,returnDom)},last:function(selector,returnDom){return this.matchNode("previousSibling","lastChild",selector,returnDom)},matchNode:function(dir,start,selector,returnDom){var n=this.dom[start];while(n){if(n.nodeType==1&&(!selector||Ext.DomQuery.is(n,selector))){return !returnDom?Ext.get(n):n}n=n[dir]}return null},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&&!el.dom){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){var rt;if(Ext.isArray(el)){for(var i=0,len=el.length;i<len;i++){rt=this.insertSibling(el[i],where,returnDom)}return rt}where=where?where.toLowerCase():"before";el=el||{};var refNode=where=="before"?this.dom:this.dom.nextSibling;if(typeof el=="object"&&!el.nodeType&&!el.dom){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),refNode);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},replaceWith:function(el){if(typeof el=="object"&&!el.nodeType&&!el.dom){el=this.insertSibling(el,"before")}else{el=Ext.getDom(el);this.dom.parentNode.insertBefore(el,this.dom)}El.uncache(this.id);this.dom.parentNode.removeChild(this.dom);this.dom=el;this.id=Ext.id(el);El.cache[this.id]=this;return this},insertHtml:function(where,html,returnEl){var el=Ext.DomHelper.insertHtml(where,this.dom,html);return returnEl?Ext.get(el):el},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(o.hasOwnProperty(attr)){if(useSet){el.setAttribute(attr,o[attr])}else{el[attr]=o[attr]}}}}if(o.style){Ext.DomHelper.applyStyles(el,o.style)}return this},addKeyListener:function(key,fn,scope){var config;if(typeof key!="object"||Ext.isArray(key)){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"||Ext.isArray(x)){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,t;if(Ext.isIE&&Ext.isStrict){l=doc.documentElement.scrollLeft||(doc.body.scrollLeft||0);t=doc.documentElement.scrollTop||(doc.body.scrollTop||0)}else{l=window.pageXOffset||(doc.body.scrollLeft||0);t=window.pageYOffset||(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]);var s=h.toString(16);if(h<16){s="0"+s}color+=s}}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]},getTextWidth:function(text,min,max){return(Ext.util.TextMetrics.measure(this.dom,Ext.value(text,this.dom.innerHTML,true)).width).constrain(min||0,max||1000000)}};var ep=El.prototype;ep.on=ep.addListener;ep.mon=ep.addListener;ep.getUpdateManager=ep.getUpdater;ep.un=ep.removeListener;ep.autoBoxAdjust=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="<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>";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(Ext.isArray(el)){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.garbageCollect=function(){if(!Ext.enableGarbageCollector){clearInterval(El.collectorThread);return }for(var eid in El.cache){var el=El.cache[eid],d=el.dom;if(!d||!d.parentNode||(!d.offsetParent&&!document.getElementById(eid))){delete El.cache[eid];if(d&&Ext.enableListenerCollection){E.purgeElement(d)}}}};El.collectorThreadId=setInterval(El.garbageCollect,30000);var flyFn=function(){};flyFn.prototype=El.prototype;var _cls=new flyFn();El.Flyweight=function(dom){this.dom=dom};El.Flyweight.prototype=_cls;El.Flyweight.prototype.isFlyweight=true;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(A,C){var B=this.getFxEl();C=C||{};B.queueFx(C,function(){A=A||"t";this.fixDisplay();var D=this.getFxRestore();var I=this.getBox();this.setSize(I);var F=this.fxWrap(D.pos,C,"hidden");var K=this.dom.style;K.visibility="visible";K.position="absolute";var E=function(){B.fxUnwrap(F,D.pos,C);K.width=D.width;K.height=D.height;B.afterFx(C)};var J,L={to:[I.x,I.y]},H={to:I.width},G={to:I.height};switch(A.toLowerCase()){case"t":F.setSize(I.width,0);K.left=K.bottom="0";J={height:G};break;case"l":F.setSize(0,I.height);K.right=K.top="0";J={width:H};break;case"r":F.setSize(0,I.height);F.setX(I.right);K.left=K.top="0";J={width:H,points:L};break;case"b":F.setSize(I.width,0);F.setY(I.bottom);K.left=K.top="0";J={height:G,points:L};break;case"tl":F.setSize(0,0);K.right=K.bottom="0";J={width:H,height:G};break;case"bl":F.setSize(0,0);F.setY(I.y+I.height);K.right=K.top="0";J={width:H,height:G,points:L};break;case"br":F.setSize(0,0);F.setXY([I.right,I.bottom]);K.left=K.top="0";J={width:H,height:G,points:L};break;case"tr":F.setSize(0,0);F.setX(I.x+I.width);K.left=K.bottom="0";J={width:H,height:G,points:L};break}this.dom.style.visibility="visible";F.show();arguments.callee.anim=F.fxanim(J,C,"motion",0.5,"easeOut",E)});return this},slideOut:function(A,C){var B=this.getFxEl();C=C||{};B.queueFx(C,function(){A=A||"t";var I=this.getFxRestore();var D=this.getBox();this.setSize(D);var G=this.fxWrap(I.pos,C,"visible");var F=this.dom.style;F.visibility="visible";F.position="absolute";G.setSize(D);var J=function(){if(C.useDisplay){B.setDisplayed(false)}else{B.hide()}B.fxUnwrap(G,I.pos,C);F.width=I.width;F.height=I.height;B.afterFx(C)};var E,H={to:0};switch(A.toLowerCase()){case"t":F.left=F.bottom="0";E={height:H};break;case"l":F.right=F.top="0";E={width:H};break;case"r":F.left=F.top="0";E={width:H,points:{to:[D.right,D.y]}};break;case"b":F.left=F.top="0";E={height:H,points:{to:[D.x,D.bottom]}};break;case"tl":F.right=F.bottom="0";E={width:H,height:H};break;case"bl":F.right=F.top="0";E={width:H,height:H,points:{to:[D.x,D.bottom]}};break;case"br":F.left=F.top="0";E={width:H,height:H,points:{to:[D.x+D.width,D.bottom]}};break;case"tr":F.left=F.bottom="0";E={width:H,height:H,points:{to:[D.right,D.y]}};break}arguments.callee.anim=G.fxanim(E,C,"motion",0.5,"easeOut",J)});return this},puff:function(B){var A=this.getFxEl();B=B||{};A.queueFx(B,function(){this.clearOpacity();this.show();var F=this.getFxRestore();var D=this.dom.style;var G=function(){if(B.useDisplay){A.setDisplayed(false)}else{A.hide()}A.clearOpacity();A.setPositioning(F.pos);D.width=F.width;D.height=F.height;D.fontSize="";A.afterFx(B)};var E=this.getWidth();var C=this.getHeight();arguments.callee.anim=this.fxanim({width:{to:this.adjustWidth(E*2)},height:{to:this.adjustHeight(C*2)},points:{by:[-(E*0.5),-(C*0.5)]},opacity:{to:0},fontSize:{to:200,unit:"%"}},B,"motion",0.5,"easeOut",G)});return this},switchOff:function(B){var A=this.getFxEl();B=B||{};A.queueFx(B,function(){this.clearOpacity();this.clip();var D=this.getFxRestore();var C=this.dom.style;var E=function(){if(B.useDisplay){A.setDisplayed(false)}else{A.hide()}A.clearOpacity();A.setPositioning(D.pos);C.width=D.width;C.height=D.height;A.afterFx(B)};this.fxanim({opacity:{to:0.3}},null,null,0.1,null,function(){this.clearOpacity();(function(){this.fxanim({height:{to:1},points:{by:[0,this.getHeight()*0.5]}},B,"motion",0.3,"easeIn",E)}).defer(100,this)})});return this},highlight:function(A,C){var B=this.getFxEl();C=C||{};B.queueFx(C,function(){A=A||"ffff9c";var D=C.attr||"backgroundColor";this.clearOpacity();this.show();var G=this.getColor(D);var H=this.dom.style[D];var F=(C.endColor||G)||"ffffff";var I=function(){B.dom.style[D]=H;B.afterFx(C)};var E={};E[D]={from:A,to:F};arguments.callee.anim=this.fxanim(E,C,"color",1,"easeIn",I)});return this},frame:function(A,C,D){var B=this.getFxEl();D=D||{};B.queueFx(D,function(){A=A||"#C3DAF9";if(A.length==6){A="#"+A}C=C||1;var G=D.duration||1;this.show();var E=this.getBox();var F=function(){var H=Ext.getBody().createChild({style:{visbility:"hidden",position:"absolute","z-index":"35000",border:"0px solid "+A}});var I=Ext.isBorderBox?2:1;H.animate({top:{from:E.y,to:E.y-20},left:{from:E.x,to:E.x-20},borderWidth:{from:0,to:10},opacity:{from:1,to:0},height:{from:E.height,to:(E.height+(20*I))},width:{from:E.width,to:(E.width+(20*I))}},G,function(){H.remove();if(--C>0){F()}else{B.afterFx(D)}})};F.call(this)});return this},pause:function(C){var A=this.getFxEl();var B={};A.queueFx(B,function(){setTimeout(function(){A.afterFx(B)},C*1000)});return this},fadeIn:function(B){var A=this.getFxEl();B=B||{};A.queueFx(B,function(){this.setOpacity(0);this.fixDisplay();this.dom.style.visibility="visible";var C=B.endOpacity||1;arguments.callee.anim=this.fxanim({opacity:{to:C}},B,null,0.5,"easeOut",function(){if(C==1){this.clearOpacity()}A.afterFx(B)})});return this},fadeOut:function(B){var A=this.getFxEl();B=B||{};A.queueFx(B,function(){arguments.callee.anim=this.fxanim({opacity:{to:B.endOpacity||0}},B,null,0.5,"easeOut",function(){if(this.visibilityMode==Ext.Element.DISPLAY||B.useDisplay){this.dom.style.display="none"}else{this.dom.style.visibility="hidden"}this.clearOpacity();A.afterFx(B)})});return this},scale:function(A,B,C){this.shift(Ext.apply({},C,{width:A,height:B}));return this},shift:function(B){var A=this.getFxEl();B=B||{};A.queueFx(B,function(){var E={},D=B.width,F=B.height,C=B.x,H=B.y,G=B.opacity;if(D!==undefined){E.width={to:this.adjustWidth(D)}}if(F!==undefined){E.height={to:this.adjustHeight(F)}}if(B.left!==undefined){E.left={to:B.left}}if(B.top!==undefined){E.top={to:B.top}}if(B.right!==undefined){E.right={to:B.right}}if(B.bottom!==undefined){E.bottom={to:B.bottom}}if(C!==undefined||H!==undefined){E.points={to:[C!==undefined?C:this.getX(),H!==undefined?H:this.getY()]}}if(G!==undefined){E.opacity={to:G}}if(B.xy!==undefined){E.points={to:B.xy}}arguments.callee.anim=this.fxanim(E,B,"motion",0.35,"easeOut",function(){A.afterFx(B)})});return this},ghost:function(A,C){var B=this.getFxEl();C=C||{};B.queueFx(C,function(){A=A||"b";var H=this.getFxRestore();var E=this.getWidth(),G=this.getHeight();var F=this.dom.style;var J=function(){if(C.useDisplay){B.setDisplayed(false)}else{B.hide()}B.clearOpacity();B.setPositioning(H.pos);F.width=H.width;F.height=H.height;B.afterFx(C)};var D={opacity:{to:0},points:{}},I=D.points;switch(A.toLowerCase()){case"t":I.by=[0,-G];break;case"l":I.by=[-E,0];break;case"r":I.by=[E,0];break;case"b":I.by=[0,G];break;case"tl":I.by=[-E,-G];break;case"bl":I.by=[-E,G];break;case"br":I.by=[E,G];break;case"tr":I.by=[E,-G];break}arguments.callee.anim=this.fxanim(D,C,"motion",0.5,"easeOut",J)});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 A=this.fxQueue[0];if(A){A.call(this)}},hasActiveFx:function(){return this.fxQueue&&this.fxQueue[0]},stopFx:function(){if(this.hasActiveFx()){var A=this.fxQueue[0];if(A&&A.anim&&A.anim.isAnimated()){this.fxQueue=[A];A.anim.stop(true)}}return this},beforeFx:function(A){if(this.hasActiveFx()&&!A.concurrent){if(A.stopFx){this.stopFx();return true}return false}return true},hasFxBlock:function(){var A=this.fxQueue;return A&&A[0]&&A[0].block},queueFx:function(C,A){if(!this.fxQueue){this.fxQueue=[]}if(!this.hasFxBlock()){Ext.applyIf(C,this.fxDefaults);if(!C.concurrent){var B=this.beforeFx(C);A.block=C.block;this.fxQueue.push(A);if(B){this.nextFx()}}else{A.call(this)}}return this},fxWrap:function(F,D,C){var B;if(!D.wrap||!(B=Ext.get(D.wrap))){var A;if(D.fixPosition){A=this.getXY()}var E=document.createElement("div");E.style.visibility=C;B=Ext.get(this.dom.parentNode.insertBefore(E,this.dom));B.setPositioning(F);if(B.getStyle("position")=="static"){B.position("relative")}this.clearPositioning("auto");B.clip();B.dom.appendChild(this.dom);if(A){B.setXY(A)}}return B},fxUnwrap:function(A,C,B){this.clearPositioning();this.setPositioning(C);if(!B.wrap){A.dom.parentNode.insertBefore(this.dom,A.dom);A.remove()}},getFxRestore:function(){var A=this.dom.style;return{pos:this.getPositioning(),width:A.width,height:A.height}},afterFx:function(A){if(A.afterStyle){this.applyStyles(A.afterStyle)}if(A.afterCls){this.addClass(A.afterCls)}if(A.remove===true){this.remove()}Ext.callback(A.callback,A.scope,[this]);if(!A.concurrent){this.fxQueue.shift();this.nextFx()}},getFxEl:function(){return Ext.get(this.dom)},fxanim:function(D,E,B,F,C,A){B=B||"run";E=E||{};var G=Ext.lib.Anim[B](this.dom,D,(E.duration||F)||0.35,(E.easing||C)||"easeOut",function(){Ext.callback(A,this)},this);E.anim=G;return G}};Ext.Fx.resize=Ext.Fx.scale;Ext.apply(Ext.Element.prototype,Ext.Fx);
+
+
+Ext.CompositeElement=function(A){this.elements=[];this.addElements(A)};Ext.CompositeElement.prototype={isComposite:true,addElements:function(E){if(!E){return this}if(typeof E=="string"){E=Ext.Element.selectorFunction(E)}var D=this.elements;var B=D.length-1;for(var C=0,A=E.length;C<A;C++){D[++B]=Ext.get(E[C])}return this},fill:function(A){this.elements=[];this.add(A);return this},filter:function(A){var B=[];this.each(function(C){if(C.is(A)){B[B.length]=C.dom}});this.fill(B);return this},invoke:function(E,B){var D=this.elements;for(var C=0,A=D.length;C<A;C++){Ext.Element.prototype[E].apply(D[C],B)}return this},add:function(A){if(typeof A=="string"){this.addElements(Ext.Element.selectorFunction(A))}else{if(A.length!==undefined){this.addElements(A)}else{this.addElements([A])}}return this},each:function(E,D){var C=this.elements;for(var B=0,A=C.length;B<A;B++){if(E.call(D||C[B],C[B],this,B)===false){break}}return this},item:function(A){return this.elements[A]||null},first:function(){return this.item(0)},last:function(){return this.item(this.elements.length-1)},getCount:function(){return this.elements.length},contains:function(A){return this.indexOf(A)!==-1},indexOf:function(A){return this.elements.indexOf(Ext.get(A))},removeElement:function(D,F){if(Ext.isArray(D)){for(var C=0,A=D.length;C<A;C++){this.removeElement(D[C])}return this}var B=typeof D=="number"?D:this.indexOf(D);if(B!==-1&&this.elements[B]){if(F){var E=this.elements[B];if(E.dom){E.remove()}else{Ext.removeNode(E)}}this.elements.splice(B,1)}return this},replaceElement:function(D,C,A){var B=typeof D=="number"?D:this.indexOf(D);if(B!==-1){if(A){this.elements[B].replaceWith(C)}else{this.elements.splice(B,1,Ext.get(C))}}return this},clear:function(){this.elements=[]}};(function(){Ext.CompositeElement.createCall=function(B,C){if(!B[C]){B[C]=function(){return this.invoke(C,arguments)}}};for(var A in Ext.Element.prototype){if(typeof Ext.Element.prototype[A]=="function"){Ext.CompositeElement.createCall(Ext.CompositeElement.prototype,A)}}})();Ext.CompositeElementLite=function(A){Ext.CompositeElementLite.superclass.constructor.call(this,A);this.el=new Ext.Element.Flyweight()};Ext.extend(Ext.CompositeElementLite,Ext.CompositeElement,{addElements:function(E){if(E){if(Ext.isArray(E)){this.elements=this.elements.concat(E)}else{var D=this.elements;var B=D.length-1;for(var C=0,A=E.length;C<A;C++){D[++B]=E[C]}}}return this},invoke:function(F,B){var D=this.elements;var E=this.el;for(var C=0,A=D.length;C<A;C++){E.dom=D[C];Ext.Element.prototype[F].apply(E,B)}return this},item:function(A){if(!this.elements[A]){return null}this.el.dom=this.elements[A];return this.el},addListener:function(B,G,F,E){var D=this.elements;for(var C=0,A=D.length;C<A;C++){Ext.EventManager.on(D[C],B,G,F||D[C],E)}return this},each:function(F,E){var C=this.elements;var D=this.el;for(var B=0,A=C.length;B<A;B++){D.dom=C[B];if(F.call(E||D,D,this,B)===false){break}}return this},indexOf:function(A){return this.elements.indexOf(Ext.getDom(A))},replaceElement:function(D,C,A){var B=typeof D=="number"?D:this.indexOf(D);if(B!==-1){C=Ext.getDom(C);if(A){var E=this.elements[B];E.parentNode.insertBefore(C,E);Ext.removeNode(E)}this.elements.splice(B,1,C)}return this}});Ext.CompositeElementLite.prototype.on=Ext.CompositeElementLite.prototype.addListener;if(Ext.DomQuery){Ext.Element.selectorFunction=Ext.DomQuery.select}Ext.Element.select=function(A,D,B){var C;if(typeof A=="string"){C=Ext.Element.selectorFunction(A,B)}else{if(A.length!==undefined){C=A}else{throw"Invalid selector"}}if(D===true){return new Ext.CompositeElement(C)}else{return new Ext.CompositeElementLite(C)}};Ext.select=Ext.Element.select;
+
+
+Ext.data.Connection=function(A){Ext.apply(this,A);this.addEvents("beforerequest","requestcomplete","requestexception");Ext.data.Connection.superclass.constructor.call(this)};Ext.extend(Ext.data.Connection,Ext.util.Observable,{timeout:30000,autoAbort:false,disableCaching:true,request:function(E){if(this.fireEvent("beforerequest",this,E)!==false){var C=E.params;if(typeof C=="function"){C=C.call(E.scope||window,E)}if(typeof C=="object"){C=Ext.urlEncode(C)}if(this.extraParams){var G=Ext.urlEncode(this.extraParams);C=C?(C+"&"+G):G}var B=E.url||this.url;if(typeof B=="function"){B=B.call(E.scope||window,E)}if(E.form){var D=Ext.getDom(E.form);B=B||D.action;var I=D.getAttribute("enctype");if(E.isUpload||(I&&I.toLowerCase()=="multipart/form-data")){return this.doFormUpload(E,C,B)}var H=Ext.lib.Ajax.serializeForm(D);C=C?(C+"&"+H):H}var J=E.headers;if(this.defaultHeaders){J=Ext.apply(J||{},this.defaultHeaders);if(!E.headers){E.headers=J}}var F={success:this.handleResponse,failure:this.handleFailure,scope:this,argument:{options:E},timeout:E.timeout||this.timeout};var A=E.method||this.method||(C?"POST":"GET");if(A=="GET"&&(this.disableCaching&&E.disableCaching!==false)||E.disableCaching===true){B+=(B.indexOf("?")!=-1?"&":"?")+"_dc="+(new Date().getTime())}if(typeof E.autoAbort=="boolean"){if(E.autoAbort){this.abort()}}else{if(this.autoAbort!==false){this.abort()}}if((A=="GET"||E.xmlData||E.jsonData)&&C){B+=(B.indexOf("?")!=-1?"&":"?")+C;C=""}this.transId=Ext.lib.Ajax.request(A,B,F,C,E);return this.transId}else{Ext.callback(E.callback,E.scope,[E,null,null]);return null}},isLoading:function(A){if(A){return Ext.lib.Ajax.isCallInProgress(A)}else{return this.transId?true:false}},abort:function(A){if(A||this.isLoading()){Ext.lib.Ajax.abort(A||this.transId)}},handleResponse:function(A){this.transId=false;var B=A.argument.options;A.argument=B?B.argument:null;this.fireEvent("requestcomplete",this,A,B);Ext.callback(B.success,B.scope,[A,B]);Ext.callback(B.callback,B.scope,[B,true,A])},handleFailure:function(A,C){this.transId=false;var B=A.argument.options;A.argument=B?B.argument:null;this.fireEvent("requestexception",this,A,B,C);Ext.callback(B.failure,B.scope,[A,B]);Ext.callback(B.callback,B.scope,[B,false,A])},doFormUpload:function(E,A,B){var C=Ext.id();var F=document.createElement("iframe");F.id=C;F.name=C;F.className="x-hidden";if(Ext.isIE){F.src=Ext.SSL_SECURE_URL}document.body.appendChild(F);if(Ext.isIE){document.frames[C].name=C}var D=Ext.getDom(E.form);D.target=C;D.method="POST";D.enctype=D.encoding="multipart/form-data";if(B){D.action=B}var L,J;if(A){L=[];A=Ext.urlDecode(A,false);for(var H in A){if(A.hasOwnProperty(H)){J=document.createElement("input");J.type="hidden";J.name=H;J.value=A[H];D.appendChild(J);L.push(J)}}}function G(){var M={responseText:"",responseXML:null};M.argument=E?E.argument:null;try{var O;if(Ext.isIE){O=F.contentWindow.document}else{O=(F.contentDocument||window.frames[C].document)}if(O&&O.body){M.responseText=O.body.innerHTML}if(O&&O.XMLDocument){M.responseXML=O.XMLDocument}else{M.responseXML=O}}catch(N){}Ext.EventManager.removeListener(F,"load",G,this);this.fireEvent("requestcomplete",this,M,E);Ext.callback(E.success,E.scope,[M,E]);Ext.callback(E.callback,E.scope,[E,true,M]);setTimeout(function(){Ext.removeNode(F)},100)}Ext.EventManager.on(F,"load",G,this);D.submit();if(L){for(var I=0,K=L.length;I<K;I++){Ext.removeNode(L[I])}}}});Ext.Ajax=new Ext.data.Connection({autoAbort:false,serializeForm:function(A){return Ext.lib.Ajax.serializeForm(A)}});
+
+
+Ext.Updater=function(B,A){B=Ext.get(B);if(!A&&B.updateManager){return B.updateManager}this.el=B;this.defaultUrl=null;this.addEvents("beforeupdate","update","failure");var C=Ext.Updater.defaults;this.sslBlankUrl=C.sslBlankUrl;this.disableCaching=C.disableCaching;this.indicatorText=C.indicatorText;this.showLoadIndicator=C.showLoadIndicator;this.timeout=C.timeout;this.loadScripts=C.loadScripts;this.transaction=null;this.refreshDelegate=this.refresh.createDelegate(this);this.updateDelegate=this.update.createDelegate(this);this.formUpdateDelegate=this.formUpdate.createDelegate(this);if(!this.renderer){this.renderer=new Ext.Updater.BasicRenderer()}Ext.Updater.superclass.constructor.call(this)};Ext.extend(Ext.Updater,Ext.util.Observable,{getEl:function(){return this.el},update:function(B,F,G,D){if(this.fireEvent("beforeupdate",this.el,B,F)!==false){var A,C;if(typeof B=="object"){A=B;B=A.url;F=F||A.params;G=G||A.callback;D=D||A.discardUrl;C=A.scope;if(typeof A.nocache!="undefined"){this.disableCaching=A.nocache}if(typeof A.text!="undefined"){this.indicatorText="<div class=\"loading-indicator\">"+A.text+"</div>"}if(typeof A.scripts!="undefined"){this.loadScripts=A.scripts}if(typeof A.timeout!="undefined"){this.timeout=A.timeout}}this.showLoading();if(!D){this.defaultUrl=B}if(typeof B=="function"){B=B.call(this)}var E=Ext.apply(A||{},{url:B,params:(typeof F=="function"&&C)?F.createDelegate(C):F,success:this.processSuccess,failure:this.processFailure,scope:this,callback:undefined,timeout:(this.timeout*1000),disableCaching:this.disableCaching,argument:{"options":A,"url":B,"form":null,"callback":G,"scope":C||window,"params":F}});this.transaction=Ext.Ajax.request(E)}},formUpdate:function(C,A,B,D){if(this.fireEvent("beforeupdate",this.el,C,A)!==false){if(typeof A=="function"){A=A.call(this)}C=Ext.getDom(C);this.transaction=Ext.Ajax.request({form:C,url:A,success:this.processSuccess,failure:this.processFailure,scope:this,timeout:(this.timeout*1000),argument:{"url":A,"form":C,"callback":D,"reset":B}});this.showLoading.defer(1,this)}},refresh:function(A){if(this.defaultUrl==null){return }this.update(this.defaultUrl,null,A,true)},startAutoRefresh:function(B,C,D,E,A){if(A){this.update(C||this.defaultUrl,D,E,true)}if(this.autoRefreshProcId){clearInterval(this.autoRefreshProcId)}this.autoRefreshProcId=setInterval(this.update.createDelegate(this,[C||this.defaultUrl,D,E,true]),B*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)}},processSuccess:function(A){this.transaction=null;if(A.argument.form&&A.argument.reset){try{A.argument.form.reset()}catch(B){}}if(this.loadScripts){this.renderer.render(this.el,A,this,this.updateComplete.createDelegate(this,[A]))}else{this.renderer.render(this.el,A,this);this.updateComplete(A)}},updateComplete:function(A){this.fireEvent("update",this.el,A);if(typeof A.argument.callback=="function"){A.argument.callback.call(A.argument.scope,this.el,true,A,A.argument.options)}},processFailure:function(A){this.transaction=null;this.fireEvent("failure",this.el,A);if(typeof A.argument.callback=="function"){A.argument.callback.call(A.argument.scope,this.el,false,A,A.argument.options)}},setRenderer:function(A){this.renderer=A},getRenderer:function(){return this.renderer},setDefaultUrl:function(A){this.defaultUrl=A},abort:function(){if(this.transaction){Ext.Ajax.abort(this.transaction)}},isUpdating:function(){if(this.transaction){return Ext.Ajax.isLoading(this.transaction)}return false}});Ext.Updater.defaults={timeout:30,loadScripts:false,sslBlankUrl:(Ext.SSL_SECURE_URL||"javascript:false"),disableCaching:false,showLoadIndicator:true,indicatorText:"<div class=\"loading-indicator\">Loading...</div>"};Ext.Updater.updateElement=function(D,C,E,B){var A=Ext.get(D).getUpdater();Ext.apply(A,B);A.update(C,E,B?B.callback:null)};Ext.Updater.BasicRenderer=function(){};Ext.Updater.BasicRenderer.prototype={render:function(C,A,B,D){C.update(A.responseText,B.loadScripts,D)}};Ext.UpdateManager=Ext.Updater;
+
+
+Ext.util.DelayedTask=function(E,D,A){var G=null,F,B;var C=function(){var H=new Date().getTime();if(H-B>=F){clearInterval(G);G=null;E.apply(D,A||[])}};this.delay=function(I,K,J,H){if(G&&I!=F){this.cancel()}F=I;B=new Date().getTime();E=K||E;D=J||D;A=H||A;if(!G){G=setInterval(C,F)}};this.cancel=function(){if(G){clearInterval(G);G=null}}};
+
+
+Ext.util.TaskRunner=function(E){E=E||10;var F=[],A=[];var B=0;var G=false;var D=function(){G=false;clearInterval(B);B=0};var H=function(){if(!G){G=true;B=setInterval(I,E)}};var C=function(J){A.push(J);if(J.onStop){J.onStop.apply(J.scope||J)}};var I=function(){if(A.length>0){for(var O=0,K=A.length;O<K;O++){F.remove(A[O])}A=[];if(F.length<1){D();return }}var M=new Date().getTime();for(var O=0,K=F.length;O<K;++O){var N=F[O];var J=M-N.taskRunTime;if(N.interval<=J){var L=N.run.apply(N.scope||N,N.args||[++N.taskRunCount]);N.taskRunTime=M;if(L===false||N.taskRunCount===N.repeat){C(N);return }}if(N.duration&&N.duration<=(M-N.taskStartTime)){C(N)}}};this.start=function(J){F.push(J);J.taskStartTime=new Date().getTime();J.taskRunTime=0;J.taskRunCount=0;H();return J};this.stop=function(J){C(J);return J};this.stopAll=function(){D();for(var K=0,J=F.length;K<J;K++){if(F[K].onStop){F[K].onStop()}}F=[];A=[]}};Ext.TaskMgr=new Ext.util.TaskRunner();
+
+
+Ext.util.MixedCollection=function(B,A){this.items=[];this.map={};this.keys=[];this.length=0;this.addEvents("clear","add","replace","remove","sort");this.allowFunctions=B===true;if(A){this.getKey=A}Ext.util.MixedCollection.superclass.constructor.call(this)};Ext.extend(Ext.util.MixedCollection,Ext.util.Observable,{allowFunctions:false,add:function(B,C){if(arguments.length==1){C=arguments[0];B=this.getKey(C)}if(typeof B=="undefined"||B===null){this.length++;this.items.push(C);this.keys.push(null)}else{var A=this.map[B];if(A){return this.replace(B,C)}this.length++;this.items.push(C);this.map[B]=C;this.keys.push(B)}this.fireEvent("add",this.length-1,C,B);return C},getKey:function(A){return A.id},replace:function(C,D){if(arguments.length==1){D=arguments[0];C=this.getKey(D)}var A=this.item(C);if(typeof C=="undefined"||C===null||typeof A=="undefined"){return this.add(C,D)}var B=this.indexOfKey(C);this.items[B]=D;this.map[C]=D;this.fireEvent("replace",C,A,D);return D},addAll:function(E){if(arguments.length>1||Ext.isArray(E)){var B=arguments.length>1?arguments:E;for(var D=0,A=B.length;D<A;D++){this.add(B[D])}}else{for(var C in E){if(this.allowFunctions||typeof E[C]!="function"){this.add(C,E[C])}}}},each:function(E,D){var B=[].concat(this.items);for(var C=0,A=B.length;C<A;C++){if(E.call(D||B[C],B[C],C,A)===false){break}}},eachKey:function(D,C){for(var B=0,A=this.keys.length;B<A;B++){D.call(C||window,this.keys[B],this.items[B],B,A)}},find:function(D,C){for(var B=0,A=this.items.length;B<A;B++){if(D.call(C||window,this.items[B],this.keys[B])){return this.items[B]}}return null},insert:function(A,B,C){if(arguments.length==2){C=arguments[1];B=this.getKey(C)}if(A>=this.length){return this.add(B,C)}this.length++;this.items.splice(A,0,C);if(typeof B!="undefined"&&B!=null){this.map[B]=C}this.keys.splice(A,0,B);this.fireEvent("add",A,C,B);return C},remove:function(A){return this.removeAt(this.indexOf(A))},removeAt:function(A){if(A<this.length&&A>=0){this.length--;var C=this.items[A];this.items.splice(A,1);var B=this.keys[A];if(typeof B!="undefined"){delete this.map[B]}this.keys.splice(A,1);this.fireEvent("remove",C,B);return C}return false},removeKey:function(A){return this.removeAt(this.indexOfKey(A))},getCount:function(){return this.length},indexOf:function(A){return this.items.indexOf(A)},indexOfKey:function(A){return this.keys.indexOf(A)},item:function(A){var B=typeof this.map[A]!="undefined"?this.map[A]:this.items[A];return typeof B!="function"||this.allowFunctions?B:null},itemAt:function(A){return this.items[A]},key:function(A){return this.map[A]},contains:function(A){return this.indexOf(A)!=-1},containsKey:function(A){return typeof this.map[A]!="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(I,A,H){var C=String(A).toUpperCase()=="DESC"?-1:1;H=H||function(K,J){return K-J};var G=[],B=this.keys,F=this.items;for(var D=0,E=F.length;D<E;D++){G[G.length]={key:B[D],value:F[D],index:D}}G.sort(function(K,J){var L=H(K[I],J[I])*C;if(L==0){L=(K.index<J.index?-1:1)}return L});for(var D=0,E=G.length;D<E;D++){F[D]=G[D].value;B[D]=G[D].key}this.fireEvent("sort",this)},sort:function(A,B){this._sort("value",A,B)},keySort:function(A,B){this._sort("key",A,B||function(D,C){return String(D).toUpperCase()-String(C).toUpperCase()})},getRange:function(E,A){var B=this.items;if(B.length<1){return[]}E=E||0;A=Math.min(typeof A=="undefined"?this.length-1:A,this.length-1);var D=[];if(E<=A){for(var C=E;C<=A;C++){D[D.length]=B[C]}}else{for(var C=E;C>=A;C--){D[D.length]=B[C]}}return D},filter:function(C,B,D,A){if(Ext.isEmpty(B,false)){return this.clone()}B=this.createValueMatcher(B,D,A);return this.filterBy(function(E){return E&&B.test(E[C])})},filterBy:function(F,E){var G=new Ext.util.MixedCollection();G.getKey=this.getKey;var B=this.keys,D=this.items;for(var C=0,A=D.length;C<A;C++){if(F.call(E||this,D[C],B[C])){G.add(B[C],D[C])}}return G},findIndex:function(C,B,E,D,A){if(Ext.isEmpty(B,false)){return -1}B=this.createValueMatcher(B,D,A);return this.findIndexBy(function(F){return F&&B.test(F[C])},null,E)},findIndexBy:function(F,E,G){var B=this.keys,D=this.items;for(var C=(G||0),A=D.length;C<A;C++){if(F.call(E||this,D[C],B[C])){return C}}if(typeof G=="number"&&G>0){for(var C=0;C<G;C++){if(F.call(E||this,D[C],B[C])){return C}}}return -1},createValueMatcher:function(B,C,A){if(!B.exec){B=String(B);B=new RegExp((C===true?"":"^")+Ext.escapeRe(B),A?"":"i")}return B},clone:function(){var E=new Ext.util.MixedCollection();var B=this.keys,D=this.items;for(var C=0,A=D.length;C<A;C++){E.add(B[C],D[C])}E.getKey=this.getKey;return E}});Ext.util.MixedCollection.prototype.get=Ext.util.MixedCollection.prototype.item;
+
+
+Ext.util.JSON=new (function(){var useHasOwn=!!{}.hasOwnProperty;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("")};this.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(Ext.isArray(o)){return encodeArray(o)}else{if(Ext.isDate(o)){return Ext.util.JSON.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 value!==undefined?value:""},defaultValue:function(value,defaultValue){return value!==undefined&&value!==""?value:defaultValue},htmlEncode:function(value){return !value?value:String(value).replace(/&/g,"&amp;").replace(/>/g,"&gt;").replace(/</g,"&lt;").replace(/"/g,"&quot;")},htmlDecode:function(value){return !value?value:String(value).replace(/&amp;/g,"&").replace(/&gt;/g,">").replace(/&lt;/g,"<").replace(/&quot;/g,"\"")},trim:function(value){return String(value).replace(trimRe,"")},substr:function(value,start,length){return String(value).substr(start,length)},lowercase:function(value){return String(value).toLowerCase()},uppercase:function(value){return String(value).toUpperCase()},capitalize:function(value){return !value?value:value.charAt(0).toUpperCase()+value.substr(1).toLowerCase()},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)}},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);v=String(v);var ps=v.split(".");var whole=ps[0];var sub=ps[1]?"."+ps[1]:".00";var r=/(\d+)(\d{3})/;while(r.test(whole)){whole=whole.replace(r,"$1"+","+"$2")}v=whole+sub;if(v.charAt(0)=="-"){return"-$"+v.substr(1)}return"$"+v},date:function(v,format){if(!v){return""}if(!Ext.isDate(v)){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,"")},stripScriptsRe:/(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)/ig,stripScripts:function(v){return !v?v:String(v).replace(this.stripScriptsRe,"")},fileSize:function(size){if(size<1024){return size+" bytes"}else{if(size<1048576){return(Math.round(((size*10)/1024))/10)+" KB"}else{return(Math.round(((size*10)/1048576))/10)+" MB"}}},math:function(){var fns={};return function(v,a){if(!fns[a]){fns[a]=new Function("v","return v "+a+";")}return fns[a](v)}}()}}();
+
+
+Ext.XTemplate=function(){Ext.XTemplate.superclass.constructor.apply(this,arguments);var P=this.html;P=["<tpl>",P,"</tpl>"].join("");var O=/<tpl\b[^>]*>((?:(?=([^<]+))\2|<(?!tpl\b[^>]*>))*?)<\/tpl>/;var N=/^<tpl\b[^>]*?for="(.*?)"/;var L=/^<tpl\b[^>]*?if="(.*?)"/;var J=/^<tpl\b[^>]*?exec="(.*?)"/;var C,B=0;var G=[];while(C=P.match(O)){var M=C[0].match(N);var K=C[0].match(L);var I=C[0].match(J);var E=null,H=null,D=null;var A=M&&M[1]?M[1]:"";if(K){E=K&&K[1]?K[1]:null;if(E){H=new Function("values","parent","xindex","xcount","with(values){ return "+(Ext.util.Format.htmlDecode(E))+"; }")}}if(I){E=I&&I[1]?I[1]:null;if(E){D=new Function("values","parent","xindex","xcount","with(values){ "+(Ext.util.Format.htmlDecode(E))+"; }")}}if(A){switch(A){case".":A=new Function("values","parent","with(values){ return values; }");break;case"..":A=new Function("values","parent","with(values){ return parent; }");break;default:A=new Function("values","parent","with(values){ return "+A+"; }")}}G.push({id:B,target:A,exec:D,test:H,body:C[1]||""});P=P.replace(C[0],"{xtpl"+B+"}");++B}for(var F=G.length-1;F>=0;--F){this.compileTpl(G[F])}this.master=G[G.length-1];this.tpls=G};Ext.extend(Ext.XTemplate,Ext.Template,{re:/\{([\w-\.\#]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?(\s?[\+\-\*\\]\s?[\d\.\+\-\*\\\(\)]+)?\}/g,codeRe:/\{\[((?:\\\]|.|\n)*?)\]\}/g,applySubTemplate:function(A,H,G,D,C){var J=this.tpls[A];if(J.test&&!J.test.call(this,H,G,D,C)){return""}if(J.exec&&J.exec.call(this,H,G,D,C)){return""}var I=J.target?J.target.call(this,H,G):H;G=J.target?H:G;if(J.target&&Ext.isArray(I)){var B=[];for(var E=0,F=I.length;E<F;E++){B[B.length]=J.compiled.call(this,I[E],G,E+1,F)}return B.join("")}return J.compiled.call(this,I,G,D,C)},compileTpl:function(tpl){var fm=Ext.util.Format;var useF=this.disableFormats!==true;var sep=Ext.isGecko?"+":",";var fn=function(m,name,format,args,math){if(name.substr(0,4)=="xtpl"){return"'"+sep+"this.applySubTemplate("+name.substr(4)+", values, parent, xindex, xcount)"+sep+"'"}var v;if(name==="."){v="values"}else{if(name==="#"){v="xindex"}else{if(name.indexOf(".")!=-1){v=name}else{v="values['"+name+"']"}}}if(math){v="("+v+math+")"}if(format&&useF){args=args?","+args:"";if(format.substr(0,5)!="this."){format="fm."+format+"("}else{format="this.call(\""+format.substr(5)+"\", ";args=", values"}}else{args="";format="("+v+" === undefined ? '' : "}return"'"+sep+format+v+args+")"+sep+"'"};var codeFn=function(m,code){return"'"+sep+"("+code+")"+sep+"'"};var body;if(Ext.isGecko){body="tpl.compiled = function(values, parent, xindex, xcount){ return '"+tpl.body.replace(/(\r\n|\n)/g,"\\n").replace(/'/g,"\\'").replace(this.re,fn).replace(this.codeRe,codeFn)+"';};"}else{body=["tpl.compiled = function(values, parent, xindex, xcount){ return ['"];body.push(tpl.body.replace(/(\r\n|\n)/g,"\\n").replace(/'/g,"\\'").replace(this.re,fn).replace(this.codeRe,codeFn));body.push("'].join('');};");body=body.join("")}eval(body);return this},applyTemplate:function(A){return this.master.compiled.call(this,A,{},1,1)},compile:function(){return this}});Ext.XTemplate.prototype.apply=Ext.XTemplate.prototype.applyTemplate;Ext.XTemplate.from=function(A){A=Ext.getDom(A);return new Ext.XTemplate(A.value||A.innerHTML)};
+
+
+Ext.util.CSS=function(){var D=null;var C=document;var B=/(-[a-z])/gi;var A=function(E,F){return F.charAt(1).toUpperCase()};return{createStyleSheet:function(G,J){var F;var E=C.getElementsByTagName("head")[0];var I=C.createElement("style");I.setAttribute("type","text/css");if(J){I.setAttribute("id",J)}if(Ext.isIE){E.appendChild(I);F=I.styleSheet;F.cssText=G}else{try{I.appendChild(C.createTextNode(G))}catch(H){I.cssText=G}E.appendChild(I);F=I.styleSheet?I.styleSheet:(I.sheet||C.styleSheets[C.styleSheets.length-1])}this.cacheStyleSheet(F);return F},removeStyleSheet:function(F){var E=C.getElementById(F);if(E){E.parentNode.removeChild(E)}},swapStyleSheet:function(G,E){this.removeStyleSheet(G);var F=C.createElement("link");F.setAttribute("rel","stylesheet");F.setAttribute("type","text/css");F.setAttribute("id",G);F.setAttribute("href",E);C.getElementsByTagName("head")[0].appendChild(F)},refreshCache:function(){return this.getRules(true)},cacheStyleSheet:function(F){if(!D){D={}}try{var H=F.cssRules||F.rules;for(var E=H.length-1;E>=0;--E){D[H[E].selectorText]=H[E]}}catch(G){}},getRules:function(F){if(D==null||F){D={};var H=C.styleSheets;for(var G=0,E=H.length;G<E;G++){try{this.cacheStyleSheet(H[G])}catch(I){}}}return D},getRule:function(E,G){var F=this.getRules(G);if(!Ext.isArray(E)){return F[E]}for(var H=0;H<E.length;H++){if(F[E[H]]){return F[E[H]]}}return null},updateRule:function(E,H,G){if(!Ext.isArray(E)){var I=this.getRule(E);if(I){I.style[H.replace(B,A)]=G;return true}}else{for(var F=0;F<E.length;F++){if(this.updateRule(E[F],H,G)){return true}}}return false}}}();
+
+
+Ext.util.ClickRepeater=function(B,A){this.el=Ext.get(B);this.el.unselectable();Ext.apply(this,A);this.addEvents("mousedown","click","mouseup");this.el.on("mousedown",this.handleMouseDown,this);if(this.preventDefault||this.stopDefault){this.el.on("click",function(C){if(this.preventDefault){C.preventDefault()}if(this.stopDefault){C.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,handleMouseDown:function(){clearTimeout(this.timer);this.el.blur();if(this.pressClass){this.el.addClass(this.pressClass)}this.mousedownTime=new Date();Ext.getDoc().on("mouseup",this.handleMouseUp,this);this.el.on("mouseout",this.handleMouseOut,this);this.fireEvent("mousedown",this);this.fireEvent("click",this);if(this.accelerate){this.delay=400}this.timer=this.click.defer(this.delay||this.interval,this)},click:function(){this.fireEvent("click",this);this.timer=this.click.defer(this.accelerate?this.easeOutExpo(this.mousedownTime.getElapsed(),400,-390,12000):this.interval,this)},easeOutExpo:function(B,A,D,C){return(B==C)?A+D:D*(-Math.pow(2,-10*B/C)+1)+A},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);Ext.getDoc().un("mouseup",this.handleMouseUp);this.el.removeClass(this.pressClass);this.fireEvent("mouseup",this)}});
+
+
+Ext.KeyNav=function(B,A){this.el=Ext.get(B);Ext.apply(this,A);if(!this.disabled){this.disabled=true;this.enable()}};Ext.KeyNav.prototype={disabled:false,defaultEventAction:"stopEvent",forceKeyDown:false,prepareEvent:function(C){var A=C.getKey();var B=this.keyToHandler[A];if(Ext.isSafari2&&B&&A>=37&&A<=40){C.stopEvent()}},relay:function(C){var A=C.getKey();var B=this.keyToHandler[A];if(B&&this[B]){if(this.doRelay(C,this[B],B)!==true){C[this.defaultEventAction]()}}},doRelay:function(C,B,A){return B.call(this.scope||this,C)},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(this.forceKeyDown||Ext.isIE||Ext.isSafari3||Ext.isAir){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(this.forceKeyDown||Ext.isIE||Ext.isSafari3||Ext.isAir){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(C,B,A){this.el=Ext.get(C);this.eventName=A||"keydown";this.bindings=[];if(B){this.addBinding(B)}this.enable()};Ext.KeyMap.prototype={stopEvent:false,addBinding:function(D){if(Ext.isArray(D)){for(var F=0,H=D.length;F<H;F++){this.addBinding(D[F])}return }var N=D.key,C=D.shift,A=D.ctrl,G=D.alt,J=D.fn||D.handler,M=D.scope;if(typeof N=="string"){var K=[];var I=N.toUpperCase();for(var E=0,H=I.length;E<H;E++){K.push(I.charCodeAt(E))}N=K}var B=Ext.isArray(N);var L=function(R){if((!C||R.shiftKey)&&(!A||R.ctrlKey)&&(!G||R.altKey)){var P=R.getKey();if(B){for(var Q=0,O=N.length;Q<O;Q++){if(N[Q]==P){if(this.stopEvent){R.stopEvent()}J.call(M||window,P,R);return }}}else{if(P==N){if(this.stopEvent){R.stopEvent()}J.call(M||window,P,R)}}}};this.bindings.push(L)},on:function(B,D,C){var G,A,E,F;if(typeof B=="object"&&!Ext.isArray(B)){G=B.key;A=B.shift;E=B.ctrl;F=B.alt}else{G=B}this.addBinding({key:G,shift:A,ctrl:E,alt:F,fn:D,scope:C})},handleKeyDown:function(D){if(this.enabled){var B=this.bindings;for(var C=0,A=B.length;C<A;C++){B[C].call(this,D)}}},isEnabled:function(){return this.enabled},enable:function(){if(!this.enabled){this.el.on(this.eventName,this.handleKeyDown,this);this.enabled=true}},disable:function(){if(this.enabled){this.el.removeListener(this.eventName,this.handleKeyDown,this);this.enabled=false}}};
+
+
+Ext.util.TextMetrics=function(){var A;return{measure:function(B,C,D){if(!A){A=Ext.util.TextMetrics.Instance(B,D)}A.bind(B);A.setFixedWidth(D||"auto");return A.getSize(C)},createInstance:function(B,C){return Ext.util.TextMetrics.Instance(B,C)}}}();Ext.util.TextMetrics.Instance=function(B,D){var C=new Ext.Element(document.createElement("div"));document.body.appendChild(C.dom);C.position("absolute");C.setLeftTop(-1000,-1000);C.hide();if(D){C.setWidth(D)}var A={getSize:function(F){C.update(F);var E=C.getSize();C.update("");return E},bind:function(E){C.setStyle(Ext.fly(E).getStyles("font-size","font-style","font-weight","font-family","line-height","text-transform","letter-spacing"))},setFixedWidth:function(E){C.setWidth(E)},getWidth:function(E){C.dom.style.width="auto";return this.getSize(E).width},getHeight:function(E){return this.getSize(E).height}};A.bind(B);return A};Ext.Element.measureText=Ext.util.TextMetrics.measure;
+
+
+Ext.data.SortTypes={none:function(A){return A},stripTagsRE:/<\/?[^>]+>/gi,asText:function(A){return String(A).replace(this.stripTagsRE,"")},asUCText:function(A){return String(A).toUpperCase().replace(this.stripTagsRE,"")},asUCString:function(A){return String(A).toUpperCase()},asDate:function(A){if(!A){return 0}if(Ext.isDate(A)){return A.getTime()}return Date.parse(String(A))},asFloat:function(A){var B=parseFloat(String(A).replace(/,/g,""));if(isNaN(B)){B=0}return B},asInt:function(A){var B=parseInt(String(A).replace(/,/g,""));if(isNaN(B)){B=0}return B}};
+
+
+Ext.data.Record=function(A,B){this.id=(B||B===0)?B:++Ext.data.Record.AUTO_ID;this.data=A};Ext.data.Record.create=function(E){var C=Ext.extend(Ext.data.Record,{});var D=C.prototype;D.fields=new Ext.util.MixedCollection(false,function(F){return F.name});for(var B=0,A=E.length;B<A;B++){D.fields.add(new Ext.data.Field(E[B]))}C.getField=function(F){return D.fields.get(F)};return C};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(A,B){if(String(this.data[A])==String(B)){return }this.dirty=true;if(!this.modified){this.modified={}}if(typeof this.modified[A]=="undefined"){this.modified[A]=this.data[A]}this.data[A]=B;if(!this.editing&&this.store){this.store.afterEdit(this)}},get:function(A){return this.data[A]},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(B){var A=this.modified;for(var C in A){if(typeof A[C]!="function"){this.data[C]=A[C]}}this.dirty=false;delete this.modified;this.editing=false;if(this.store&&B!==true){this.store.afterReject(this)}},commit:function(A){this.dirty=false;delete this.modified;this.editing=false;if(this.store&&A!==true){this.store.afterCommit(this)}},getChanges:function(){var A=this.modified,B={};for(var C in A){if(A.hasOwnProperty(C)){B[C]=this.data[C]}}return B},hasError:function(){return this.error!=null},clearError:function(){this.error=null},copy:function(A){return new this.constructor(Ext.apply({},this.data),A||this.id)},isModified:function(A){return this.modified&&this.modified.hasOwnProperty(A)}};
+
+
+Ext.data.Store=function(A){this.data=new Ext.util.MixedCollection(false);this.data.getKey=function(B){return B.id};this.baseParams={};this.paramNames={"start":"start","limit":"limit","sort":"sort","dir":"dir"};if(A&&A.data){this.inlineData=A.data;delete A.data}Ext.apply(this,A);if(this.url&&!this.proxy){this.proxy=new Ext.data.HttpProxy({url:this.url})}if(this.reader){if(!this.recordType){this.recordType=this.reader.recordType}if(this.reader.onMetaChange){this.reader.onMetaChange=this.onMetaChange.createDelegate(this)}}if(this.recordType){this.fields=this.recordType.prototype.fields}this.modified=[];this.addEvents("datachanged","metachange","add","remove","update","clear","beforeload","load","loadexception");if(this.proxy){this.relayEvents(this.proxy,["loadexception"])}this.sortToggle={};if(this.sortInfo){this.setDefaultSort(this.sortInfo.field,this.sortInfo.direction)}Ext.data.Store.superclass.constructor.call(this);if(this.storeId||this.id){Ext.StoreMgr.register(this)}if(this.inlineData){this.loadData(this.inlineData);delete this.inlineData}else{if(this.autoLoad){this.load.defer(10,this,[typeof this.autoLoad=="object"?this.autoLoad:undefined])}}};Ext.extend(Ext.data.Store,Ext.util.Observable,{remoteSort:false,pruneModifiedRecords:false,lastOptions:null,destroy:function(){if(this.id){Ext.StoreMgr.unregister(this)}this.data=null;this.purgeListeners()},add:function(B){B=[].concat(B);if(B.length<1){return }for(var D=0,A=B.length;D<A;D++){B[D].join(this)}var C=this.data.length;this.data.addAll(B);if(this.snapshot){this.snapshot.addAll(B)}this.fireEvent("add",this,B,C)},addSorted:function(A){var B=this.findInsertIndex(A);this.insert(B,A)},remove:function(A){var B=this.data.indexOf(A);this.data.removeAt(B);if(this.pruneModifiedRecords){this.modified.remove(A)}if(this.snapshot){this.snapshot.remove(A)}this.fireEvent("remove",this,A,B)},removeAll:function(){this.data.clear();if(this.snapshot){this.snapshot.clear()}if(this.pruneModifiedRecords){this.modified=[]}this.fireEvent("clear",this)},insert:function(C,B){B=[].concat(B);for(var D=0,A=B.length;D<A;D++){this.data.insert(C,B[D]);B[D].join(this)}this.fireEvent("add",this,B,C)},indexOf:function(A){return this.data.indexOf(A)},indexOfId:function(A){return this.data.indexOfKey(A)},getById:function(A){return this.data.key(A)},getAt:function(A){return this.data.itemAt(A)},getRange:function(B,A){return this.data.getRange(B,A)},storeOptions:function(A){A=Ext.apply({},A);delete A.callback;delete A.scope;this.lastOptions=A},load:function(B){B=B||{};if(this.fireEvent("beforeload",this,B)!==false){this.storeOptions(B);var C=Ext.apply(B.params||{},this.baseParams);if(this.sortInfo&&this.remoteSort){var A=this.paramNames;C[A["sort"]]=this.sortInfo.field;C[A["dir"]]=this.sortInfo.direction}this.proxy.load(C,this.reader,this.loadRecords,this,B);return true}else{return false}},reload:function(A){this.load(Ext.applyIf(A||{},this.lastOptions))},loadRecords:function(G,B,F){if(!G||F===false){if(F!==false){this.fireEvent("load",this,[],B)}if(B.callback){B.callback.call(B.scope||this,[],B,false)}return }var E=G.records,D=G.totalRecords||E.length;if(!B||B.add!==true){if(this.pruneModifiedRecords){this.modified=[]}for(var C=0,A=E.length;C<A;C++){E[C].join(this)}if(this.snapshot){this.data=this.snapshot;delete this.snapshot}this.data.clear();this.data.addAll(E);this.totalLength=D;this.applySort();this.fireEvent("datachanged",this)}else{this.totalLength=Math.max(D,this.data.length+E.length);this.add(E)}this.fireEvent("load",this,E,B);if(B.callback){B.callback.call(B.scope||this,E,B,true)}},loadData:function(C,A){var B=this.reader.readRecords(C);this.loadRecords(B,{add:A},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 A=this.sortInfo,B=A.field;this.sortData(B,A.direction)}},sortData:function(C,D){D=D||"ASC";var A=this.fields.get(C).sortType;var B=function(F,E){var H=A(F.data[C]),G=A(E.data[C]);return H>G?1:(H<G?-1:0)};this.data.sort(D,B);if(this.snapshot&&this.snapshot!=this.data){this.snapshot.sort(D,B)}},setDefaultSort:function(B,A){A=A?A.toUpperCase():"ASC";this.sortInfo={field:B,direction:A};this.sortToggle[B]=A},sort:function(E,C){var D=this.fields.get(E);if(!D){return false}if(!C){if(this.sortInfo&&this.sortInfo.field==D.name){C=(this.sortToggle[D.name]||"ASC").toggle("ASC","DESC")}else{C=D.sortDir}}var B=(this.sortToggle)?this.sortToggle[D.name]:null;var A=(this.sortInfo)?this.sortInfo:null;this.sortToggle[D.name]=C;this.sortInfo={field:D.name,direction:C};if(!this.remoteSort){this.applySort();this.fireEvent("datachanged",this)}else{if(!this.load(this.lastOptions)){if(B){this.sortToggle[D.name]=B}if(A){this.sortInfo=A}}}},each:function(B,A){this.data.each(B,A)},getModifiedRecords:function(){return this.modified},createFilterFn:function(C,B,D,A){if(Ext.isEmpty(B,false)){return false}B=this.data.createValueMatcher(B,D,A);return function(E){return B.test(E.data[C])}},sum:function(E,F,A){var C=this.data.items,B=0;F=F||0;A=(A||A===0)?A:C.length-1;for(var D=F;D<=A;D++){B+=(C[D].data[E]||0)}return B},filter:function(D,C,E,A){var B=this.createFilterFn(D,C,E,A);return B?this.filterBy(B):this.clearFilter()},filterBy:function(B,A){this.snapshot=this.snapshot||this.data;this.data=this.queryBy(B,A||this);this.fireEvent("datachanged",this)},query:function(D,C,E,A){var B=this.createFilterFn(D,C,E,A);return B?this.queryBy(B):this.data.clone()},queryBy:function(B,A){var C=this.snapshot||this.data;return C.filterBy(B,A||this)},find:function(D,C,F,E,A){var B=this.createFilterFn(D,C,E,A);return B?this.data.findIndexBy(B,null,F):-1},findBy:function(B,A,C){return this.data.findIndexBy(B,A,C)},collect:function(G,H,B){var F=(B===true&&this.snapshot)?this.snapshot.items:this.data.items;var I,J,A=[],C={};for(var D=0,E=F.length;D<E;D++){I=F[D].data[G];J=String(I);if((H||!Ext.isEmpty(I))&&!C[J]){C[J]=true;A[A.length]=I}}return A},clearFilter:function(A){if(this.isFiltered()){this.data=this.snapshot;delete this.snapshot;if(A!==true){this.fireEvent("datachanged",this)}}},isFiltered:function(){return this.snapshot&&this.snapshot!=this.data},afterEdit:function(A){if(this.modified.indexOf(A)==-1){this.modified.push(A)}this.fireEvent("update",this,A,Ext.data.Record.EDIT)},afterReject:function(A){this.modified.remove(A);this.fireEvent("update",this,A,Ext.data.Record.REJECT)},afterCommit:function(A){this.modified.remove(A);this.fireEvent("update",this,A,Ext.data.Record.COMMIT)},commitChanges:function(){var B=this.modified.slice(0);this.modified=[];for(var C=0,A=B.length;C<A;C++){B[C].commit()}},rejectChanges:function(){var B=this.modified.slice(0);this.modified=[];for(var C=0,A=B.length;C<A;C++){B[C].reject()}},onMetaChange:function(B,A,C){this.recordType=A;this.fields=A.prototype.fields;delete this.snapshot;this.sortInfo=B.sortInfo;this.modified=[];this.fireEvent("metachange",this,this.reader.meta)},findInsertIndex:function(A){this.suspendEvents();var C=this.data.clone();this.data.add(A);this.applySort();var B=this.data.indexOf(A);this.data=C;this.resumeEvents();return B}});
+
+
+Ext.data.Field=function(D){if(typeof D=="string"){D={name:D}}Ext.apply(this,D);if(!this.type){this.type="auto"}var C=Ext.data.SortTypes;if(typeof this.sortType=="string"){this.sortType=C[this.sortType]}if(!this.sortType){switch(this.type){case"string":this.sortType=C.asUCString;break;case"date":this.sortType=C.asDate;break;default:this.sortType=C.none}}var E=/[\$,%]/g;if(!this.convert){var B,A=this.dateFormat;switch(this.type){case"":case"auto":case undefined:B=function(F){return F};break;case"string":B=function(F){return(F===undefined||F===null)?"":String(F)};break;case"int":B=function(F){return F!==undefined&&F!==null&&F!==""?parseInt(String(F).replace(E,""),10):""};break;case"float":B=function(F){return F!==undefined&&F!==null&&F!==""?parseFloat(String(F).replace(E,""),10):""};break;case"bool":case"boolean":B=function(F){return F===true||F==="true"||F==1};break;case"date":B=function(G){if(!G){return""}if(Ext.isDate(G)){return G}if(A){if(A=="timestamp"){return new Date(G*1000)}if(A=="time"){return new Date(parseInt(G,10))}return Date.parseDate(G,A)}var F=Date.parse(G);return F?new Date(F):null};break}this.convert=B}};Ext.data.Field.prototype={dateFormat:null,defaultValue:"",mapping:null,sortType:null,sortDir:"ASC"};
+
+
+Ext.data.DataReader=function(A,B){this.meta=A;this.recordType=Ext.isArray(B)?Ext.data.Record.create(B):B};Ext.data.DataReader.prototype={};
+
+
+Ext.data.DataProxy=function(){this.addEvents("beforeload","load");Ext.data.DataProxy.superclass.constructor.call(this)};Ext.extend(Ext.data.DataProxy,Ext.util.Observable);
+
+
+Ext.data.MemoryProxy=function(A){Ext.data.MemoryProxy.superclass.constructor.call(this);this.data=A};Ext.extend(Ext.data.MemoryProxy,Ext.data.DataProxy,{load:function(F,C,G,D,B){F=F||{};var A;try{A=C.readRecords(this.data)}catch(E){this.fireEvent("loadexception",this,B,null,E);G.call(D,null,B,false);return }G.call(D,A,B,true)},update:function(B,A){}});
+
+
+Ext.data.HttpProxy=function(A){Ext.data.HttpProxy.superclass.constructor.call(this);this.conn=A;this.useAjax=!A||!A.events};Ext.extend(Ext.data.HttpProxy,Ext.data.DataProxy,{getConnection:function(){return this.useAjax?Ext.Ajax:this.conn},load:function(E,B,F,C,A){if(this.fireEvent("beforeload",this,E)!==false){var D={params:E||{},request:{callback:F,scope:C,arg:A},reader:B,callback:this.loadResponse,scope:this};if(this.useAjax){Ext.applyIf(D,this.conn);if(this.activeRequest){Ext.Ajax.abort(this.activeRequest)}this.activeRequest=Ext.Ajax.request(D)}else{this.conn.request(D)}}else{F.call(C||this,null,A,false)}},loadResponse:function(E,D,B){delete this.activeRequest;if(!D){this.fireEvent("loadexception",this,E,B);E.request.callback.call(E.request.scope,null,E.request.arg,false);return }var A;try{A=E.reader.read(B)}catch(C){this.fireEvent("loadexception",this,E,B,C);E.request.callback.call(E.request.scope,null,E.request.arg,false);return }this.fireEvent("load",this,E,E.request.arg);E.request.callback.call(E.request.scope,A,E.request.arg,true)},update:function(A){},updateResponse:function(A){}});
+
+
+Ext.data.ScriptTagProxy=function(A){Ext.data.ScriptTagProxy.superclass.constructor.call(this);Ext.apply(this,A);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(E,F,H,I,J){if(this.fireEvent("beforeload",this,E)!==false){var C=Ext.urlEncode(Ext.apply(E,this.extraParams));var B=this.url;B+=(B.indexOf("?")!=-1?"&":"?")+C;if(this.nocache){B+="&_dc="+(new Date().getTime())}var A=++Ext.data.ScriptTagProxy.TRANS_ID;var K={id:A,cb:"stcCallback"+A,scriptId:"stcScript"+A,params:E,arg:J,url:B,callback:H,scope:I,reader:F};var D=this;window[K.cb]=function(L){D.handleResponse(L,K)};B+=String.format("&{0}={1}",this.callbackParam,K.cb);if(this.autoAbort!==false){this.abort()}K.timeoutId=this.handleFailure.defer(this.timeout,this,[K]);var G=document.createElement("script");G.setAttribute("src",B);G.setAttribute("type","text/javascript");G.setAttribute("id",K.scriptId);this.head.appendChild(G);this.trans=K}else{H.call(I||this,null,J,false)}},isLoading:function(){return this.trans?true:false},abort:function(){if(this.isLoading()){this.destroyTrans(this.trans)}},destroyTrans:function(B,A){this.head.removeChild(document.getElementById(B.scriptId));clearTimeout(B.timeoutId);if(A){window[B.cb]=undefined;try{delete window[B.cb]}catch(C){}}else{window[B.cb]=function(){window[B.cb]=undefined;try{delete window[B.cb]}catch(D){}}}},handleResponse:function(D,B){this.trans=false;this.destroyTrans(B,true);var A;try{A=B.reader.readRecords(D)}catch(C){this.fireEvent("loadexception",this,D,B.arg,C);B.callback.call(B.scope||window,null,B.arg,false);return }this.fireEvent("load",this,D,B.arg);B.callback.call(B.scope||window,A,B.arg,true)},handleFailure:function(A){this.trans=false;this.destroyTrans(A,false);this.fireEvent("loadexception",this,null,A.arg);A.callback.call(A.scope||window,null,A.arg,false)}});
+
+
+Ext.LoadMask=function(C,B){this.el=Ext.get(C);Ext.apply(this,B);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=Ext.value(this.removeMask,false)}else{var A=this.el.getUpdater();A.showLoadIndicator=false;A.on("beforeupdate",this.onBeforeLoad,this);A.on("update",this.onLoad,this);A.on("failure",this.onLoad,this);this.removeMask=Ext.value(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)}},show:function(){this.onBeforeLoad()},hide:function(){this.onLoad()},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 A=this.el.getUpdater();A.un("beforeupdate",this.onBeforeLoad,this);A.un("update",this.onLoad,this);A.un("failure",this.onLoad,this)}}};

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/forgot-password.css
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/forgot-password.css	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/forgot-password.css	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,25 @@
+.qo-login-instructions {
+	left:410px;
+	top:160px;
+	width:345px;
+}
+.qo-login-submit {
+	background:transparent url(images/send-btn.gif) no-repeat 0 0;
+	height:22px;
+	left:710px;
+	top:338px;
+	width:43px;
+}
+.qo-login-submit-over {
+	background:transparent url(images/send-btn.gif) no-repeat 0 -38px;
+	height:22px;
+	left:710px;
+	top:338px;
+	width:43px;
+}
+.qo-login-signup {
+	left:497px;
+}
+.qo-login-forgot {
+	left:627px;
+}
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/forgot-password.js
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/forgot-password.js	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/forgot-password.js	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,82 @@
+Ext.onReady(function(){
+	var loginPanel = Ext.get("qo-login-panel");
+	var xy = loginPanel.getAlignToXY(document, 'c-c');
+	setPagePosition(loginPanel, xy[0], xy[1]);
+	
+	var loginBtn = Ext.get("submitBtn");
+	loginBtn.on({
+		'click': { fn: login }
+		, 'mouseover': { fn: function(){ loginBtn.addClass('qo-login-submit-over'); } }
+		, 'mouseout': { fn: function(){ loginBtn.removeClass('qo-login-submit-over'); } }
+	});
+	
+	function login(){		
+		var emailField = Ext.get("field1");
+		var email = emailField.dom.value;
+		
+		if(validate(email) === false){
+			alert("Your email address is required");
+			return false;
+		}
+		
+		loginPanel.mask('Please wait...', 'x-mask-loading');
+		
+		Ext.Ajax.request({
+			url: 'system/login/login.php'
+			, params: {
+				module: 'forgotPassword'
+				, user: email
+			}
+			, success: function(o){
+				loginPanel.unmask();
+				
+				if(typeof o == 'object'){
+					var d = Ext.decode(o.responseText);
+					
+					if(typeof d == 'object'){
+						if(d.success == true){
+							alert('Your password has been sent to your email.');
+						}else{
+							if(d.errors){
+								alert(d.errors[0].msg);
+							}else{
+								alert('Errors encountered on the server.');
+							}
+						}
+					}
+				}
+			}
+			, failure: function(){
+				loginPanel.unmask();
+				alert('Lost connection to server.');
+			}
+		});
+	}
+	
+	function setPagePosition(el, x, y){
+        if(x && typeof x[1] == 'number'){
+            y = x[1];
+            x = x[0];
+        }
+        el.pageX = x;
+        el.pageY = y;
+       	
+        if(x === undefined || y === undefined){ // cannot translate undefined points
+            return;
+        }
+        
+        if(y < 0){ y = 10; }
+        
+        var p = el.translatePoints(x, y);
+        el.setLocation(p.left, p.top);
+        return el;
+    }
+    
+    function validate(field){
+		if(field === ""){
+			//field.markInvalid();
+			return false;
+		}
+		return true;
+	}
+});
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/images/bg-panel.jpg
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/images/bg-panel.jpg
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/images/blank.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/images/blank.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/images/login-btn.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/images/login-btn.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/images/logo.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/images/logo.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/images/screenshot.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/images/screenshot.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/images/send-btn.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/images/send-btn.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/login.js
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/login.js	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/login.js	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,155 @@
+Ext.onReady(function(){
+	Ext.EventManager.onWindowResize(centerPanel);
+	
+	var loginPanel = Ext.get("qo-login-panel");
+	
+	var loginBtn = Ext.get("submitBtn");
+	loginBtn.on({
+		'click': { fn: login }
+		, 'mouseover': { fn: function(){ loginBtn.addClass('qo-login-submit-over'); } }
+		, 'mouseout': { fn: function(){ loginBtn.removeClass('qo-login-submit-over'); } }
+	});
+	
+	Ext.get("field3-label").setDisplayed('none');
+	Ext.get("field3").setDisplayed('none');
+
+	centerPanel();
+	
+	function centerPanel(){
+		var xy = loginPanel.getAlignToXY(document, 'c-c');
+		positionPanel(loginPanel, xy[0], xy[1]);
+	}
+	
+	function hideLoginFields(){
+		Ext.get("field1-label").setDisplayed('none');
+		Ext.get("field1").setDisplayed('none');
+		Ext.get("field2-label").setDisplayed('none');
+		Ext.get("field2").setDisplayed('none');
+	}
+	
+	function loadGroupField(d){
+		var combo = Ext.get("field3");
+		var comboEl = combo.dom;
+		
+		while(comboEl.options.length){
+			comboEl.options[0] = null;
+		}
+		
+		for(var i = 0, len = d.length; i < len; i++){
+			comboEl.options[i] = new Option(d[i][1], d[i][0]);
+		}
+	}
+	
+	function login(){		
+		var emailField = Ext.get("field1");
+		var email = emailField.dom.value;
+		var pwdField = Ext.get("field2");
+		var pwd = pwdField.dom.value;
+		var groupField = Ext.get("field3");
+		var group = groupField.dom.value;
+		
+		if(validate(email) === false){
+			alert("Your email address is required");
+			return false;
+		}
+		
+		if(validate(pwd) === false){
+			alert("Your password is required");
+			return false;
+		}
+		
+		loginPanel.mask('Please wait...', 'x-mask-loading');
+		
+		Ext.Ajax.request({
+			url: 'system/login/login.php'
+			, params: {
+				module: 'login'
+				, user: email
+				, pass: pwd
+				, group: group
+			}
+			, success: function(o){
+				loginPanel.unmask();
+				
+				if(typeof o == 'object'){
+					var d = Ext.decode(o.responseText);
+					
+					if(typeof d == 'object'){
+						if(d.success == true){
+							var g = d.groups;
+							
+							if(g && g.length > 0){	
+								hideLoginFields();
+								showGroupField();
+						
+								var d = [];
+								for(var i = 0, len = g.length; i < len; i++){
+									d.push([g[i].id, g[i].name]);
+								}
+								
+								loadGroupField(d);
+								
+							}else if(d.sessionId !== ""){
+								
+								loginPanel.mask('Redirecting...', 'x-mask-loading');
+								
+								// get the path
+								var path = window.location.pathname,
+									path = path.substring(0, path.lastIndexOf('/') + 1);
+									
+								// set the cookie
+								set_cookie('sessionId', d.sessionId, '', path, '', '' );
+								
+								// redirect the window
+								window.location = path;
+								
+							}
+						}else{
+							if(d.errors && d.errors[0].msg){
+								alert(d.errors[0].msg);
+							}else{
+								alert('Errors encountered on the server.');
+							}
+						}
+					}
+				}
+			}
+			, failure: function(){
+				loginPanel.unmask();
+				alert('Lost connection to server.');
+			}
+		});
+	}
+	
+	function positionPanel(el, x, y){
+        if(x && typeof x[1] == 'number'){
+            y = x[1];
+            x = x[0];
+        }
+        el.pageX = x;
+        el.pageY = y;
+       	
+        if(x === undefined || y === undefined){ // cannot translate undefined points
+            return;
+        }
+        
+        if(y < 0){ y = 10; }
+        
+        var p = el.translatePoints(x, y);
+        el.setLocation(p.left, p.top);
+        return el;
+    }
+    
+    function showGroupField(){
+		Ext.get("field3-label").setDisplayed(true);
+		Ext.get("field3").setDisplayed(true);
+	}
+    
+    function validate(field){
+		if(field === ""){
+			//field.markInvalid();
+			return false;
+		}
+		return true;
+	}
+});
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/login.php
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/login.php	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/login.php	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,23 @@
+<?php
+// get the os
+require_once("../os/os.php");
+if(class_exists('os')){
+	$os = new os();
+	
+	$module = $_POST['module'];
+	
+	if($module == ""){
+		die("success: false");
+	}
+	
+	if($module == 'login'){
+		print $os->session->login($_POST['user'], $_POST['pass'], $_POST['group']);
+	}else if($module == 'signup'){
+		//print $os->signup($_POST['first_name'], $_POST['last_name'], $_POST['email'], $_POST['email_verify'], $_POST['comments']);
+	}else if($module == 'forgotPassword'){
+		//print $os->forgot_password($_POST['user']);
+	}else{
+		print "{success: false}";
+	}
+}
+?>
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/login.php.bak
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/login.php.bak	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/login.php.bak	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,23 @@
+<?php
+// get the os
+require_once("../os/os.php");
+if(class_exists('os')){
+	$os = new os();
+	
+	$module = $_POST['module'];
+	
+	if($module == ""){
+		die("success: false");
+	}
+	
+	if($module == 'login'){
+		print $os->login($module, $_POST['user'], $_POST['pass']);
+	}else if($module == 'signup'){
+		print $os->signup($_POST['first_name'], $_POST['last_name'], $_POST['email'], $_POST['email_verify'], $_POST['comments']);
+	}else if($module == 'forgotPassword'){
+		print $os->forgot_password($_POST['user']);
+	}else{
+		print "{success: false}";
+	}
+}
+?>
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/shared.css
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/shared.css	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/shared.css	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,104 @@
+body {
+	background:#000000 none;
+	color:#ffffff;
+	font-family:verdana,tahoma,arial,verdana,sans-serif;
+	font-size:11px;
+}
+p {
+	margin:12px 0;
+}
+a {
+	color:#ffcc33;
+}
+.key {
+	text-decoration:underline;
+}
+input,
+textarea {
+	font-family:verdana,tahoma,arial,verdana,sans-serif;
+	font-size:12px;
+	padding:3px;
+}
+.qo-abs-position {
+	position:absolute;
+}
+#qo-login-panel {
+	background:#000000 url(images/bg-panel.jpg) no-repeat;
+	border:1px solid #000108;
+	height:510px;
+	width:798px;
+}
+.qo-login-logo {
+	background:transparent url(images/logo.png) no-repeat;
+	filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='system/login/images/logo.png', sizingMethod='scale');
+	height:130px;
+	left:0px;
+	top:0px;
+	width:420px;
+}
+.qo-login-benefits {
+	left:52px;
+	top:145px;
+	width:300px;
+}
+.qo-login-screenshot {
+	background:transparent url(images/screenshot.png) no-repeat;
+	filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='system/login/images/screenshot.png', sizingMethod='scale');
+	height:190px;
+	left:37px;
+	top:285px;
+	width:329px;
+}
+.qo-login-supported {
+	left:623px;
+	top:35px;
+}
+.qo-login-signup {
+	left:495px;
+	top:445px;
+}
+.qo-login-forgot {
+	left:625px;
+	top:445px;
+}
+#field1-label {
+	left:410px;
+	top:300px;
+}
+#field1 {
+	left:540px;
+	top:298px;
+	width:200px;
+}
+#field2-label {
+	left:410px;
+	top:335px;
+}
+#field2 {
+	left:540px;
+	top:333px;
+	width:200px;
+}
+#field3-label {
+	left:430px;
+	top:300px;
+}
+#field3 {
+	left:550px;
+	top:298px;
+	width:200px;
+}
+.qo-login-submit {
+	background:transparent url(images/login-btn.gif) no-repeat 0 0;
+	height:22px;
+	left:705px;
+	top:373px;
+	width:43px;
+}
+.qo-login-submit-over {
+	background:transparent url(images/login-btn.gif) no-repeat 0 -38px;
+	height:22px;
+	left:705px;
+	top:373px;
+	width:43px;
+}
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/signup.css
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/signup.css	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/signup.css	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,63 @@
+.qo-login-signup {
+	left:497px;
+}
+.qo-login-forgot {
+	left:627px;
+}
+#field1-label {
+	left:410px;
+	top:172px;
+}
+#field1 {
+	left:550px;
+	top:170px;
+}
+#field2-label {
+	left:410px;
+	top:207px;
+}
+#field2 {
+	left:550px;
+	top:205px;
+}
+#field3-label {
+	left:410px;
+	top:242px;
+}
+#field3 {
+	left:550px;
+	top:240px;
+}
+#field4-label {
+	left:410px;
+	top:277px;
+}
+#field4 {
+	left:550px;
+	top:275px;
+	width:200px;
+}
+#field5-label {
+	left:410px;
+	top:310px;
+}
+#field5 {
+	height:50px;
+	left:410px;
+	top:330px;
+	width:340px;
+}
+.qo-login-submit {
+	background:transparent url(images/send-btn.gif) no-repeat 0 0;
+	height:22px;
+	left:710px;
+	top:404px;
+	width:43px;
+}
+.qo-login-submit-over {
+	background:transparent url(images/send-btn.gif) no-repeat 0 -38px;
+	height:22px;
+	left:710px;
+	top:404px;
+	width:43px;
+}
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/signup.js
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/signup.js	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/login/signup.js	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,124 @@
+Ext.onReady(function(){
+	var loginPanel = Ext.get("qo-login-panel");
+	var xy = loginPanel.getAlignToXY(document, 'c-c');
+	setPagePosition(loginPanel, xy[0], xy[1]);
+	
+	var loginBtn = Ext.get("submitBtn");
+	loginBtn.on({
+		'click': { fn: login }
+		, 'mouseover': { fn: function(){ loginBtn.addClass('qo-login-submit-over'); } }
+		, 'mouseout': { fn: function(){ loginBtn.removeClass('qo-login-submit-over'); } }
+	});
+	
+	function login(){
+		var firstNameField = Ext.get("field1");
+		var firstName = firstNameField.dom.value;
+		
+		var lastNameField = Ext.get("field2");
+		var lastName = lastNameField.dom.value;
+		
+		var emailField = Ext.get("field3");
+		var email = emailField.dom.value;
+		
+		var emailVerifyField = Ext.get("field4");
+		var emailVerify = emailVerifyField.dom.value;
+		
+		var commentsField = Ext.get("field5");
+		var comments = commentsField.dom.value;
+		
+		if(validate(firstName) === false){
+			alert("Your first name is required");
+			return false;
+		}
+		
+		if(validate(lastName) === false){
+			alert("Your last name is required");
+			return false;
+		}
+		
+		if(validate(email) === false){
+			alert("Your email address is required");
+			return false;
+		}
+		
+		if(validate(emailVerify) === false || (email !== emailVerify)){
+			alert("Please verify your email address again");
+			return false;
+		}
+		
+		loginPanel.mask('Please wait...', 'x-mask-loading');
+		
+		Ext.Ajax.request({
+			url: 'system/login/login.php'
+			, params: {
+				module: 'signup'
+				, first_name: firstName
+				, last_name: lastName
+				, email: email
+				, email_verify: emailVerify
+				, comments: comments
+			}
+			, success: function(o){
+				loginPanel.unmask();
+				
+				if(typeof o == 'object'){
+					var d = Ext.decode(o.responseText);
+					
+					if(typeof d == 'object'){
+						if(d.success == true){
+							firstNameField.dom.value = "";
+							lastNameField.dom.value = "";
+							emailField.dom.value = "";
+							emailVerifyField.dom.value = "";
+							commentsField.dom.value = "";
+							
+							alert('Your sign up request has been sent. \n\nYou will receive an email notification once we process your request.');
+						}else{
+							if(d.errors){
+								alert(d.errors[0].msg);
+							}else{
+								alert('Errors encountered on the server.');
+							}
+						}
+					}
+				}
+			}
+			, failure: function(){
+				loginPanel.unmask();
+				alert('Lost connection to server.');
+			}
+		});
+	}
+	
+	function setPagePosition(el, x, y){
+        if(x && typeof x[1] == 'number'){
+            y = x[1];
+            x = x[0];
+        }
+        el.pageX = x;
+        el.pageY = y;
+       	
+        if(x === undefined || y === undefined){ // cannot translate undefined points
+            return;
+        }
+        
+        if(y < 0){ y = 10; }
+        
+        var p = el.translatePoints(x, y);
+        el.setLocation(p.left, p.top);
+        return el;
+    }
+    
+    function showGroupField(){
+		Ext.get("field3-label").setDisplayed(true);
+		Ext.get("field3").setDisplayed(true);
+	}
+    
+    function validate(field){
+		if(field === ""){
+			//field.markInvalid();
+			return false;
+		}
+		return true;
+	}
+});
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/acc-win/acc-win-override.js
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/acc-win/acc-win-override.js	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/acc-win/acc-win-override.js	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,135 @@
+/* Override the module code here.
+ * This code will be Loaded on Demand.
+ */
+
+Ext.override(QoDesk.AccordionWindow, {
+	
+    createWindow : function(){
+    	var desktop = this.app.getDesktop();
+        var win = desktop.getWindow('acc-win');
+        if(!win){
+            win = desktop.createWindow({
+                id: 'acc-win',
+                title: 'Accordion Window',
+                width:250,
+                height:400,
+                iconCls: 'acc-icon',
+                shim:false,
+                animCollapse:false,
+                constrainHeader:true,
+                maximizable: false,
+                taskbuttonTooltip: '<b>Accordion Window</b><br />A window with an accordion layout',
+
+                tbar:[{
+                    tooltip:'<b>Rich Tooltips</b><br />Let your users know what they can do!',
+                    iconCls:'demo-acc-connect'
+                },'-',{
+                    tooltip:'Add a new user',
+                    iconCls:'demo-acc-user-add'
+                },' ',{
+                    tooltip:'Remove the selected user',
+                    iconCls:'demo-acc-user-delete'
+                }],
+
+                layout: 'accordion',
+                layoutConfig: {
+                    animate:false
+                },
+
+                items: [
+                    new Ext.tree.TreePanel({
+                        id:'im-tree',
+                        title: 'Online Users',
+                        loader: new Ext.tree.TreeLoader(),
+                        rootVisible:false,
+                        lines:false,
+                        autoScroll:true,
+                        useArrows: true,
+                        tools:[{
+                            id:'refresh',
+                            on:{
+                                click: function(){
+                                    var tree = Ext.getCmp('im-tree');
+                                    tree.body.mask('Loading', 'x-mask-loading');
+                                    tree.root.reload();
+                                    tree.root.collapse(true, false);
+                                    setTimeout(function(){ // mimic a server call
+                                        tree.body.unmask();
+                                        tree.root.expand(true, true);
+                                    }, 1000);
+                                }
+                            }
+                        }],
+                        root: new Ext.tree.AsyncTreeNode({
+                            text:'Online',
+                            children:[{
+                                text:'Friends',
+                                expanded:true,
+                                children:[{
+                                    text:'Jack',
+                                    iconCls:'user',
+                                    leaf:true
+                                },{
+                                    text:'Brian',
+                                    iconCls:'user',
+                                    leaf:true
+                                },{
+                                    text:'Jon',
+                                    iconCls:'user',
+                                    leaf:true
+                                },{
+                                    text:'Tim',
+                                    iconCls:'user',
+                                    leaf:true
+                                },{
+                                    text:'Nige',
+                                    iconCls:'user',
+                                    leaf:true
+                                },{
+                                    text:'Fred',
+                                    iconCls:'user',
+                                    leaf:true
+                                },{
+                                    text:'Bob',
+                                    iconCls:'user',
+                                    leaf:true
+                                }]
+                            },{
+                                text:'Family',
+                                expanded:true,
+                                children:[{
+                                    text:'Kelly',
+                                    iconCls:'user-girl',
+                                    leaf:true
+                                },{
+                                    text:'Sara',
+                                    iconCls:'user-girl',
+                                    leaf:true
+                                },{
+                                    text:'Zack',
+                                    iconCls:'user-kid',
+                                    leaf:true
+                                },{
+                                    text:'John',
+                                    iconCls:'user-kid',
+                                    leaf:true
+                                }]
+                            }]
+                        })
+                    }), {
+                        title: 'Settings',
+                        html:'<p>Something useful would be in here.</p>',
+                        autoScroll:true
+                    },{
+                        title: 'Even More Stuff',
+                        html : '<p>Something useful would be in here.</p>'
+                    },{
+                        title: 'My Stuff',
+                        html : '<p>Something useful would be in here.</p>'
+                    }
+                ]
+            });
+        }
+        win.show();
+    }
+});
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/acc-win/acc-win.css
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/acc-win/acc-win.css	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/acc-win/acc-win.css	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,16 @@
+.acc-icon {
+	background-image: url(images/im16x16.gif) !important;
+}
+.demo-acc-shortcut img {
+    background-image: url(images/im48x48.png);
+    filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='system/modules/acc-win/images/im48x48.png', sizingMethod='scale');
+}
+.demo-acc-connect {
+	background-image: url(images/connect.png) !important;
+}
+.demo-acc-user-add {
+	background-image: url(images/user_add.png) !important;
+}
+.demo-acc-user-delete {
+	background-image: url(images/user_delete.png) !important;
+}
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/acc-win/acc-win.js
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/acc-win/acc-win.js	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/acc-win/acc-win.js	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,19 @@
+/* This code defines the module and will be loaded at start up.
+ * 
+ * When the user selects to open this module, the override code will
+ * be loaded to provide the functionality.
+ * 
+ * Allows for 'Module on Demand'.
+ */
+
+QoDesk.AccordionWindow = Ext.extend(Ext.app.Module, {
+	moduleType : 'demo',
+	moduleId : 'demo-acc',
+	menuPath : 'StartMenu',
+	launcher : {
+		iconCls: 'acc-icon',
+		shortcutIconCls: 'demo-acc-shortcut',
+		text: 'Accordion Window',
+		tooltip: '<b>Accordion Window</b><br />A window with an accordion layout'
+	}
+});
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/acc-win/images/connect.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/acc-win/images/connect.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/acc-win/images/im16x16.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/acc-win/images/im16x16.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/acc-win/images/im48x48.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/acc-win/images/im48x48.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/acc-win/images/user_add.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/acc-win/images/user_add.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/acc-win/images/user_delete.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/acc-win/images/user_delete.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/bogus/bogus-win/bogus-win-override.js
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/bogus/bogus-win/bogus-win-override.js	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/bogus/bogus-win/bogus-win-override.js	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,177 @@
+Ext.override(QoDesk.BogusWindow, {
+	
+	detailModule : null,
+	
+	init : function(){
+		this.detailModule = new BogusDetailModule();
+	},
+	
+	createWindow : function(){
+		var desktop = this.app.getDesktop();
+		var win = desktop.getWindow('bogus-win');
+		
+		if(!win){
+            win = desktop.createWindow({
+                autoScroll: true,
+                id: 'bogus-win',
+                title: 'Bogus Window',
+                width:640,
+                height:480,
+                iconCls: 'bogus-icon',
+                items: new QoDesk.BogusWindow.NavPanel({owner: this, id: 'nav-panel'}),
+                shim:false,
+                animCollapse:false,
+                constrainHeader:true,
+                maximizable: false,
+                tbar: [{
+                	handler: this.showDialog,
+                	scope: this,
+                	text: 'Open Dialog'
+                }],
+                taskbuttonTooltip: '<b>Bogus Window</b><br />A bogus window'
+            });
+        }
+        
+        win.show();
+    },
+    
+    openDetail : function(id){
+		this.detailModule.createWindow(this.app, id);
+    },
+    
+    showDialog : function(){
+    	var winManager = this.app.getDesktop().getManager();
+    	
+    	if(!this.dialog){
+            this.dialog = new Ext.Window({
+            	bodyStyle:'padding:10px',
+                layout:'fit',
+                width:500,
+                height:300,
+                closeAction:'hide',
+                plain: true,
+                html: 'Bogus dialog window',
+                buttons: [{
+                    text:'Submit',
+                    disabled:true
+                },{
+                    text: 'Close',
+                    handler: function(){
+                        this.dialog.hide();
+                    },
+                    scope: this
+                }],
+                manager: winManager,
+                modal: true
+            });
+        }
+        this.dialog.show();
+    }
+});
+
+
+
+QoDesk.BogusWindow.NavPanel = function(config){
+	this.owner = config.owner;
+	
+	QoDesk.BogusWindow.NavPanel.superclass.constructor.call(this, {
+		autoScroll: true,
+		bodyStyle: 'padding:15px',
+		border: false,
+		html: '<ul id="bogus-nav-panel"> \
+				<li> \
+					<a id="openDetailOne" href="#">Detail 1</a><br /> \
+					<span>Open detail window one.</span> \
+				</li> \
+				<li> \
+					<a id="openDetailTwo" href="#">Detail 2</a><br /> \
+					<span>Open detail window two.</span> \
+				</li> \
+				<li> \
+					<a id="openDetailThree" href="#">Detail 3</a><br /> \
+					<span>Open detail window three.</span> \
+				</li> \
+			</ul>',
+		id: config.id
+	});
+	
+	this.actions = {
+		'openDetailOne' : function(owner){
+			owner.openDetail(1);
+		},
+		
+		'openDetailTwo' : function(owner){
+			owner.openDetail(2);
+		},
+		
+		'openDetailThree' : function(owner){
+	   		owner.openDetail(3);
+	   	}
+	};
+};
+
+Ext.extend(QoDesk.BogusWindow.NavPanel, Ext.Panel, {
+	afterRender : function(){
+		this.body.on({
+			'mousedown': {
+				fn: this.doAction,
+				scope: this,
+				delegate: 'a'
+			},
+			'click': {
+				fn: Ext.emptyFn,
+				scope: null,
+				delegate: 'a',
+				preventDefault: true
+			}
+		});
+		
+		QoDesk.BogusWindow.NavPanel.superclass.afterRender.call(this); // do sizing calcs last
+	},
+	
+	doAction : function(e, t){
+    	e.stopEvent();
+    	this.actions[t.id](this.owner);  // pass owner for scope
+    }
+});
+
+
+
+BogusDetailModule = Ext.extend(Ext.app.Module, {
+
+	moduleType : 'demo',
+	moduleId : 'demo-bogus-detail',
+	
+	init : function(){
+		this.launcher = {
+			handler: this.createWindow,
+			iconCls: 'bogus-icon',
+			scope: this,
+			shortcutIconCls: 'demo-bogus-shortcut',
+			text: 'Bogus Detail Window',
+			tooltip: '<b>Bogus Detail Window</b><br />A bogus detail window'
+		}
+	},
+
+	createWindow : function(app, id){
+		this.moduleId = 'demo-bogus-detail-'+id;
+		
+		var desktop = app.getDesktop();
+		var win = desktop.getWindow('bogus-detail'+id);
+		
+        if(!win){
+            win = desktop.createWindow({
+                id: 'bogus-detail'+id,
+                title: 'Detail Window '+id,
+                width: 540,
+                height: 380,
+                html : '<p>Something useful would be in here.</p>',
+                iconCls: 'bogus-icon',
+                shim:false,
+                animCollapse:false,
+                constrainHeader:true
+            });
+        }
+        win.show();
+    }
+});
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/bogus/bogus-win/bogus-win.css
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/bogus/bogus-win/bogus-win.css	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/bogus/bogus-win/bogus-win.css	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,10 @@
+.bogus-icon {
+	background-image: url(images/bogus16x16.gif) !important;
+}
+.demo-bogus-shortcut img {
+    background-image: url(images/bogus48x48.png);
+    filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='system/modules/bogus/bogus-win/images/bogus48x48.png', sizingMethod='scale');
+}
+#bogus-nav-panel li {
+	margin-bottom:5px;
+}
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/bogus/bogus-win/bogus-win.js
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/bogus/bogus-win/bogus-win.js	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/bogus/bogus-win/bogus-win.js	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,19 @@
+/* This code defines the module and will be loaded at start up.
+ * 
+ * When the user selects to open this module, the override code will
+ * be loaded to provide the functionality.
+ * 
+ * Allows for 'Module on Demand'.
+ */
+
+QoDesk.BogusWindow = Ext.extend(Ext.app.Module, {
+	moduleType : 'demo',
+	moduleId : 'demo-bogus',
+	menuPath : 'StartMenu/Bogus Menu/Bogus Sub Menu',
+	launcher : {
+		iconCls: 'bogus-icon',
+		shortcutIconCls: 'demo-bogus-shortcut',
+		text: 'Bogus Window',
+		tooltip: '<b>Bogus Window</b><br />A bogus window'
+	}
+});
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/bogus/bogus-win/images/bogus16x16.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/bogus/bogus-win/images/bogus16x16.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/bogus/bogus-win/images/bogus48x48.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/bogus/bogus-win/images/bogus48x48.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/grid-win/grid-win-override.js
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/grid-win/grid-win-override.js	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/grid-win/grid-win-override.js	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,157 @@
+/* Override the module code here.
+ * This code will be Loaded on Demand.
+ */
+
+Ext.override(QoDesk.GridWindow, {
+
+	// Array data for the grid
+	dummyData : [
+	    ['3m Co',71.72,0.02,0.03,'9/1 12:00am'],
+	    ['Alcoa Inc',29.01,0.42,1.47,'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'],
+	    ['Caterpillar Inc.',67.27,0.92,1.39,'9/1 12:00am'],
+	    ['Citigroup, Inc.',49.37,0.02,0.04,'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'],
+	    ['Johnson & Johnson',64.72,0.06,0.09,'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'],
+	    ['The Coca-Cola Company',45.07,0.26,0.58,'9/1 12:00am'],
+	    ['The Procter & Gamble Company',61.91,0.01,0.02,'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']
+	],
+
+    createWindow : function(){
+        var desktop = this.app.getDesktop();
+        var win = desktop.getWindow('grid-win');
+        
+        if(!win){        	
+        	var sm = new Ext.grid.RowSelectionModel({singleSelect:true});
+        	
+        	var grid = new Ext.grid.GridPanel({
+				//autoExpandColumn:'company',
+				border:false,
+				ds: new Ext.data.Store({
+					reader: new Ext.data.ArrayReader({}, [
+						{name: 'company'},
+						{name: 'price', type: 'float'},
+						{name: 'change', type: 'float'},
+						{name: 'pctChange', type: 'float'}
+					]),
+					data: this.dummyData
+				}),
+				cm: new Ext.grid.ColumnModel([
+					new Ext.grid.RowNumberer(),
+					{header: "Company", width: 120, sortable: true, dataIndex: 'company'},
+					{header: "Price", width: 70, sortable: true, renderer: Ext.util.Format.usMoney, dataIndex: 'price'},
+					{header: "Change", width: 70, sortable: true, dataIndex: 'change'},
+					{header: "% Change", width: 70, sortable: true, dataIndex: 'pctChange'}
+				]),
+				shadow: false,
+				shadowOffset: 0,
+				sm: sm,
+				tbar: [{
+					text:'Add Something',
+					tooltip:'Add a new row',
+					iconCls:'demo-grid-add'
+					}, '-', {
+					text:'Options',
+					tooltip:'Your options',
+					iconCls:'demo-grid-option'
+					},'-',{
+					text:'Remove Something',
+					tooltip:'Remove the selected item',
+					iconCls:'demo-grid-remove'
+				}],
+				viewConfig: {
+					forceFit:true
+				}
+			});
+			
+			// example of how to open another module on rowselect
+			sm.on('rowselect',function(){
+				//var tabWin = this.app.getModule('demo-tabs');
+				//if(tabWin){
+				//	tabWin.launcher.handler.call(this.scope || this);
+				//}
+			}, this);
+			
+            win = desktop.createWindow({
+                id: 'grid-win',
+                title:'Grid Window',
+                width:740,
+                height:480,
+                iconCls: 'grid-icon',
+                shim:false,
+                animCollapse:false,
+                constrainHeader:true,
+				layout: 'fit',
+                items: grid,
+                taskbuttonTooltip: '<b>Grid Window</b><br />A window with a grid',
+                tools: [
+					{
+						id: 'refresh',
+						handler: Ext.emptyFn,
+						scope: this
+					}
+				]
+            });
+            
+            // begin: modify top toolbar
+	        var tb = grid.getTopToolbar();
+				
+			// example of getting a reference to another module's launcher object
+	        var tabWin;// = this.app.getModule('demo-tabs');
+	        
+			if(tabWin){
+				var c = tabWin.launcher;
+				
+				tb.add({
+					// example button to open another module
+					text: 'Open Tab Window',
+					handler: c.handler,
+					scope: c.scope,
+					iconCls: c.iconCls
+				});
+			}
+				
+			tb.add({
+				text: 'Toggle My Taskbutton Text/Icon',
+				handler: this.updateTaskButton,
+				scope: this
+			});
+	        // end: modify top toolbar
+	        
+	        // could modify this windows taskbutton tooltip here (defaults to win.title)
+	        //win.taskButton.setTooltip('Grid Window');
+        }
+        
+        win.show();
+    },
+    
+    updateTaskButton : function(){
+    	var desktop = this.app.getDesktop(),
+    		win = desktop.getWindow('grid-win'),
+    		btn = win.taskButton;
+    	
+    	if(btn.getText() === 'Toggled'){
+    		btn.setText('Grid Window');
+    		// can pass in an object
+    		btn.setTooltip({title: 'Grid Window', text: 'A window with a grid'});
+    		// or could pass in a string
+    		//btn.setTooltip('Grid Window');
+    		btn.setIconClass('grid-icon');
+    	}else{
+    		btn.setText('Toggled');
+    		btn.setTooltip({title: 'Toggled', text: 'You have toogled me'});
+    		btn.setIconClass('bogus');
+    	}
+    }
+});
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/grid-win/grid-win.css
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/grid-win/grid-win.css	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/grid-win/grid-win.css	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,16 @@
+.grid-icon {
+    background-image:url(images/grid16x16.gif) !important;
+}
+.demo-grid-shortcut img {
+    background-image: url(images/grid48x48.png);
+    filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='system/modules/grid-win/images/grid48x48.png', sizingMethod='scale');
+}
+.demo-grid-option {
+	background-image: url(images/plugin.gif) !important;
+}
+.demo-grid-add {
+	background-image: url(images/add.gif) !important;
+}
+.demo-grid-remove {
+	background-image: url(images/delete.gif) !important;
+}
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/grid-win/grid-win.js
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/grid-win/grid-win.js	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/grid-win/grid-win.js	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,19 @@
+/* This code defines the module and will be loaded at start up.
+ * 
+ * When the user selects to open this module, the override code will
+ * be loaded to provide the functionality.
+ * 
+ * Allows for 'Module on Demand'.
+ */
+
+QoDesk.GridWindow = Ext.extend(Ext.app.Module, {
+	moduleType : 'demo',
+    moduleId : 'demo-grid',
+    menuPath : 'StartMenu',
+	launcher : {
+        iconCls: 'grid-icon',
+        shortcutIconCls: 'demo-grid-shortcut',
+        text: 'Grid Window',
+        tooltip: '<b>Grid Window</b><br />A window with a grid'
+    }
+});
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/grid-win/images/add.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/grid-win/images/add.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/grid-win/images/delete.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/grid-win/images/delete.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/grid-win/images/grid16x16.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/grid-win/images/grid16x16.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/grid-win/images/grid48x48.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/grid-win/images/grid48x48.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/grid-win/images/plugin.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/grid-win/images/plugin.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/layout-win/images/layout16x16.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/layout-win/images/layout16x16.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/layout-win/images/layout48x48.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/layout-win/images/layout48x48.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/layout-win/layout-win-override.js
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/layout-win/layout-win-override.js	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/layout-win/layout-win-override.js	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,85 @@
+/*
+ * qWikiOffice Desktop 0.7
+ * Copyright(c) 2007-2008, Integrated Technologies, Inc.
+ * licensing@xxxxxxxxxxxxxxx
+ * 
+ * http://www.qwikioffice.com/license
+ */
+
+/* Override the module code here.
+ * This code will be Loaded on Demand.
+ */
+
+Ext.override(QoDesk.LayoutWindow, {
+	
+	createWindow : function(){
+		var desktop = this.app.getDesktop();
+		var win = desktop.getWindow('layout-win');
+		if(!win){
+			var winWidth = desktop.getWinWidth() / 1.1;
+			var winHeight = desktop.getWinHeight() / 1.1;
+			
+			win = desktop.createWindow({
+				id: 'layout-win',
+				title:'Layout Window',
+				width:winWidth,
+				height:winHeight,
+				x:desktop.getWinX(winWidth),
+				y:desktop.getWinY(winHeight),
+				iconCls: 'layout-icon',
+				shim:false,
+				animCollapse:false,
+				constrainHeader:true,
+				minimizable:true,
+    			maximizable:true,
+
+				layout: 'border',
+				tbar:[{
+					text: 'Button1'
+				},{
+					text: 'Button2'
+				}],
+				items:[/*{
+					region:'north',
+					border:false,
+					elements:'body',
+					height:30
+				},*/{
+					region:'west',
+					autoScroll:true,
+					collapsible:true,
+					cmargins:'0 0 0 0',
+					margins:'0 0 0 0',
+					split:true,
+					title:'Panel',
+					width:parseFloat(winWidth*0.3) < 201 ? parseFloat(winWidth*0.3) : 200
+				},{
+					region:'center',
+					border:false,
+					layout:'border',
+					margins:'0 0 0 0',
+					items:[{
+						region:'north',
+						elements:'body',
+						title:'Panel',
+						height:winHeight*0.3,
+						split:true
+					},{
+						autoScroll:true,
+						elements:'body',
+						region:'center',
+						id:'Details',
+						title:'Preview Panel'
+					}]
+				}/*,{
+					region:'south',
+					border:false,
+					elements:'body',
+					height:25
+				}*/],
+				taskbuttonTooltip: '<b>Layout Window</b><br />A window with a layout'
+			});
+		}
+		win.show();
+	}
+});
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/layout-win/layout-win.css
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/layout-win/layout-win.css	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/layout-win/layout-win.css	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,15 @@
+/*
+ * qWikiOffice Desktop 0.7
+ * Copyright(c) 2007-2008, Integrated Technologies, Inc.
+ * licensing@xxxxxxxxxxxxxxx
+ * 
+ * http://www.qwikioffice.com/license
+ */
+
+.layout-icon {
+	background-image: url(images/layout16x16.gif) !important;
+}
+.demo-layout-shortcut img {
+    background-image: url(images/layout48x48.png);
+    filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='system/modules/layout-win/images/layout48x48.png', sizingMethod='scale');
+}
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/layout-win/layout-win.js
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/layout-win/layout-win.js	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/layout-win/layout-win.js	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,19 @@
+/* This code will be loaded at start up.
+ * 
+ * When the user selects to open this module, it's override code will
+ * be loaded to provide the functionality.
+ * 
+ * Allows for 'Module on Demand'.
+ */
+
+QoDesk.LayoutWindow = Ext.extend(Ext.app.Module, {
+	moduleType : 'demo',
+	moduleId : 'demo-layout',
+	menuPath : 'StartMenu/Bogus Menu',
+	launcher : {
+		iconCls: 'layout-icon',
+		shortcutIconCls: 'demo-layout-shortcut',
+		text: 'Layout Window',
+		tooltip: '<b>Layout Window</b><br />A window with a layout'
+	}
+});
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/images/appearance-icon.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/images/appearance-icon.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/images/autorun-icon.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/images/autorun-icon.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/images/bg-center-icon.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/images/bg-center-icon.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/images/bg-center-icon.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/images/bg-center-icon.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/images/bg-tile-icon.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/images/bg-tile-icon.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/images/bg-tile-icon.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/images/bg-tile-icon.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/images/form-collapse-icon.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/images/form-collapse-icon.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/images/percent-icon.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/images/percent-icon.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/images/pref-icon.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/images/pref-icon.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/images/pref-shortcut-icon.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/images/pref-shortcut-icon.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/images/quickstart-icon.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/images/quickstart-icon.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/images/quickstart-icon.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/images/quickstart-icon.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/images/wallpaper-icon.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/images/wallpaper-icon.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/images/wallpaper-icon.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/images/wallpaper-icon.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/qo-preferences-override.js
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/qo-preferences-override.js	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/qo-preferences-override.js	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,1127 @@
+/*
+ * qWikiOffice Desktop 0.8.1
+ * Copyright(c) 2007-2008, Integrated Technologies, Inc.
+ * licensing@xxxxxxxxxxxxxxx
+ * 
+ * http://www.qwikioffice.com/license
+ */
+
+Ext.override(QoDesk.QoPreferences, {
+
+	actions : null,
+	cards : [
+		'pref-win-card-1', // navigation
+		'pref-win-card-2', // quickstart
+		'pref-win-card-3', // color and appearance
+		'pref-win-card-4', // wallpaper
+		'pref-win-card-5', // autorun
+		'pref-win-card-6'  // shortcuts
+	],
+	contentPanel : null,
+	cardHistory : [
+		'pref-win-card-1' // default
+	],
+	layout: null,
+	win : null,
+
+    createWindow : function(){
+        var desktop = this.app.getDesktop();
+        var desktop2 = QoDesk.App.getDesktop();
+        var test = (desktop == desktop2);//true
+        this.win = desktop.getWindow(this.moduleId);
+        
+        if(!this.win){
+        	var winWidth = 610;
+			var winHeight = 460;
+			
+			this.contentPanel = new Ext.Panel({
+				activeItem: 0,
+                border: false,
+				id: 'pref-win-content',
+				items: [
+                	new QoDesk.QoPreferences.NavPanel({owner: this, id: 'pref-win-card-1'}),
+                	new QoDesk.QoPreferences.Shortcuts({owner: this, id: 'pref-win-card-6'}),
+                	new QoDesk.QoPreferences.AutoRun({owner: this, id: 'pref-win-card-5'}),
+                	new QoDesk.QoPreferences.QuickStart({owner: this, id: 'pref-win-card-2'}),
+                	new QoDesk.QoPreferences.Appearance({owner: this, id: 'pref-win-card-3'}),
+                	new QoDesk.QoPreferences.Background({owner: this, id: 'pref-win-card-4'})
+                ],
+				layout: 'card',
+				tbar: [{
+					disabled: true,
+                	handler: this.navHandler.createDelegate(this, [-1]),
+                	id: 'back',
+                	scope: this,
+                	text: 'Back'
+                },{
+                	disabled: true,
+                	handler: this.navHandler.createDelegate(this, [1]),
+                	id: 'next',
+                	scope: this,
+                	text: 'Next'
+                }]
+			});
+			
+            this.win = desktop.createWindow({
+            	animCollapse: false,
+                constrainHeader: true,
+                id: this.moduleId,
+                height: winHeight,
+                iconCls: 'pref-icon',
+                items: this.contentPanel,
+                layout: 'fit',
+                shim: false,
+                taskbuttonTooltip: '<b>Preferences</b><br />Allows you to modify your desktop',
+                title: 'Preferences',
+                width: winWidth
+            });
+            
+			this.layout = this.contentPanel.getLayout();
+        }
+        
+        this.win.show();
+    },
+    
+    handleButtonState : function(){
+    	var cards = this.cardHistory, activeId = this.layout.activeItem.id,
+    		items = this.contentPanel.getTopToolbar().items, back = items.get(0), next = items.get(1);
+    	
+    	for(var i = 0, len = cards.length; i < len; i++){
+    		if(cards[i] === activeId){
+    			if(i <= 0){
+    				back.disable();
+    				next.enable();
+    			}else if(i >= (len-1)){
+    				back.enable();
+    				next.disable();
+    			}else{
+    				back.enable();
+    				next.enable();
+    			}
+    			break;
+    		}
+    	}
+    },
+    
+    navHandler : function(index){
+    	var cards = this.cardHistory,
+    		activeId = this.layout.activeItem.id,
+    		nextId;
+    	
+    	for(var i = 0, len = cards.length; i < len; i++){
+    		if(cards[i] === activeId){
+    			nextId = cards[i+index];
+    			break;
+    		}
+    	}
+    	
+    	this.layout.setActiveItem(nextId);
+    	this.handleButtonState();
+    },
+    
+    save : function(params){    	
+    	var desktop = this.app.getDesktop();
+    	var notifyWin = desktop.showNotification({
+			html: 'Saving your data...'
+			, title: 'Please wait'
+		});
+	    var callback = params.callback || null;
+		var callbackScope = params.callbackScope || this;
+		
+		params.moduleId = this.moduleId;
+		
+	    Ext.Ajax.request({
+			url: this.app.connection,
+			/* Could also pass moduleId and action in querystring like this
+			 * instead of in the params config option.
+			 *
+			 * url: this.app.connection+'?moduleId='+this.id+'&action=myAction', */
+			params: params,
+			success: function(o){
+				if(o && o.responseText && Ext.decode(o.responseText).success){
+					saveComplete('Finished', 'Save complete.');
+				}else{
+					saveComplete('Error', 'Errors encountered on the server.');
+				}
+			},
+			failure: function(){
+				saveComplete('Error', 'Lost connection to server.');
+			},
+			scope: this
+		});
+		
+		function saveComplete(title, msg){
+			notifyWin.setIconClass('x-icon-done');
+			notifyWin.setTitle(title);
+			notifyWin.setMessage(msg);
+			desktop.hideNotification(notifyWin);
+			
+			if(callback){
+				callback.call(callbackScope);
+			}
+		}
+	},
+    
+    viewCard : function(card){
+		this.layout.setActiveItem(card);
+	    if(this.cardHistory.length > 1){
+	    	this.cardHistory.pop();
+	    }
+	    this.cardHistory.push(card);
+	    this.handleButtonState();
+	}
+});
+
+
+
+QoDesk.QoPreferences.NavPanel = function(config){
+	this.owner = config.owner;
+	
+	QoDesk.QoPreferences.NavPanel.superclass.constructor.call(this, {
+		autoScroll: true,
+		bodyStyle: 'padding:15px',
+		border: false,
+		html: '<ul id="pref-nav-panel"> \
+				<li> \
+					<img src="'+Ext.BLANK_IMAGE_URL+'" class="icon-pref-autorun"/> \
+					<a id="viewShortcuts" href="#">Shortcuts</a><br /> \
+					<span>Choose which applications appear in your shortcuts.</span> \
+				</li> \
+				<li> \
+					<img src="'+Ext.BLANK_IMAGE_URL+'" class="icon-pref-autorun"/> \
+					<a id="viewAutoRun" href="#">Auto Run Apps</a><br /> \
+					<span>Choose which applications open automatically once logged in.</span> \
+				</li> \
+				<li> \
+					<img src="'+Ext.BLANK_IMAGE_URL+'" class="icon-pref-quickstart"/> \
+					<a id="viewQuickstart" href="#">Quick Start Apps</a><br /> \
+					<span>Choose which applications appear in your Quick Start panel.</span> \
+				</li> \
+				<li> \
+					<img src="'+Ext.BLANK_IMAGE_URL+'" class="icon-pref-appearance"/> \
+					<a id="viewAppearance" href="#">Window Color and Appearance</a><br /> \
+					<span>Fine tune window color and style of your windows.</span> \
+				</li> \
+				<li> \
+					<img src="'+Ext.BLANK_IMAGE_URL+'" class="icon-pref-wallpaper"/> \
+					<a id="viewWallpapers" href="#">Desktop Background</a><br /> \
+					<span>Choose from available wallpapers or colors to decorate you desktop.</span> \
+				</li> \
+			</ul>',
+		id: config.id
+	});
+	
+	this.actions = {
+		'viewShortcuts' : function(owner){
+			owner.viewCard('pref-win-card-6');
+		},
+		
+		'viewAutoRun' : function(owner){
+			owner.viewCard('pref-win-card-5');
+		},
+		
+		'viewQuickstart' : function(owner){
+	   		owner.viewCard('pref-win-card-2');
+	   	},
+	   	
+	   	'viewAppearance' : function(owner){
+	   		owner.viewCard('pref-win-card-3');
+	   	},
+	   	
+	   	'viewWallpapers' : function(owner){
+	   		owner.viewCard('pref-win-card-4');
+	   	}
+	};
+};
+
+Ext.extend(QoDesk.QoPreferences.NavPanel, Ext.Panel, {
+	afterRender : function(){
+		this.body.on({
+			'mousedown': {
+				fn: this.doAction,
+				scope: this,
+				delegate: 'a'
+			},
+			'click': {
+				fn: Ext.emptyFn,
+				scope: null,
+				delegate: 'a',
+				preventDefault: true
+			}
+		});
+		
+		QoDesk.QoPreferences.NavPanel.superclass.afterRender.call(this); // do sizing calcs last
+	},
+	
+	doAction : function(e, t){
+    	e.stopEvent();
+    	this.actions[t.id](this.owner);  // pass owner for scope
+    }
+});
+
+
+
+QoDesk.QoPreferences.AutoRun = function(config){
+	this.owner = config.owner;
+	this.app = this.owner.app;
+	
+	var ms = this.app.modules,
+		ids = this.app.launchers.autorun,
+		nodes = expandNodes(ms, ids);
+				
+	QoDesk.QoPreferences.AutoRun.superclass.constructor.call(this, {
+		autoScroll: true,
+		bodyStyle: 'padding:10px',
+		border: false,
+		buttons: [{
+			disabled: this.app.isAllowedTo('saveAutorun', this.owner.moduleId) ? false : true,
+			handler: onSave,
+			scope: this,
+			text: 'Save'
+		},{
+			handler: onClose,
+			scope: this,
+			text: 'Close'
+		}],
+		cls: 'pref-card pref-check-tree',
+		id: config.id,
+		lines: false,
+		listeners: {
+			'checkchange': {
+				fn: onCheckChange,
+				scope: this
+			}
+		},
+		loader: new Ext.tree.TreeLoader(),
+		rootVisible: false,
+		root: new Ext.tree.AsyncTreeNode({
+			text: 'Auto Run Apps',
+			children: nodes
+		}),
+		title: 'Auto Run Apps'
+	});
+	
+	new Ext.tree.TreeSorter(this, {dir: "asc"});
+			
+	function expandNodes(ms, ids){
+		var nodes = [];
+		
+		for(var i = 0, len = ms.length; i < len; i++){
+			if(ms[i].moduleType === 'menu'){
+				/* nodes.push({
+					leaf: false,
+					text: ms[i].launcher.text,
+					children: this.expandNodes(o.menu.items, ids)
+				}); */
+			}else{
+				nodes.push({
+		           	checked: isChecked(ms[i].moduleId, ids) ? true : false,
+		           	iconCls: ms[i].launcher.iconCls,
+		           	id: ms[i].moduleId,
+		           	leaf: true,
+		           	selected: true,
+		           	text: ms[i].launcher.text
+				});
+			}
+		}
+		
+		return nodes;
+	}
+	
+	function isChecked(id, ids){
+		for(var i = 0, len = ids.length; i < len; i++){
+			if(id == ids[i]){
+				return true;
+			}
+		}
+	}
+
+	function onCheckChange(node, checked){
+		if(node.leaf && node.id){
+    		if(checked){
+				this.app.desktop.addAutoRun(node.id, true);
+    		}else{
+				this.app.desktop.removeAutoRun(node.id, true);
+    		}
+    	}
+    	node.ownerTree.selModel.select(node);
+    }
+    
+    function onClose(){
+		this.owner.win.close();
+	}
+	
+    function onSave(){
+    	this.buttons[0].disable();
+    	this.owner.save({
+    		action: 'saveAutorun'
+    		, callback: function(){
+    			this.buttons[0].enable();
+    		}
+    		, callbackScope: this
+    		, ids: Ext.encode(this.app.launchers.autorun)
+    	});
+    }
+};
+
+Ext.extend(QoDesk.QoPreferences.AutoRun, Ext.tree.TreePanel);
+
+
+
+QoDesk.QoPreferences.Shortcuts = function(config){
+	this.owner = config.owner;
+	this.app = this.owner.app;
+	
+	var ms = this.app.modules,
+		ids = this.app.launchers.shortcut,
+		nodes = expandNodes(ms, ids);
+	
+	QoDesk.QoPreferences.Shortcuts.superclass.constructor.call(this, {
+		autoScroll: true,
+		bodyStyle: 'padding:10px',
+		border: false,
+		buttons: [{
+			disabled: this.app.isAllowedTo('saveShortcut', this.owner.moduleId) ? false : true,
+			handler: onSave,
+			scope: this,
+			text: 'Save'
+		},{
+			handler: onClose,
+			scope: this,
+			text: 'Close'
+		}],
+		cls: 'pref-card pref-check-tree',
+		id: config.id,
+		lines: false,
+		listeners: {
+			'checkchange': {
+				fn: onCheckChange,
+				scope: this
+			}
+		},
+		loader: new Ext.tree.TreeLoader(),
+		rootVisible: false,
+		root: new Ext.tree.AsyncTreeNode({
+			text: 'Shortcuts',
+			children: nodes
+		}),
+		title: 'Shortcuts'
+	});
+	
+	new Ext.tree.TreeSorter(this, {dir: "asc"});
+			
+	function expandNodes(ms, ids){
+		var nodes = [];
+		
+		for(var i = 0, len = ms.length; i < len; i++){
+			if(ms[i].moduleType === 'menu'){
+				/* nodes.push({
+					leaf: false,
+					text: ms[i].launcher.text,
+					children: this.expandNodes(o.menu.items, ids)
+				}); */
+			}else{
+				nodes.push({
+		           	checked: isChecked(ms[i].moduleId, ids) ? true : false,
+		           	iconCls: ms[i].launcher.iconCls,
+		           	id: ms[i].moduleId,
+		           	leaf: true,
+		           	selected: true,
+		           	text: ms[i].launcher.text
+				});
+			}
+		}
+		
+		return nodes;
+	}
+	
+	function isChecked(id, ids){
+		for(var i = 0, len = ids.length; i < len; i++){
+			if(id == ids[i]){
+				return true;
+			}
+		}
+	}
+
+	function onCheckChange(node, checked){
+		if(node.leaf && node.id){
+    		if(checked){
+				this.app.desktop.addShortcut(node.id, true);
+    		}else{
+				this.app.desktop.removeShortcut(node.id, true);
+    		}
+    	}
+    	node.ownerTree.selModel.select(node);
+    }
+    
+    function onClose(){
+		this.owner.win.close();
+	}
+	
+    function onSave(){
+    	this.buttons[0].disable();
+    	this.owner.save({
+    		action: 'saveShortcut'
+    		, callback: function(){
+    			this.buttons[0].enable();
+    		}
+    		, callbackScope: this
+    		, ids: Ext.encode(this.app.launchers.shortcut)
+    	});
+    }
+};
+
+Ext.extend(QoDesk.QoPreferences.Shortcuts, Ext.tree.TreePanel);
+
+
+
+QoDesk.QoPreferences.QuickStart = function(config){
+	this.owner = config.owner;
+	this.app = this.owner.app;
+	
+	var ms = this.app.modules,
+		ids = this.app.launchers.quickstart,
+		nodes = expandNodes(ms, ids);
+				
+    QoDesk.QoPreferences.QuickStart.superclass.constructor.call(this, {
+    	autoScroll: true,
+		bodyStyle: 'padding:10px',
+		border: false,
+		buttons: [{
+			disabled: this.app.isAllowedTo('saveQuickstart', this.owner.moduleId) ? false : true,
+			handler: onSave,
+			scope: this,
+			text: 'Save'
+		},{
+			handler: onClose,
+			scope: this,
+			text: 'Close'
+		}],
+		cls: 'pref-card pref-check-tree',
+		id: config.id,
+		lines: false,
+		listeners: {
+			'checkchange': {
+				fn: onCheckChange,
+				scope: this
+			}
+		},
+		loader: new Ext.tree.TreeLoader(),
+		rootVisible: false,
+		root: new Ext.tree.AsyncTreeNode({
+			text: 'Quick Start Apps',
+			children: nodes
+		}),
+		title: 'Quick Start Apps'
+    });
+    
+    new Ext.tree.TreeSorter(this, {dir: "asc"});
+			
+	function expandNodes(ms, ids){
+		var nodes = [];
+		
+		for(var i = 0, len = ms.length; i < len; i++){
+			if(ms[i].moduleType === 'menu'){
+				/* nodes.push({
+					leaf: false,
+					text: ms[i].launcher.text,
+					children: this.expandNodes(o.menu.items, ids)
+				}); */
+			}else{
+				nodes.push({
+		           	checked: isChecked(ms[i].moduleId, ids) ? true : false,
+		           	iconCls: ms[i].launcher.iconCls,
+		           	id: ms[i].moduleId,
+		           	leaf: true,
+		           	selected: true,
+		           	text: ms[i].launcher.text
+				});
+			}
+		}
+		
+		return nodes;
+	}
+	
+	function isChecked(id, ids){
+		for(var i = 0, len = ids.length; i < len; i++){
+			if(id == ids[i]){
+				return true;
+			}
+		}
+	}
+	
+	function onCheckChange(node, checked){
+		if(node.leaf && node.id){
+    		if(checked){
+				this.app.desktop.addQuickStartButton(node.id, true);
+    		}else{
+				this.app.desktop.removeQuickStartButton(node.id, true);
+    		}
+    	}
+    	node.ownerTree.selModel.select(node);
+    }
+    
+    function onClose(){
+		this.owner.win.close();
+	}
+	
+    function onSave(){
+    	this.buttons[0].disable();
+    	this.owner.save({
+    		action: 'saveQuickstart'
+    		, callback: function(){
+    			this.buttons[0].enable();
+    		}
+    		, callbackScope: this
+    		, ids: Ext.encode(this.app.launchers.quickstart)
+    	});
+    }
+};
+
+Ext.extend(QoDesk.QoPreferences.QuickStart, Ext.tree.TreePanel);
+
+
+
+QoDesk.QoPreferences.Appearance = function(config){
+	this.owner = config.owner;
+	this.app = this.owner.app;
+	
+	var desktop = this.app.getDesktop();
+	
+	var store = new Ext.data.JsonStore({
+		baseParams: {
+			action: 'viewThemes',
+			moduleId: this.owner.moduleId
+		},
+		fields: ['id', 'name', 'pathtothumbnail', 'pathtofile'],
+		id: 'id',
+		root: 'images',
+		url: this.app.connection
+	});
+	
+	this.store = store;
+	
+	store.on('load', function(store, records){
+		if(records){
+			defaults.setTitle('Themes Available (' + records.length + ')');
+			
+			var id = this.app.styles.theme.id;
+			if(id){
+				view.select('theme-'+id);
+			}
+		}				
+	}, this);
+	
+	var tpl = new Ext.XTemplate(
+		'<tpl for=".">',
+			'<div class="pref-view-thumb-wrap" id="theme-{id}">',
+				'<div class="pref-view-thumb"><img src="{pathtothumbnail}" title="{name}" /></div>',
+			'<span>{shortName}</span></div>',
+		'</tpl>',
+		'<div class="x-clear"></div>'
+	);
+
+	var view = new Ext.DataView({
+		autoHeight:true,
+		cls: 'pref-thumnail-view',
+		emptyText: 'No themes to display',
+		itemSelector:'div.pref-view-thumb-wrap',
+		loadingText: 'loading...',
+		singleSelect: true,
+		overClass:'x-view-over',
+		prepareData: function(data){
+			data.shortName = Ext.util.Format.ellipsis(data.name, 17);
+			return data;
+		},
+		store: store,
+		tpl: tpl
+	});
+	view.on('selectionchange', onSelectionChange, this);
+	
+	var defaults = new Ext.Panel({
+		animCollapse: false,
+		baseCls:'collapse-group',
+		border: false,
+		cls: 'pref-thumbnail-viewer',
+		collapsible: true,
+		hideCollapseTool: true,
+		id: 'pref-theme-view',
+		items: view,
+		title: 'Default Themes',
+		titleCollapse: true
+	});
+	
+	var themes = new Ext.Panel({
+		autoScroll: true,
+		bodyStyle: 'padding:10px',
+		border: true,
+		cls: 'pref-card-subpanel',
+		id: 'themes',
+		items: defaults,
+		margins: '10 15 0 15',
+		region: 'center'
+	});
+	
+	this.slider = createSlider({
+		handler: new Ext.util.DelayedTask(updateTransparency, this)
+		, min: 0
+		, max: 100
+		, x: 15
+		, y: 35
+		, width: 100
+	});
+	
+	var formPanel = new Ext.FormPanel({
+		border: false,
+		height: 70,
+		items: [
+			{x: 15, y: 15, xtype: 'label', text: 'Taskbar Transparency'},
+			this.slider.slider,
+			this.slider.display
+		],
+		layout: 'absolute',
+		split: false,
+		region: 'south'
+	});
+	
+	QoDesk.QoPreferences.Appearance.superclass.constructor.call(this, {
+		border: false,
+		buttons: [{
+			disabled: this.app.isAllowedTo('saveAppearance', this.owner.moduleId) ? false : true,
+			handler: onSave,
+			scope: this,
+			text: 'Save'
+			},{
+			handler: onClose,
+			scope: this,
+			text: 'Close'
+		}],
+		cls: 'pref-card',
+		id: config.id,
+		items: [
+			themes,
+			formPanel
+		],
+		layout: 'border',
+		title: 'Window Color And Appearance'
+	});
+	
+	// private functions
+	function createSlider(config){
+		var handler = config.handler, min = config.min, max = config.max
+			, width = config.width || 100, x = config.x, y = config.y;
+
+		var slider = new Ext.Slider({
+			minValue: min
+			, maxValue: max
+			, width: width
+			, x: x
+			, y: y
+		});
+		
+		var display =  new Ext.form.NumberField({
+			cls: 'pref-percent-field'
+			, enableKeyEvents: true
+			, maxValue: max
+			, minValue: min
+			, width: 45
+			, x: x + width + 15
+			, y: y - 1
+		});
+			
+		function sliderHandler(slider){
+			var v = slider.getValue();
+			display.setValue(v);
+			handler.delay(100, null, null, [v]); // delayed task prevents IE bog
+		}
+		
+		slider.on({
+			'change': { fn: sliderHandler, scope: this }
+			, 'drag': { fn: sliderHandler, scope: this }
+		});
+		
+		display.on({
+			'keyup': {
+				fn: function(field){
+					var v = field.getValue();
+					if(v !== '' && !isNaN(v) && v >= field.minValue && v <= field.maxValue){
+						slider.setValue(v);
+					}
+				}
+				, buffer: 350
+				, scope: this
+			}
+		});
+
+		return { slider: slider, display: display }
+	}
+	
+	function onClose(){
+		this.owner.win.close();
+	}
+	
+	function onSave(){
+		var c = this.app.styles;
+		
+		this.buttons[0].disable();
+    	this.owner.save({
+    		action: 'saveAppearance'
+    		, callback: function(){
+    			this.buttons[0].enable();
+    		}
+    		, callbackScope: this
+    		, backgroundcolor: c.backgroundcolor
+    		, fontcolor: c.fontcolor
+    		, theme: c.theme.id
+    		, transparency: c.transparency
+    		, wallpaper: c.wallpaper.id
+    		, wallpaperposition: c.wallpaperposition
+    	});
+	}
+	
+	function onSelectionChange(view, sel){
+		if(sel.length > 0){
+			var cId = this.app.styles.theme.id,
+				r = view.getRecord(sel[0]),
+				d = r.data;
+			
+			if(parseInt(cId) !== parseInt(r.id)){
+				if(r && r.id && d.name && d.pathtofile){
+					desktop.setTheme({
+						id: r.id,
+						name: d.name,
+						pathtofile: d.pathtofile
+					});
+				}
+			}
+		}
+	}
+	
+	function updateTransparency(v){
+		desktop.setTransparency(v);
+	}
+};
+
+Ext.extend(QoDesk.QoPreferences.Appearance, Ext.Panel, {
+	afterRender : function(){
+		QoDesk.QoPreferences.Appearance.superclass.afterRender.call(this);
+		
+		this.on('show', this.loadStore, this, {single: true});
+	},
+	
+	loadStore : function(){
+		this.store.load();
+		this.slider.slider.setValue(this.app.styles.transparency);
+	}
+});
+
+
+
+QoDesk.QoPreferences.Background = function(config){
+	this.owner = config.owner;
+	this.app = this.owner.app;
+	
+	var desktop = this.app.getDesktop();
+	
+	var store = new Ext.data.JsonStore({
+		baseParams: {
+			action: 'viewWallpapers',
+			moduleId: this.owner.moduleId
+		},
+		fields: ['id', 'name', 'pathtothumbnail', 'pathtofile'],
+		id: 'id',
+		root: 'images',
+		url: this.app.connection
+	});
+	
+	this.store = store;
+	
+	store.on('load', function(store, records){
+		if(records){
+			defaults.setTitle('Default Wallpapers (' + records.length + ')');
+			
+			var id = this.app.styles.wallpaper.id;
+			if(id){
+				view.select('wallpaper-'+id);
+			}
+		}				
+	}, this);
+
+	var tpl = new Ext.XTemplate(
+		'<tpl for=".">',
+			'<div class="pref-view-thumb-wrap" id="wallpaper-{id}">',
+				'<div class="pref-view-thumb"><img src="{pathtothumbnail}" title="{name}" /></div>',
+			'<span>{shortName}</span></div>',
+		'</tpl>',
+		'<div class="x-clear"></div>'
+	);
+
+	var view = new Ext.DataView({
+		autoHeight:true,
+		cls: 'pref-thumnail-view',
+		emptyText: 'No wallpapers to display',
+		itemSelector:'div.pref-view-thumb-wrap',
+		loadingText: 'loading...',
+		singleSelect: true,
+		overClass:'x-view-over',
+		prepareData: function(data){
+			data.shortName = Ext.util.Format.ellipsis(data.name, 17);
+			return data;
+		},
+		store: store,
+		tpl: tpl
+	});
+	view.on('selectionchange', onSelectionChange, this);
+	
+	var defaults = new Ext.Panel({
+		animCollapse: false,
+		baseCls:'collapse-group',
+		border: false,
+		cls: 'pref-thumbnail-viewer',
+		collapsible: true,
+		hideCollapseTool: true,
+		id: 'pref-wallpaper-view',
+		items: view,
+		title: 'Default Wallpapers',
+		titleCollapse: true
+	});
+	
+	var wallpapers = new Ext.Panel({
+		autoScroll: true,
+		bodyStyle: 'padding:10px',
+		border: true,
+		cls: 'pref-card-subpanel',
+		id: 'wallpapers',
+		items: defaults,
+		margins: '10 15 0 15',
+		region: 'center'
+	});
+	
+	var wpp = this.app.styles.wallpaperposition;
+	var tileRadio = createRadio('tile', wpp == 'tile' ? true : false, 90, 40);
+	var centerRadio = createRadio('center', wpp == 'center' ? true : false, 200, 40);
+	
+	var position = new Ext.FormPanel({
+		border: false,
+		height: 140,
+		id: 'position',
+		items: [{
+				border: false,
+				items: {border: false, html:'How should the wallpaper be positioned?'},
+				x: 15,
+				y: 15
+			},{
+				border: false,
+				items: {border: false, html: '<img class="bg-pos-tile" src="'+Ext.BLANK_IMAGE_URL+'" width="64" height="44" border="0" alt="" />'},
+				x: 15,
+				y: 40
+			},
+				tileRadio,
+			{
+				border: false,
+				items: {border: false, html: '<img class="bg-pos-center" src="'+Ext.BLANK_IMAGE_URL+'" width="64" height="44" border="0" alt="" />'},
+				x: 125,
+				y: 40
+			},
+				centerRadio,
+			{
+				border: false,
+				items: {border: false, html:'Choose a background color'},
+				x: 245,
+				y: 15
+			},{
+				border: false,
+				/* items: new Ext.ColorPalette({
+					listeners: {
+						'select': {
+							fn: onColorSelect
+							, scope: this
+						}
+					}
+				}), */
+				items: new Ext.Button({
+					handler: onChangeBgColor,
+					//menu: new Ext.ux.menu.ColorMenu(),
+					scope: this,
+					text: 'Background color'
+				}),
+				x: 245,
+				y: 40
+			},{
+				border: false,
+				items: {border: false, html:'Choose a font color'},
+				x: 425,
+				y: 15
+			},{
+				border: false,
+				/* items: new Ext.ColorPalette({
+					listeners: {
+						'select': {
+							fn: onFontColorSelect
+							, scope: this
+						}
+					}
+				}), */
+				items: new Ext.Button({
+					handler: onChangeFontColor,
+					scope: this,
+					text: 'Background color'
+				}),
+				x: 425,
+				y: 40
+				
+		}],
+		layout: 'absolute',
+		region: 'south',
+		split: false
+	});
+
+	QoDesk.QoPreferences.Background.superclass.constructor.call(this, {
+		border: false,
+		buttons: [{
+			disabled: this.app.isAllowedTo('saveBackground', this.owner.moduleId) ? false : true,
+			handler: onSave,
+			scope: this,
+			text: 'Save'
+			},{
+			handler: onClose,
+			scope: this,
+			text: 'Close'
+		}],
+		cls: 'pref-card',
+		id: config.id,
+		items: [
+			wallpapers,
+			position
+		],
+		layout: 'border',
+		title: 'Desktop Background'
+	});
+	
+	function createRadio(value, checked, x, y){
+		if(value){
+			radio = new Ext.form.Radio({
+				name: 'position',
+				inputValue: value,
+				checked: checked,
+				x: x,
+				y: y
+			});
+			
+			radio.on('check', togglePosition, radio);
+			
+			return radio;
+		}
+	}
+    
+    function onChangeBgColor(){
+    	var dialog = new Ext.ux.ColorDialog({
+			border: false
+			, closeAction: 'close'
+			, listeners: {
+				'select': { fn: onColorSelect, scope: this, buffer: 350 }
+			}
+			, manager: this.app.getDesktop().getManager()
+			, resizable: false
+			, title: 'Color Picker'
+		});
+		dialog.show(this.app.styles.backgroundcolor);
+    }
+    
+    function onColorSelect(p, hex){
+		desktop.setBackgroundColor(hex);
+	}
+	
+	function onChangeFontColor(){
+    	var dialog = new Ext.ux.ColorDialog({
+			border: false
+			, closeAction: 'close'
+			, listeners: {
+				'select': { fn: onFontColorSelect, scope: this, buffer: 350 }
+			}
+			, manager: this.app.getDesktop().getManager()
+			, resizable: false
+			, title: 'Color Picker'
+		});
+		dialog.show(this.app.styles.fontcolor);
+    }
+	
+	function onFontColorSelect(p, hex){
+		desktop.setFontColor(hex);
+	}
+	
+	function onClose(){
+		this.owner.win.close();
+	}
+	
+	function onSave(){
+		var c = this.app.styles;
+		
+		this.buttons[0].disable();
+    	this.owner.save({
+    		action: 'saveBackground'
+    		, callback: function(){
+    			this.buttons[0].enable();
+    		}
+    		, callbackScope: this
+    		, backgroundcolor: c.backgroundcolor
+    		, fontcolor: c.fontcolor
+    		, theme: c.theme.id
+    		, transparency: c.transparency
+    		, wallpaper: c.wallpaper.id
+    		, wallpaperposition: c.wallpaperposition
+    	});
+	}
+	
+	function onSelectionChange(view, sel){
+		if(sel.length > 0){
+			var cId = this.app.styles.wallpaper.id,
+				r = view.getRecord(sel[0]),
+				d = r.data;
+			
+			if(parseInt(cId) !== parseInt(r.id)){
+				if(r && r.id && d.name && d.pathtofile){
+					desktop.setWallpaper({
+						id: r.id,
+						name: d.name,
+						pathtofile: d.pathtofile
+					});
+				}
+			}
+		}
+	}
+	
+	function togglePosition(field, checked){
+		if(checked === true){
+			desktop.setWallpaperPosition(field.inputValue);
+		}
+	}
+};
+
+Ext.extend(QoDesk.QoPreferences.Background, Ext.Panel, {
+	afterRender : function(){
+		QoDesk.QoPreferences.Background.superclass.afterRender.call(this);
+		
+		this.on('show', this.loadStore, this, {single: true});
+	},
+	
+	loadStore : function(){
+		this.store.load();
+	}
+});
+
+
+
+/* 
+ * Will ensure that the checkchange event is fired on 
+ * node double click
+ */
+Ext.override(Ext.tree.TreeNodeUI, {
+	toggleCheck : function(value){		
+        var cb = this.checkbox;
+        if(cb){
+            cb.checked = (value === undefined ? !cb.checked : value);
+            this.fireEvent('checkchange', this.node, cb.checked);
+        }
+    }
+});
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/qo-preferences.css
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/qo-preferences.css	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/qo-preferences.css	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,221 @@
+/*
+ * qWikiOffice Desktop 0.7.1
+ * Copyright(c) 2007-2008, Integrated Technologies, Inc.
+ * licensing@xxxxxxxxxxxxxxx
+ * 
+ * http://www.qwikioffice.com/license
+ */
+
+.pref-icon {
+	background-image: url(images/pref-icon.gif) !important;
+}
+.pref-shortcut-icon img {
+    background-image: url(images/pref-shortcut-icon.png);
+    filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='system/modules/qo-preferences/images/pref-shortcut-icon.png', sizingMethod='scale');
+}
+.pref-percent-field {
+	background:#ffffff url(images/percent-icon.gif) no-repeat right center;
+}
+#qo-preferences .x-window-mc {
+	color:#000 !important;
+}
+#qo-preferences .x-window-mc {
+	background:#fff none !important;
+}
+#qo-preferences .x-border-layout-ct {
+	background:transparent none;
+}
+#qo-preferences .x-panel-header {
+	background:transparent none;
+	border-bottom:0px none;
+}
+#qo-preferences .pref-card .x-panel-header {
+	color:#000;
+	/* padding-left:15px;
+	padding-top:15px; */
+}
+#qo-preferences .pref-card-subpanel .x-panel-header {
+	color:#000;
+	/* padding:5px 3px 4px 5px; */
+}
+#pref-win-card-1 .x-panel-body li {
+	margin:3px;
+	margin-bottom:20px;
+}
+#pref-win-card-1 .x-panel-body li img {
+	width:24px;
+	height:24px;
+	vertical-align:middle;
+	margin-right:7px;
+	margin-bottom:2px;
+}
+#pref-win-card-1 .x-panel-body li a {
+	text-decoration:none;
+	color:#336699;
+	font-weight:bold;
+}
+#pref-win-card-1 .x-panel-body li span {
+	padding-left:34px;
+}
+.pref-check-tree ul li {
+	border-bottom:1px solid #d0d0d0;
+	margin:0 3px;
+	padding:3px 0;
+}
+.pref-check-tree .x-tree-node .x-tree-selected {
+	background-color:#c0c0c0;
+}
+.pref-check-tree .x-tree-icon,
+.pref-check-tree .x-tree-ec-icon,
+.pref-check-tree .x-tree-elbow-line,
+.pref-check-tree .x-tree-elbow,
+.pref-check-tree .x-tree-elbow-end,
+.pref-check-tree .x-tree-elbow-plus,
+.pref-check-tree .x-tree-elbow-minus,
+.pref-check-tree .x-tree-elbow-end-plus,
+.pref-check-tree .x-tree-elbow-end-minus {
+	width:3px;
+}
+.pref-check-tree input.x-tree-node-cb {
+	margin-left:5px;
+}
+.pref-check-tree .x-tree-node a span,
+.pref-check-tree .x-dd-drag-ghost a span {
+	padding:1px 3px 1px 6px;
+}
+.icon-pref-autorun {
+	background-image:url(images/autorun-icon.png);
+	filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='source/helpers/preferences/images/autorun-icon.png', sizingMethod='scale');
+}
+.icon-pref-quickstart {
+	background-image:url(images/quickstart-icon.png);
+	filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='source/helpers/preferences/images/quickstart-icon.png', sizingMethod='scale');
+}
+.icon-pref-appearance {
+	background-image:url(images/appearance-icon.png);
+	filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='source/helpers/preferences/images/appearance-icon.png', sizingMethod='scale');
+}
+.icon-pref-wallpaper {
+	background-image:url(images/wallpaper-icon.png);
+	filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='source/helpers/preferences/images/wallpaper-icon.png', sizingMethod='scale');
+	
+}
+#pref-win-card-1 .x-panel-body {
+	padding:10px
+}
+.quick-start-plugin {
+	background-image:url(images/tree/plugin.gif) !important;
+}
+
+.pref-thumnail-view {
+	padding:10px 0;
+}
+
+.pref-thumbnail-viewer .x-panel-header{
+	background:transparent none;
+	border-bottom:1px solid #ccc !important;
+}
+#pref-wallpaper-view .x-panel-body,
+#pref-theme-view .x-panel-body {
+	background: white;
+	font: 11px Arial, Helvetica, sans-serif;
+}
+#pref-wallpaper-view .pref-view-thumb,
+#pref-theme-view .pref-view-thumb {
+	background: #dddddd;
+	padding: 3px;
+}
+#pref-wallpaper-view .pref-view-thumb img {
+	/* height: 67px;
+	width: 107px; */
+}
+#pref-theme-view  .pref-view-thumb img {
+	/* height: 100px;
+	width: 100px; */
+}
+#pref-wallpaper-view .pref-view-thumb img,
+#pref-theme-view  .pref-view-thumb img {
+	border:1px solid #fff;
+}
+#pref-wallpaper-view .pref-view-thumb-wrap,
+#pref-theme-view .pref-view-thumb-wrap {
+	cursor: pointer;
+	float: left;
+	margin: 4px;
+	margin-right: 0;
+	padding: 5px;
+}
+#pref-wallpaper-view .pref-view-thumb-wrap span,
+#pref-theme-view .pref-view-thumb-wrap span {
+	display: block;
+	overflow: hidden;
+	text-align: center;
+}
+
+#pref-wallpaper-view .x-view-over,
+#pref-theme-view .x-view-over {
+    border:1px solid #dddddd;
+    /* background: #efefef url(../../Ext/2.0/resources/images/default/grid/row-over.gif) repeat-x left top; */
+	padding: 4px;
+}
+
+#pref-wallpaper-view .x-view-selected,
+#pref-theme-view .x-view-selected {
+	background: #f1f1f1 none;
+	border:1px solid #999;
+	padding: 4px;
+}
+#pref-wallpaper-view .x-view-selected .pref-view-thumb,
+#pref-theme-view .x-view-selected .pref-view-thumb{
+	background:transparent;
+}
+
+#pref-wallpaper-view .loading-indicator {
+	font-size:11px;
+	/* background-image:url('../../Ext/2.0/resources/images/default/grid/loading.gif'); */
+	background-repeat: no-repeat;
+	background-position: left;
+	padding-left:20px;
+	margin:10px;
+}
+.bg-pos-center {
+	background-image:url(images/bg-center-icon.png);
+	filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='source/helpers/preferences/images/bg-center-icon.png', sizingMethod='scale');
+}
+.bg-pos-tile {
+	background-image:url(images/bg-tile-icon.png);
+	filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='source/helpers/preferences/images/bg-tile-icon.png', sizingMethod='scale');
+}
+
+.collapse-group {
+	padding-bottom:5px;
+	overflow:hidden;
+}
+.collapse-group .collapse-group-header {
+	padding:0;
+	border-bottom:1px solid #A0A0A0;
+}
+.collapse-group .collapse-group-header-text {
+	font-size:11px;
+	font-family:tahoma,arial,sans-serif;
+	line-height:13px;
+	text-transform:uppercase;
+	position:relative;
+	left:5px;
+	top:5px;
+	padding:1px 5px 1px 20px;
+	color:#4e79b2;
+	background:#fff url(images/form-collapse-icon.gif) no-repeat 2px 0;
+}
+/* Copied from x-plain (for IE + layouts to work) */
+.collapse-group-body {
+    overflow:hidden;
+}
+/* Copied from x-plain (for IE + layouts to work) */
+.collapse-group-bwrap {
+    overflow:hidden;
+    zoom:1;
+}
+.x-panel-collapsed .collapse-group-header-text {
+	background-position: 2px -15px;
+}
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/qo-preferences.js
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/qo-preferences.js	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/qo-preferences.js	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,20 @@
+/*
+ * qWikiOffice Desktop 0.8.1
+ * Copyright(c) 2007-2008, Integrated Technologies, Inc.
+ * licensing@xxxxxxxxxxxxxxx
+ * 
+ * http://www.qwikioffice.com/license
+ */
+
+QoDesk.QoPreferences = Ext.extend(Ext.app.Module, {
+	
+	moduleType : 'system/preferences',
+	moduleId : 'qo-preferences',
+	menuPath : 'ToolMenu',
+	launcher : {
+        	iconCls: 'pref-icon',
+            shortcutIconCls: 'pref-shortcut-icon',
+            text: 'Preferences',
+            tooltip: '<b>Preferences</b><br />Allows you to modify your desktop'
+    }
+});
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/qo-preferences.js.bak
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/qo-preferences.js.bak	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/qo-preferences.js.bak	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,1132 @@
+/*
+ * qWikiOffice Desktop 0.8.1
+ * Copyright(c) 2007-2008, Integrated Technologies, Inc.
+ * licensing@xxxxxxxxxxxxxxx
+ * 
+ * http://www.qwikioffice.com/license
+ */
+
+QoDesk.QoPreferences = Ext.extend(Ext.app.Module, {
+	
+	moduleType : 'system/preferences',
+	moduleId : 'qo-preferences',
+	menuPath : 'ToolMenu',
+	
+	actions : null,
+	cards : [
+		'pref-win-card-1', // navigation
+		'pref-win-card-2', // quickstart
+		'pref-win-card-3', // color and appearance
+		'pref-win-card-4', // wallpaper
+		'pref-win-card-5', // autorun
+		'pref-win-card-6'  // shortcuts
+	],
+	contentPanel : null,
+	cardHistory : [
+		'pref-win-card-1' // default
+	],
+	layout: null,
+	win : null,
+	
+    init : function(){
+        this.launcher = {
+        	iconCls: 'pref-icon',
+            handler: this.createWindow,
+            scope: this,
+            shortcutIconCls: 'pref-shortcut-icon',
+            text: 'Preferences',
+            tooltip: '<b>Preferences</b><br />Allows you to modify your desktop'
+        }
+    },
+
+    createWindow : function(){
+    	var desktop = this.app.getDesktop();
+        this.win = desktop.getWindow(this.moduleId);
+        
+        if(!this.win){
+        	var winWidth = 610;
+			var winHeight = 460;
+			
+			this.contentPanel = new Ext.Panel({
+				activeItem: 0,
+                border: false,
+				id: 'pref-win-content',
+				items: [
+                	new QoDesk.QoPreferences.NavPanel({owner: this, id: 'pref-win-card-1'}),
+                	new QoDesk.QoPreferences.Shortcuts({owner: this, id: 'pref-win-card-6'}),
+                	new QoDesk.QoPreferences.AutoRun({owner: this, id: 'pref-win-card-5'}),
+                	new QoDesk.QoPreferences.QuickStart({owner: this, id: 'pref-win-card-2'}),
+                	new QoDesk.QoPreferences.Appearance({owner: this, id: 'pref-win-card-3'}),
+                	new QoDesk.QoPreferences.Background({owner: this, id: 'pref-win-card-4'})
+                ],
+				layout: 'card',
+				tbar: [{
+					disabled: true,
+                	handler: this.navHandler.createDelegate(this, [-1]),
+                	id: 'back',
+                	scope: this,
+                	text: 'Back'
+                },{
+                	disabled: true,
+                	handler: this.navHandler.createDelegate(this, [1]),
+                	id: 'next',
+                	scope: this,
+                	text: 'Next'
+                }]
+			});
+			
+            this.win = desktop.createWindow({
+            	animCollapse: false,
+                constrainHeader: true,
+                id: this.moduleId,
+                height: winHeight,
+                iconCls: 'pref-icon',
+                items: this.contentPanel,
+                layout: 'fit',
+                shim: false,
+                taskbuttonTooltip: '<b>Preferences</b><br />Allows you to modify your desktop',
+                title: 'Preferences',
+                width: winWidth
+            });
+            
+			this.layout = this.contentPanel.getLayout();
+        }
+        
+        this.win.show();
+    },
+    
+    handleButtonState : function(){
+    	var cards = this.cardHistory, activeId = this.layout.activeItem.id,
+    		items = this.contentPanel.getTopToolbar().items, back = items.get(0), next = items.get(1);
+    	
+    	for(var i = 0, len = cards.length; i < len; i++){
+    		if(cards[i] === activeId){
+    			if(i <= 0){
+    				back.disable();
+    				next.enable();
+    			}else if(i >= (len-1)){
+    				back.enable();
+    				next.disable();
+    			}else{
+    				back.enable();
+    				next.enable();
+    			}
+    			break;
+    		}
+    	}
+    },
+    
+    navHandler : function(index){
+    	var cards = this.cardHistory,
+    		activeId = this.layout.activeItem.id,
+    		nextId;
+    	
+    	for(var i = 0, len = cards.length; i < len; i++){
+    		if(cards[i] === activeId){
+    			nextId = cards[i+index];
+    			break;
+    		}
+    	}
+    	
+    	this.layout.setActiveItem(nextId);
+    	this.handleButtonState();
+    },
+    
+    save : function(params){    	
+    	var desktop = this.app.getDesktop();
+    	var notifyWin = desktop.showNotification({
+			html: 'Saving your data...'
+			, title: 'Please wait'
+		});
+	    var callback = params.callback || null;
+		var callbackScope = params.callbackScope || this;
+		
+		params.moduleId = this.moduleId;
+		params.fileName = 'qo-preferences.php';
+		
+	    Ext.Ajax.request({
+			url: this.app.connection,
+			/* Could also pass moduleId and fileName in querystring like this
+			 * instead of in the params config option.
+			 *
+			 * url: this.app.connection+'?moduleId='+this.id+'&fileName=qo-preferences.php', */
+			params: params,
+			success: function(o){
+				if(o && o.responseText && Ext.decode(o.responseText).success){
+					saveComplete('Finished', 'Save complete.');
+				}else{
+					saveComplete('Error', 'Errors encountered on the server.');
+				}
+			},
+			failure: function(){
+				saveComplete('Error', 'Lost connection to server.');
+			},
+			scope: this
+		});
+		
+		function saveComplete(title, msg){
+			notifyWin.setIconClass('x-icon-done');
+			notifyWin.setTitle(title);
+			notifyWin.setMessage(msg);
+			desktop.hideNotification(notifyWin);
+			
+			if(callback){
+				callback.call(callbackScope);
+			}
+		}
+	},
+    
+    viewCard : function(card){
+		this.layout.setActiveItem(card);
+	    if(this.cardHistory.length > 1){
+	    	this.cardHistory.pop();
+	    }
+	    this.cardHistory.push(card);
+	    this.handleButtonState();
+	}
+});
+
+
+
+QoDesk.QoPreferences.NavPanel = function(config){
+	this.owner = config.owner;
+	
+	QoDesk.QoPreferences.NavPanel.superclass.constructor.call(this, {
+		autoScroll: true,
+		bodyStyle: 'padding:15px',
+		border: false,
+		html: '<ul id="pref-nav-panel"> \
+				<li> \
+					<img src="'+Ext.BLANK_IMAGE_URL+'" class="icon-pref-autorun"/> \
+					<a id="viewShortcuts" href="#">Shortcuts</a><br /> \
+					<span>Choose which applications appear in your shortcuts.</span> \
+				</li> \
+				<li> \
+					<img src="'+Ext.BLANK_IMAGE_URL+'" class="icon-pref-autorun"/> \
+					<a id="viewAutoRun" href="#">Auto Run Apps</a><br /> \
+					<span>Choose which applications open automatically once logged in.</span> \
+				</li> \
+				<li> \
+					<img src="'+Ext.BLANK_IMAGE_URL+'" class="icon-pref-quickstart"/> \
+					<a id="viewQuickstart" href="#">Quick Start Apps</a><br /> \
+					<span>Choose which applications appear in your Quick Start panel.</span> \
+				</li> \
+				<li> \
+					<img src="'+Ext.BLANK_IMAGE_URL+'" class="icon-pref-appearance"/> \
+					<a id="viewAppearance" href="#">Window Color and Appearance</a><br /> \
+					<span>Fine tune window color and style of your windows.</span> \
+				</li> \
+				<li> \
+					<img src="'+Ext.BLANK_IMAGE_URL+'" class="icon-pref-wallpaper"/> \
+					<a id="viewWallpapers" href="#">Desktop Background</a><br /> \
+					<span>Choose from available wallpapers or colors to decorate you desktop.</span> \
+				</li> \
+			</ul>',
+		id: config.id
+	});
+	
+	this.actions = {
+		'viewShortcuts' : function(owner){
+			owner.viewCard('pref-win-card-6');
+		},
+		
+		'viewAutoRun' : function(owner){
+			owner.viewCard('pref-win-card-5');
+		},
+		
+		'viewQuickstart' : function(owner){
+	   		owner.viewCard('pref-win-card-2');
+	   	},
+	   	
+	   	'viewAppearance' : function(owner){
+	   		owner.viewCard('pref-win-card-3');
+	   	},
+	   	
+	   	'viewWallpapers' : function(owner){
+	   		owner.viewCard('pref-win-card-4');
+	   	}
+	};
+};
+
+Ext.extend(QoDesk.QoPreferences.NavPanel, Ext.Panel, {
+	afterRender : function(){
+		this.body.on({
+			'mousedown': {
+				fn: this.doAction,
+				scope: this,
+				delegate: 'a'
+			},
+			'click': {
+				fn: Ext.emptyFn,
+				scope: null,
+				delegate: 'a',
+				preventDefault: true
+			}
+		});
+		
+		QoDesk.QoPreferences.NavPanel.superclass.afterRender.call(this); // do sizing calcs last
+	},
+	
+	doAction : function(e, t){
+    	e.stopEvent();
+    	this.actions[t.id](this.owner);  // pass owner for scope
+    }
+});
+
+
+
+QoDesk.QoPreferences.AutoRun = function(config){
+	this.owner = config.owner;
+	this.app = this.owner.app;
+	
+	var ms = this.app.modules,
+		ids = this.app.launchers.autorun,
+		nodes = expandNodes(ms, ids);
+				
+	QoDesk.QoPreferences.AutoRun.superclass.constructor.call(this, {
+		autoScroll: true,
+		bodyStyle: 'padding:10px',
+		border: false,
+		buttons: [{
+			handler: onSave,
+			scope: this,
+			text: 'Save'
+		},{
+			handler: onClose,
+			scope: this,
+			text: 'Close'
+		}],
+		cls: 'pref-card pref-check-tree',
+		id: config.id,
+		lines: false,
+		listeners: {
+			'checkchange': {
+				fn: onCheckChange,
+				scope: this
+			}
+		},
+		loader: new Ext.tree.TreeLoader(),
+		rootVisible: false,
+		root: new Ext.tree.AsyncTreeNode({
+			text: 'Auto Run Apps',
+			children: nodes
+		}),
+		title: 'Auto Run Apps'
+	});
+	
+	new Ext.tree.TreeSorter(this, {dir: "asc"});
+			
+	function expandNodes(ms, ids){
+		var nodes = [];
+		
+		for(var i = 0, len = ms.length; i < len; i++){
+			if(ms[i].moduleType === 'menu'){
+				/* nodes.push({
+					leaf: false,
+					text: ms[i].launcher.text,
+					children: this.expandNodes(o.menu.items, ids)
+				}); */
+			}else{
+				nodes.push({
+		           	checked: isChecked(ms[i].moduleId, ids) ? true : false,
+		           	iconCls: ms[i].launcher.iconCls,
+		           	id: ms[i].moduleId,
+		           	leaf: true,
+		           	selected: true,
+		           	text: ms[i].launcher.text
+				});
+			}
+		}
+		
+		return nodes;
+	}
+	
+	function isChecked(id, ids){
+		for(var i = 0, len = ids.length; i < len; i++){
+			if(id == ids[i]){
+				return true;
+			}
+		}
+	}
+
+	function onCheckChange(node, checked){
+		if(node.leaf && node.id){
+    		if(checked){
+				this.app.desktop.addAutoRun(node.id, true);
+    		}else{
+				this.app.desktop.removeAutoRun(node.id, true);
+    		}
+    	}
+    	node.ownerTree.selModel.select(node);
+    }
+    
+    function onClose(){
+		this.owner.win.close();
+	}
+	
+    function onSave(){
+    	this.buttons[0].disable();
+    	this.owner.save({
+    		callback: function(){
+    			this.buttons[0].enable();
+    		}
+    		, callbackScope: this
+    		, task: 'save'
+    		, what: 'autorun'
+    		, ids: Ext.encode(this.app.launchers.autorun)
+    	});
+    }
+};
+
+Ext.extend(QoDesk.QoPreferences.AutoRun, Ext.tree.TreePanel);
+
+
+
+QoDesk.QoPreferences.Shortcuts = function(config){
+	this.owner = config.owner;
+	this.app = this.owner.app;
+	
+	var ms = this.app.modules,
+		ids = this.app.launchers.shortcut,
+		nodes = expandNodes(ms, ids);
+	
+	QoDesk.QoPreferences.Shortcuts.superclass.constructor.call(this, {
+		autoScroll: true,
+		bodyStyle: 'padding:10px',
+		border: false,
+		buttons: [{
+			handler: onSave,
+			scope: this,
+			text: 'Save'
+		},{
+			handler: onClose,
+			scope: this,
+			text: 'Close'
+		}],
+		cls: 'pref-card pref-check-tree',
+		id: config.id,
+		lines: false,
+		listeners: {
+			'checkchange': {
+				fn: onCheckChange,
+				scope: this
+			}
+		},
+		loader: new Ext.tree.TreeLoader(),
+		rootVisible: false,
+		root: new Ext.tree.AsyncTreeNode({
+			text: 'Shortcuts',
+			children: nodes
+		}),
+		title: 'Shortcuts'
+	});
+	
+	new Ext.tree.TreeSorter(this, {dir: "asc"});
+			
+	function expandNodes(ms, ids){
+		var nodes = [];
+		
+		for(var i = 0, len = ms.length; i < len; i++){
+			if(ms[i].moduleType === 'menu'){
+				/* nodes.push({
+					leaf: false,
+					text: ms[i].launcher.text,
+					children: this.expandNodes(o.menu.items, ids)
+				}); */
+			}else{
+				nodes.push({
+		           	checked: isChecked(ms[i].moduleId, ids) ? true : false,
+		           	iconCls: ms[i].launcher.iconCls,
+		           	id: ms[i].moduleId,
+		           	leaf: true,
+		           	selected: true,
+		           	text: ms[i].launcher.text
+				});
+			}
+		}
+		
+		return nodes;
+	}
+	
+	function isChecked(id, ids){
+		for(var i = 0, len = ids.length; i < len; i++){
+			if(id == ids[i]){
+				return true;
+			}
+		}
+	}
+
+	function onCheckChange(node, checked){
+		if(node.leaf && node.id){
+    		if(checked){
+				this.app.desktop.addShortcut(node.id, true);
+    		}else{
+				this.app.desktop.removeShortcut(node.id, true);
+    		}
+    	}
+    	node.ownerTree.selModel.select(node);
+    }
+    
+    function onClose(){
+		this.owner.win.close();
+	}
+	
+    function onSave(){
+    	this.buttons[0].disable();
+    	this.owner.save({
+    		callback: function(){
+    			this.buttons[0].enable();
+    		}
+    		, callbackScope: this
+    		, task: 'save'
+    		, what: 'shortcut'
+    		, ids: Ext.encode(this.app.launchers.shortcut)
+    	});
+    }
+};
+
+Ext.extend(QoDesk.QoPreferences.Shortcuts, Ext.tree.TreePanel);
+
+
+
+QoDesk.QoPreferences.QuickStart = function(config){
+	this.owner = config.owner;
+	this.app = this.owner.app;
+	
+	var ms = this.app.modules,
+		ids = this.app.launchers.quickstart,
+		nodes = expandNodes(ms, ids);
+				
+    QoDesk.QoPreferences.QuickStart.superclass.constructor.call(this, {
+    	autoScroll: true,
+		bodyStyle: 'padding:10px',
+		border: false,
+		buttons: [{
+			handler: onSave,
+			scope: this,
+			text: 'Save'
+		},{
+			handler: onClose,
+			scope: this,
+			text: 'Close'
+		}],
+		cls: 'pref-card pref-check-tree',
+		id: config.id,
+		lines: false,
+		listeners: {
+			'checkchange': {
+				fn: onCheckChange,
+				scope: this
+			}
+		},
+		loader: new Ext.tree.TreeLoader(),
+		rootVisible: false,
+		root: new Ext.tree.AsyncTreeNode({
+			text: 'Quick Start Apps',
+			children: nodes
+		}),
+		title: 'Quick Start Apps'
+    });
+    
+    new Ext.tree.TreeSorter(this, {dir: "asc"});
+			
+	function expandNodes(ms, ids){
+		var nodes = [];
+		
+		for(var i = 0, len = ms.length; i < len; i++){
+			if(ms[i].moduleType === 'menu'){
+				/* nodes.push({
+					leaf: false,
+					text: ms[i].launcher.text,
+					children: this.expandNodes(o.menu.items, ids)
+				}); */
+			}else{
+				nodes.push({
+		           	checked: isChecked(ms[i].moduleId, ids) ? true : false,
+		           	iconCls: ms[i].launcher.iconCls,
+		           	id: ms[i].moduleId,
+		           	leaf: true,
+		           	selected: true,
+		           	text: ms[i].launcher.text
+				});
+			}
+		}
+		
+		return nodes;
+	}
+	
+	function isChecked(id, ids){
+		for(var i = 0, len = ids.length; i < len; i++){
+			if(id == ids[i]){
+				return true;
+			}
+		}
+	}
+	
+	function onCheckChange(node, checked){
+		if(node.leaf && node.id){
+    		if(checked){
+				this.app.desktop.addQuickStartButton(node.id, true);
+    		}else{
+				this.app.desktop.removeQuickStartButton(node.id, true);
+    		}
+    	}
+    	node.ownerTree.selModel.select(node);
+    }
+    
+    function onClose(){
+		this.owner.win.close();
+	}
+	
+    function onSave(){
+    	this.buttons[0].disable();
+    	this.owner.save({
+    		callback: function(){
+    			this.buttons[0].enable();
+    		}
+    		, callbackScope: this
+    		, task: 'save'
+    		, what: 'quickstart'
+    		, ids: Ext.encode(this.app.launchers.quickstart)
+    	});
+    }
+};
+
+Ext.extend(QoDesk.QoPreferences.QuickStart, Ext.tree.TreePanel);
+
+
+
+QoDesk.QoPreferences.Appearance = function(config){
+	this.owner = config.owner;
+	this.app = this.owner.app;
+	
+	var desktop = this.app.getDesktop();
+	
+	var store = new Ext.data.JsonStore({
+		baseParams: {
+			moduleId: this.owner.moduleId,
+			fileName: 'qo-preferences.php',
+			task: 'load',
+			what: 'themes'
+		},
+		fields: ['id', 'name', 'pathtothumbnail', 'pathtofile'],
+		id: 'id',
+		root: 'images',
+		url: this.app.connection
+	});
+	
+	this.store = store;
+	
+	store.on('load', function(store, records){
+		if(records){
+			defaults.setTitle('Themes Available (' + records.length + ')');
+			
+			var id = this.app.styles.theme.id;
+			if(id){
+				view.select('theme-'+id);
+			}
+		}				
+	}, this);
+	
+	var tpl = new Ext.XTemplate(
+		'<tpl for=".">',
+			'<div class="pref-view-thumb-wrap" id="theme-{id}">',
+				'<div class="pref-view-thumb"><img src="{pathtothumbnail}" title="{name}" /></div>',
+			'<span>{shortName}</span></div>',
+		'</tpl>',
+		'<div class="x-clear"></div>'
+	);
+
+	var view = new Ext.DataView({
+		autoHeight:true,
+		cls: 'pref-thumnail-view',
+		emptyText: 'No themes to display',
+		itemSelector:'div.pref-view-thumb-wrap',
+		loadingText: 'loading...',
+		singleSelect: true,
+		overClass:'x-view-over',
+		prepareData: function(data){
+			data.shortName = Ext.util.Format.ellipsis(data.name, 17);
+			return data;
+		},
+		store: store,
+		tpl: tpl
+	});
+	view.on('selectionchange', onSelectionChange, this);
+	
+	var defaults = new Ext.Panel({
+		animCollapse: false,
+		baseCls:'collapse-group',
+		border: false,
+		cls: 'pref-thumbnail-viewer',
+		collapsible: true,
+		hideCollapseTool: true,
+		id: 'pref-theme-view',
+		items: view,
+		title: 'Default Themes',
+		titleCollapse: true
+	});
+	
+	var themes = new Ext.Panel({
+		autoScroll: true,
+		bodyStyle: 'padding:10px',
+		border: true,
+		cls: 'pref-card-subpanel',
+		id: 'themes',
+		items: defaults,
+		margins: '10 15 0 15',
+		region: 'center'
+	});
+	
+	this.slider = createSlider({
+		handler: new Ext.util.DelayedTask(updateTransparency, this)
+		, min: 0
+		, max: 100
+		, x: 15
+		, y: 35
+		, width: 100
+	});
+	
+	var formPanel = new Ext.FormPanel({
+		border: false,
+		height: 70,
+		items: [
+			{x: 15, y: 15, xtype: 'label', text: 'Taskbar Transparency'},
+			this.slider.slider,
+			this.slider.display
+		],
+		layout: 'absolute',
+		split: false,
+		region: 'south'
+	});
+	
+	QoDesk.QoPreferences.Appearance.superclass.constructor.call(this, {
+		border: false,
+		buttons: [{
+			handler: onSave,
+			scope: this,
+			text: 'Save'
+			},{
+			handler: onClose,
+			scope: this,
+			text: 'Close'
+		}],
+		cls: 'pref-card',
+		id: config.id,
+		items: [
+			themes,
+			formPanel
+		],
+		layout: 'border',
+		title: 'Window Color And Appearance'
+	});
+	
+	// private functions
+	function createSlider(config){
+		var handler = config.handler, min = config.min, max = config.max
+			, width = config.width || 100, x = config.x, y = config.y;
+
+		var slider = new Ext.Slider({
+			minValue: min
+			, maxValue: max
+			, width: width
+			, x: x
+			, y: y
+		});
+		
+		var display =  new Ext.form.NumberField({
+			cls: 'pref-percent-field'
+			, enableKeyEvents: true
+			, maxValue: max
+			, minValue: min
+			, width: 45
+			, x: x + width + 15
+			, y: y - 1
+		});
+			
+		function sliderHandler(slider){
+			var v = slider.getValue();
+			display.setValue(v);
+			handler.delay(100, null, null, [v]); // delayed task prevents IE bog
+		}
+		
+		slider.on({
+			'change': { fn: sliderHandler, scope: this }
+			, 'drag': { fn: sliderHandler, scope: this }
+		});
+		
+		display.on({
+			'keyup': {
+				fn: function(field){
+					var v = field.getValue();
+					if(v !== '' && !isNaN(v) && v >= field.minValue && v <= field.maxValue){
+						slider.setValue(v);
+					}
+				}
+				, buffer: 350
+				, scope: this
+			}
+		});
+
+		return { slider: slider, display: display }
+	}
+	
+	function onClose(){
+		this.owner.win.close();
+	}
+	
+	function onSave(){
+		var c = this.app.styles;
+		
+		this.buttons[0].disable();
+    	this.owner.save({
+    		callback: function(){
+    			this.buttons[0].enable();
+    		}
+    		, callbackScope: this
+    		, task: 'save'
+    		, what: 'appearance'
+    		, backgroundcolor: c.backgroundcolor
+    		, fontcolor: c.fontcolor
+    		, theme: c.theme.id
+    		, transparency: c.transparency
+    		, wallpaper: c.wallpaper.id
+    		, wallpaperposition: c.wallpaperposition
+    	});
+	}
+	
+	function onSelectionChange(view, sel){
+		if(sel.length > 0){
+			var cId = this.app.styles.theme.id,
+				r = view.getRecord(sel[0]),
+				d = r.data;
+			
+			if(parseInt(cId) !== parseInt(r.id)){
+				if(r && r.id && d.name && d.pathtofile){
+					desktop.setTheme({
+						id: r.id,
+						name: d.name,
+						pathtofile: d.pathtofile
+					});
+				}
+			}
+		}
+	}
+	
+	function updateTransparency(v){
+		desktop.setTransparency(v);
+	}
+};
+
+Ext.extend(QoDesk.QoPreferences.Appearance, Ext.Panel, {
+	afterRender : function(){
+		QoDesk.QoPreferences.Appearance.superclass.afterRender.call(this);
+		
+		this.on('show', this.loadStore, this, {single: true});
+	},
+	
+	loadStore : function(){
+		this.store.load();
+		this.slider.slider.setValue(this.app.styles.transparency);
+	}
+});
+
+
+
+QoDesk.QoPreferences.Background = function(config){
+	this.owner = config.owner;
+	this.app = this.owner.app;
+	
+	var desktop = this.app.getDesktop();
+	
+	var store = new Ext.data.JsonStore({
+		baseParams: {
+			moduleId: this.owner.moduleId,
+			fileName: 'qo-preferences.php',
+			task: 'load',
+			what: 'wallpapers'
+		},
+		fields: ['id', 'name', 'pathtothumbnail', 'pathtofile'],
+		id: 'id',
+		root: 'images',
+		url: this.app.connection
+	});
+	
+	this.store = store;
+	
+	store.on('load', function(store, records){
+		if(records){
+			defaults.setTitle('Default Wallpapers (' + records.length + ')');
+			
+			var id = this.app.styles.wallpaper.id;
+			if(id){
+				view.select('wallpaper-'+id);
+			}
+		}				
+	}, this);
+
+	var tpl = new Ext.XTemplate(
+		'<tpl for=".">',
+			'<div class="pref-view-thumb-wrap" id="wallpaper-{id}">',
+				'<div class="pref-view-thumb"><img src="{pathtothumbnail}" title="{name}" /></div>',
+			'<span>{shortName}</span></div>',
+		'</tpl>',
+		'<div class="x-clear"></div>'
+	);
+
+	var view = new Ext.DataView({
+		autoHeight:true,
+		cls: 'pref-thumnail-view',
+		emptyText: 'No wallpapers to display',
+		itemSelector:'div.pref-view-thumb-wrap',
+		loadingText: 'loading...',
+		singleSelect: true,
+		overClass:'x-view-over',
+		prepareData: function(data){
+			data.shortName = Ext.util.Format.ellipsis(data.name, 17);
+			return data;
+		},
+		store: store,
+		tpl: tpl
+	});
+	view.on('selectionchange', onSelectionChange, this);
+	
+	var defaults = new Ext.Panel({
+		animCollapse: false,
+		baseCls:'collapse-group',
+		border: false,
+		cls: 'pref-thumbnail-viewer',
+		collapsible: true,
+		hideCollapseTool: true,
+		id: 'pref-wallpaper-view',
+		items: view,
+		title: 'Default Wallpapers',
+		titleCollapse: true
+	});
+	
+	var wallpapers = new Ext.Panel({
+		autoScroll: true,
+		bodyStyle: 'padding:10px',
+		border: true,
+		cls: 'pref-card-subpanel',
+		id: 'wallpapers',
+		items: defaults,
+		margins: '10 15 0 15',
+		region: 'center'
+	});
+	
+	var wpp = this.app.styles.wallpaperposition;
+	var tileRadio = createRadio('tile', wpp == 'tile' ? true : false, 90, 40);
+	var centerRadio = createRadio('center', wpp == 'center' ? true : false, 200, 40);
+	
+	var position = new Ext.FormPanel({
+		border: false,
+		height: 140,
+		id: 'position',
+		items: [{
+				border: false,
+				items: {border: false, html:'How should the wallpaper be positioned?'},
+				x: 15,
+				y: 15
+			},{
+				border: false,
+				items: {border: false, html: '<img class="bg-pos-tile" src="'+Ext.BLANK_IMAGE_URL+'" width="64" height="44" border="0" alt="" />'},
+				x: 15,
+				y: 40
+			},
+				tileRadio,
+			{
+				border: false,
+				items: {border: false, html: '<img class="bg-pos-center" src="'+Ext.BLANK_IMAGE_URL+'" width="64" height="44" border="0" alt="" />'},
+				x: 125,
+				y: 40
+			},
+				centerRadio,
+			{
+				border: false,
+				items: {border: false, html:'Choose a background color'},
+				x: 245,
+				y: 15
+			},{
+				border: false,
+				items: new Ext.ColorPalette({
+					listeners: {
+						'select': {
+							fn: onColorSelect
+							, scope: this
+						}
+					}
+				}),
+				/* items: new Ext.Button({
+					handler: onChangeBgColor,
+					scope: this,
+					text: 'Background color'
+				}), */
+				x: 245,
+				y: 40
+			},{
+				border: false,
+				items: {border: false, html:'Choose a font color'},
+				x: 425,
+				y: 15
+			},{
+				border: false,
+				items: new Ext.ColorPalette({
+					listeners: {
+						'select': {
+							fn: onFontColorSelect
+							, scope: this
+						}
+					}
+				}),
+				x: 425,
+				y: 40
+				
+		}],
+		layout: 'absolute',
+		region: 'south',
+		split: false
+	});
+
+	QoDesk.QoPreferences.Background.superclass.constructor.call(this, {
+		border: false,
+		buttons: [{
+			handler: onSave,
+			scope: this,
+			text: 'Save'
+			},{
+			handler: onClose,
+			scope: this,
+			text: 'Close'
+		}],
+		cls: 'pref-card',
+		id: config.id,
+		items: [
+			wallpapers,
+			position
+		],
+		layout: 'border',
+		title: 'Desktop Background'
+	});
+	
+	function createRadio(value, checked, x, y){
+		if(value){
+			radio = new Ext.form.Radio({
+				name: 'position',
+				inputValue: value,
+				checked: checked,
+				x: x,
+				y: y
+			});
+			
+			radio.on('check', togglePosition, radio);
+			
+			return radio;
+		}
+	}
+    
+    /* function onChangeBgColor(){
+    	var dialog = Ext.getCmp('qo-color-picker');
+    	
+    	if(!dialog){
+	    	dialog = new Ext.ux.ColorDialog({
+				title: 'Background Color',
+				closable: true,
+				height:232,
+				id: 'qo-color-picker',
+				modal: false,
+				shadow: true,
+				width: 362,
+				x: desktop.getWinX(362),
+				y: desktop.getWinY(232)
+			});
+		}
+		
+		//dialog.on('pickcolor', onPickColor, this);
+    	dialog.show();
+    } */
+    
+	function onClose(){
+		this.owner.win.close();
+	}
+	
+	function onColorSelect(p, hex){
+		desktop.setBackgroundColor(hex);
+	}
+	
+	function onFontColorSelect(p, hex){
+		desktop.setFontColor(hex);
+	}
+	
+	function onSave(){
+		var c = this.app.styles;
+		
+		this.buttons[0].disable();
+    	this.owner.save({
+    		callback: function(){
+    			this.buttons[0].enable();
+    		}
+    		, callbackScope: this
+    		, task: 'save'
+    		, what: 'appearance'
+    		, backgroundcolor: c.backgroundcolor
+    		, fontcolor: c.fontcolor
+    		, theme: c.theme.id
+    		, transparency: c.transparency
+    		, wallpaper: c.wallpaper.id
+    		, wallpaperposition: c.wallpaperposition
+    	});
+	}
+	
+	function onSelectionChange(view, sel){
+		if(sel.length > 0){
+			var cId = this.app.styles.wallpaper.id,
+				r = view.getRecord(sel[0]),
+				d = r.data;
+			
+			if(parseInt(cId) !== parseInt(r.id)){
+				if(r && r.id && d.name && d.pathtofile){
+					desktop.setWallpaper({
+						id: r.id,
+						name: d.name,
+						pathtofile: d.pathtofile
+					});
+				}
+			}
+		}
+	}
+	
+	function togglePosition(field, checked){
+		if(checked === true){
+			desktop.setWallpaperPosition(field.inputValue);
+		}
+	}
+};
+
+Ext.extend(QoDesk.QoPreferences.Background, Ext.Panel, {
+	afterRender : function(){
+		QoDesk.QoPreferences.Background.superclass.afterRender.call(this);
+		
+		this.on('show', this.loadStore, this, {single: true});
+	},
+	
+	loadStore : function(){
+		this.store.load();
+	}
+});
+
+
+
+/* 
+ * Will ensure that the checkchange event is fired on 
+ * node double click
+ */
+Ext.override(Ext.tree.TreeNodeUI, {
+	toggleCheck : function(value){		
+        var cb = this.checkbox;
+        if(cb){
+            cb.checked = (value === undefined ? !cb.checked : value);
+            this.fireEvent('checkchange', this.node, cb.checked);
+        }
+    }
+});
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/qo-preferences.php
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/qo-preferences.php	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/qo-preferences/qo-preferences.php	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,101 @@
+<?php
+/*
+ * qWikiOffice Desktop 0.8.1
+ * Copyright(c) 2007-2008, Integrated Technologies, Inc.
+ * licensing@xxxxxxxxxxxxxxx
+ * 
+ * http://www.qwikioffice.com/license
+ */
+
+// This classes methods (actions) will be called by connect.php
+class QoPreferences {
+	
+	private $os;
+
+	public function __construct($os){
+		$this->os = $os;
+	}
+	
+	// begin public module actions
+	
+	public function saveAppearance(){
+		print $this->save('appearance');
+	}
+	
+	public function saveAutorun(){
+		print $this->save('autorun');
+	}
+	
+	public function saveBackground(){
+		print $this->save('background');
+	}
+	
+	public function saveQuickstart(){
+		print $this->save('quickstart');
+	}
+	
+	public function saveShortcut(){
+		print $this->save('shortcut');
+	}
+	
+	public function viewThemes(){
+		print $this->os->preference->get_theme_thumbs();
+	}
+	
+	public function viewWallpapers(){
+		print $this->os->preference->get_wallpaper_thumbs();
+	}
+	
+	// end public module actions
+
+	private function save($what){
+		$success = "{'success': false}";
+	
+		switch(true){
+			case ($what == "autorun" || $what == "quickstart" || $what == "shortcut"):
+				
+				// clear old launcher data for member (based on group)
+				if($this->os->launcher->clear("member", $what)){					
+					$ids = $_POST["ids"];
+					
+					$ids = json_decode(get_magic_quotes_gpc() ? stripslashes($ids) : $ids);
+					
+					// if ids are found
+					if(count($ids) > 0){
+						$member_id = $this->os->session->get_member_id();
+						$group_id = $this->os->session->get_group_id();
+				
+						// os will decode the ids
+						if($this->os->launcher->set($member_id, $group_id, $ids, $what)){
+							$success = "{'success': true}";
+						}
+					}else{
+						$success = "{'success': true}";
+					}
+				}
+				
+				break;
+			case ($what == "appearance"  || $what == "background"):
+	
+				$styles = array(
+					'backgroundcolor' => $_POST["backgroundcolor"],
+					'fontcolor' => $_POST["fontcolor"],
+					'theme_id' => $_POST["theme"],
+					'transparency' => $_POST["transparency"],
+					'wallpaper_id' => $_POST["wallpaper"],
+					'wallpaperposition' => $_POST["wallpaperposition"]
+				);
+				
+				if($styles['backgroundcolor'] != "" && $styles['fontcolor'] != "" && $styles['theme_id'] != "" && $styles['transparency'] != "" && $styles['wallpaper_id'] != "" && $styles['wallpaperposition'] != ""){
+					if($this->os->preference->set_styles($styles)){
+						$success = "{'success': true}";
+					}
+				}
+				
+				break;
+		}
+		
+		return $success;
+	}
+}
+?>
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/tab-win/images/tab16x16.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/tab-win/images/tab16x16.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/tab-win/images/tab48x48.png
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/tab-win/images/tab48x48.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/tab-win/tab-win-override.js
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/tab-win/tab-win-override.js	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/tab-win/tab-win-override.js	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,50 @@
+/* Override the module code here.
+ * This code will be Loaded on Demand.
+ */
+
+Ext.override(QoDesk.TabWindow, {
+	
+	createWindow : function(){
+        var desktop = this.app.getDesktop();
+        var win = desktop.getWindow(this.moduleId);
+        
+        if(!win){
+        	var winWidth = desktop.getWinWidth() / 1.1;
+			var winHeight = desktop.getWinHeight() / 1.1;
+			
+            win = desktop.createWindow({
+                id: this.moduleId,
+                title: 'Tab Window',
+                width: winWidth,
+                height: winHeight,
+                iconCls: 'tab-icon',
+                shim: false,
+                constrainHeader: true,
+                layout: 'fit',
+                items:
+                    new Ext.TabPanel({
+                        activeTab:0,
+                        items: [{
+                        	autoScroll: true,
+                            title: 'Tab 1',
+                            header: false,
+                            html: '<p>Something useful would be in here.</p>',
+                			border: false
+                        },{
+                            title: 'Tab 2',
+                            header:false,
+                            html: '<p>Something useful would be in here.</p>',
+                            border: false
+                        },{
+                            title: 'Tab 3',
+                            header:false,
+                            html: '<p>Something useful would be in here.</p>',
+                            border:false
+                        }]
+                    }),
+                    taskbuttonTooltip: '<b>Tab Window</b><br />A window with tabs'
+            });
+        }
+        win.show();
+    }
+});
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/tab-win/tab-win.css
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/tab-win/tab-win.css	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/tab-win/tab-win.css	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,7 @@
+.tab-icon {
+	background-image: url(images/tab16x16.gif) !important;
+}
+.demo-tab-shortcut img {
+    background-image: url(images/tab48x48.png);
+    filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='system/modules/tab-win/images/tab48x48.png', sizingMethod='scale');
+}
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/tab-win/tab-win.js
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/tab-win/tab-win.js	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/modules/tab-win/tab-win.js	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,19 @@
+/* This code defines the module and will be loaded at start up.
+ * 
+ * When the user selects to open this module, the override code will
+ * be loaded to provide the functionality.
+ * 
+ * Allows for 'Module on Demand'.
+ */
+
+QoDesk.TabWindow = Ext.extend(Ext.app.Module, {
+	moduleType : 'demo',
+    moduleId : 'demo-tabs',
+    menuPath : 'StartMenu',
+	launcher : {
+        iconCls: 'tab-icon',
+        shortcutIconCls: 'demo-tab-shortcut',
+        text: 'Tab Window',
+        tooltip: '<b>Tab Window</b><br />A window with tabs'
+    }
+});
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/os/config.php
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/os/config.php	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/os/config.php	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,44 @@
+<?php
+/*
+ * qWikiOffice Desktop 0.8.1
+ * Copyright(c) 2007-2008, Integrated Technologies, Inc.
+ * licensing@xxxxxxxxxxxxxxx
+ * 
+ * http://www.qwikioffice.com/license
+ */
+
+// If you want all Error Reporting on, use this:
+//ini_set('display_errors',1);
+//error_reporting(E_ALL|E_STRICT);
+
+// If you want to see Warning Messages and not Notice Messages, use this:
+//ini_set('display_errors',1);
+//error_reporting(E_ALL);
+		
+// If you want all Error Reporting off, use this:
+error_reporting(0);
+
+class config {
+		// document root
+	public $DOCUMENT_ROOT = '';
+		
+		// directories
+	public $MODULES_DIR = 'system/modules/';
+	public $THEMES_DIR = 'resources/themes/';
+	public $WALLPAPERS_DIR = 'resources/wallpapers/';
+	
+	// login url
+	public $LOGIN_URL = 'login.html';
+	
+	// local database
+	public $DB_HOST = 'localhost';
+	public $DB_USERNAME = 'root';
+	public $DB_PASSWORD = '23scuffy';
+	public $DB_NAME = 'qwikioffice';
+	
+	public function __construct(){
+		$_SERVER['DOCUMENT_ROOT'] = str_replace('\\', '/', getcwd());
+		$this->DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT'].'/';
+	}
+}
+?>
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/os/config.php.bak
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/os/config.php.bak	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/os/config.php.bak	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,28 @@
+<?php
+/*
+ * qWikiOffice Desktop 0.8.1
+ * Copyright(c) 2007-2008, Integrated Technologies, Inc.
+ * licensing@xxxxxxxxxxxxxxx
+ * 
+ * http://www.qwikioffice.com/license
+ */
+
+class config {	
+	function config(){
+		// database
+		$this->DB_HOST = "localhost";
+		$this->DB_USERNAME = "root";
+		$this->DB_PASSWORD = "23scuffy";
+		$this->DB_NAME = "qwikiOffice";
+		
+		// document root
+		$_SERVER["DOCUMENT_ROOT"] = str_replace('\\', '/', getcwd());
+		$this->DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT']."/";
+		
+		// directories
+		$this->MODULES_DIR = "system/modules/";
+		$this->THEMES_DIR = "resources/themes/";
+		$this->WALLPAPERS_DIR = "resources/wallpapers/";
+	}
+}
+?>
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/os/lib/error.php
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/os/lib/error.php	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/os/lib/error.php	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,31 @@
+<?php
+/*
+ * qWikiOffice Desktop 1.0
+ * Copyright(c) 2007-2008, Integrated Technologies, Inc.
+ * licensing@xxxxxxxxxxxxxxx
+ * 
+ * http://www.qwikioffice.com/license
+ */
+
+class error {
+
+	private $os;
+
+	public function __construct($os){
+		$this->os = $os;
+	}
+	
+	
+	
+	/** log() Records an error log to the the qo_error_log table
+	  * 
+	  * @param {array} $errors An array of error messages
+	  **/
+	public function log($errors){
+	    for($i = 0, $len = count($errors); $i < $len; $i++){
+		$sql = "INSERT INTO qo_error_log (text, timestamp) VALUES ('".$errors[$i]."', '".date("Y-m-d H:i:s")."')";
+			mysql_query($sql);
+		}
+	}
+}
+?>
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/os/lib/group.php
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/os/lib/group.php	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/os/lib/group.php	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,134 @@
+<?php
+/*
+ * qWikiOffice Desktop 0.8.1
+ * Copyright(c) 2007-2008, Integrated Technologies, Inc.
+ * licensing@xxxxxxxxxxxxxxx
+ * 
+ * http://www.qwikioffice.com/license
+ */
+
+class group {
+
+	private $os;
+
+
+
+	public function __construct($os){
+		$this->os = $os;
+	}
+
+
+
+	/** exits() Returns true if a record exists for the passed in Group name.
+	  * 
+	  * @param {string} $name
+	  * @return {boolean}
+	  **/
+	public function exists($name){
+		$response = false;
+		
+		if($name != ''){
+			$sql = "SELECT
+				id
+				FROM
+				qo_groups
+				WHERE
+				name = '".$name."'";
+			
+			if(mysql_num_rows($result = mysql_query($sql)) > 0){
+				$response = true;
+			}
+		}
+		
+		return $response;
+	} // end exits()
+	
+	
+	
+	/** is_active()
+	  * 
+	  * @param {string} $group_id
+	  * @return {boolean}
+	  **/
+	public function is_active($group_id){
+		$response = false;
+			
+		if($group_id != ''){
+			$sql = "SELECT
+				active
+				FROM
+				qo_groups
+				WHERE
+				id = ".$group_id;
+				
+			if(mysql_num_rows($result = mysql_query($sql)) > 0){
+				$row = mysql_fetch_assoc($result);
+				
+				if($row["active"] == 1){
+					$response = true;
+				}
+			}
+		}
+		
+		return $response;
+	} // end is_active()
+	
+	
+	
+	/** get_name()
+	  *
+	  * @param $group_id integer
+	  **/
+	function get_name($group_id){
+		$response = '';
+		
+		if($group_id != ""){
+			$sql = "SELECT
+				name
+				FROM
+				qo_groups
+				WHERE
+				id = ".$group_id;
+			
+			if(mysql_num_rows($result = mysql_query($sql)) > 0){
+				$row = mysql_fetch_assoc($result);
+				$response = $row['name'];
+			}
+		}
+		
+		return $response;
+	} // end get_name()
+	
+	
+	
+	/** has_member()
+	  *
+	  * @param {integer} $member_id
+	  * @param {string} $name The name of the group
+	  * @return boolean
+	  **/
+	function has_member($member_id, $group_name){
+		$response = false;
+		
+		if($member_id != '' && $group_name != ''){
+			$sql = "SELECT
+				name
+				FROM
+				qo_groups AS G
+					INNER JOIN qo_groups_has_members AS GM ON G.id = GM.qo_groups_id
+				WHERE
+				qo_members_id = ".$member_id;
+			
+			if($result = mysql_query($sql)){
+				while($row = mysql_fetch_assoc($result)){
+					if(strcasecmp($row['name'], $group_name) == 0){ // case-insensitive string comparison
+						$response = true;
+					}
+				}
+			}
+		}
+	
+		return $response;	
+	} // end has_member()
+}
+?>
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/os/lib/json.php
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/os/lib/json.php	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/os/lib/json.php	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,806 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+* Converts to and from JSON format.
+*
+* JSON (JavaScript Object Notation) is a lightweight data-interchange
+* format. It is easy for humans to read and write. It is easy for machines
+* to parse and generate. It is based on a subset of the JavaScript
+* Programming Language, Standard ECMA-262 3rd Edition - December 1999.
+* This feature can also be found in  Python. JSON is a text format that is
+* completely language independent but uses conventions that are familiar
+* to programmers of the C-family of languages, including C, C++, C#, Java,
+* JavaScript, Perl, TCL, and many others. These properties make JSON an
+* ideal data-interchange language.
+*
+* This package provides a simple encoder and decoder for JSON notation. It
+* is intended for use with client-side Javascript applications that make
+* use of HTTPRequest to perform server communication functions - data can
+* be encoded into JSON notation for use in a client-side javascript, or
+* decoded from incoming Javascript requests. JSON format is native to
+* Javascript, and can be directly eval()'ed with no further parsing
+* overhead
+*
+* All strings should be in ASCII or UTF-8 format!
+*
+* LICENSE: 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.
+*
+* THIS SOFTWARE IS PROVIDED ``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 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.
+*
+* @category
+* @package     Services_JSON
+* @author      Michal Migurski <mike-json@xxxxxxxxxx>
+* @author      Matt Knapp <mdknapp[at]gmail[dot]com>
+* @author      Brett Stimmerman <brettstimmerman[at]gmail[dot]com>
+* @copyright   2005 Michal Migurski
+* @version     CVS: $Id: JSON.php,v 1.31 2006/06/28 05:54:17 migurski Exp $
+* @license     http://www.opensource.org/licenses/bsd-license.php
+* @link        http://pear.php.net/pepr/pepr-proposal-show.php?id=198
+*/
+
+/**
+* Marker constant for Services_JSON::decode(), used to flag stack state
+*/
+define('SERVICES_JSON_SLICE',   1);
+
+/**
+* Marker constant for Services_JSON::decode(), used to flag stack state
+*/
+define('SERVICES_JSON_IN_STR',  2);
+
+/**
+* Marker constant for Services_JSON::decode(), used to flag stack state
+*/
+define('SERVICES_JSON_IN_ARR',  3);
+
+/**
+* Marker constant for Services_JSON::decode(), used to flag stack state
+*/
+define('SERVICES_JSON_IN_OBJ',  4);
+
+/**
+* Marker constant for Services_JSON::decode(), used to flag stack state
+*/
+define('SERVICES_JSON_IN_CMT', 5);
+
+/**
+* Behavior switch for Services_JSON::decode()
+*/
+define('SERVICES_JSON_LOOSE_TYPE', 16);
+
+/**
+* Behavior switch for Services_JSON::decode()
+*/
+define('SERVICES_JSON_SUPPRESS_ERRORS', 32);
+
+/**
+* Converts to and from JSON format.
+*
+* Brief example of use:
+*
+* <code>
+* // create a new instance of Services_JSON
+* $json = new Services_JSON();
+*
+* // convert a complexe value to JSON notation, and send it to the browser
+* $value = array('foo', 'bar', array(1, 2, 'baz'), array(3, array(4)));
+* $output = $json->encode($value);
+*
+* print($output);
+* // prints: ["foo","bar",[1,2,"baz"],[3,[4]]]
+*
+* // accept incoming POST data, assumed to be in JSON notation
+* $input = file_get_contents('php://input', 1000000);
+* $value = $json->decode($input);
+* </code>
+*/
+class Services_JSON
+{
+   /**
+    * constructs a new JSON instance
+    *
+    * @param    int     $use    object behavior flags; combine with boolean-OR
+    *
+    *                           possible values:
+    *                           - SERVICES_JSON_LOOSE_TYPE:  loose typing.
+    *                                   "{...}" syntax creates associative arrays
+    *                                   instead of objects in decode().
+    *                           - SERVICES_JSON_SUPPRESS_ERRORS:  error suppression.
+    *                                   Values which can't be encoded (e.g. resources)
+    *                                   appear as NULL instead of throwing errors.
+    *                                   By default, a deeply-nested resource will
+    *                                   bubble up with an error, so all return values
+    *                                   from encode() should be checked with isError()
+    */
+    function Services_JSON($use = 0)
+    {
+        $this->use = $use;
+    }
+
+   /**
+    * convert a string from one UTF-16 char to one UTF-8 char
+    *
+    * Normally should be handled by mb_convert_encoding, but
+    * provides a slower PHP-only method for installations
+    * that lack the multibye string extension.
+    *
+    * @param    string  $utf16  UTF-16 character
+    * @return   string  UTF-8 character
+    * @access   private
+    */
+    function utf162utf8($utf16)
+    {
+        // oh please oh please oh please oh please oh please
+        if(function_exists('mb_convert_encoding')) {
+            return mb_convert_encoding($utf16, 'UTF-8', 'UTF-16');
+        }
+
+        $bytes = (ord($utf16{0}) << 8) | ord($utf16{1});
+
+        switch(true) {
+            case ((0x7F & $bytes) == $bytes):
+                // this case should never be reached, because we are in ASCII range
+                // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+                return chr(0x7F & $bytes);
+
+            case (0x07FF & $bytes) == $bytes:
+                // return a 2-byte UTF-8 character
+                // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+                return chr(0xC0 | (($bytes >> 6) & 0x1F))
+                     . chr(0x80 | ($bytes & 0x3F));
+
+            case (0xFFFF & $bytes) == $bytes:
+                // return a 3-byte UTF-8 character
+                // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+                return chr(0xE0 | (($bytes >> 12) & 0x0F))
+                     . chr(0x80 | (($bytes >> 6) & 0x3F))
+                     . chr(0x80 | ($bytes & 0x3F));
+        }
+
+        // ignoring UTF-32 for now, sorry
+        return '';
+    }
+
+   /**
+    * convert a string from one UTF-8 char to one UTF-16 char
+    *
+    * Normally should be handled by mb_convert_encoding, but
+    * provides a slower PHP-only method for installations
+    * that lack the multibye string extension.
+    *
+    * @param    string  $utf8   UTF-8 character
+    * @return   string  UTF-16 character
+    * @access   private
+    */
+    function utf82utf16($utf8)
+    {
+        // oh please oh please oh please oh please oh please
+        if(function_exists('mb_convert_encoding')) {
+            return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8');
+        }
+
+        switch(strlen($utf8)) {
+            case 1:
+                // this case should never be reached, because we are in ASCII range
+                // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+                return $utf8;
+
+            case 2:
+                // return a UTF-16 character from a 2-byte UTF-8 char
+                // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+                return chr(0x07 & (ord($utf8{0}) >> 2))
+                     . chr((0xC0 & (ord($utf8{0}) << 6))
+                         | (0x3F & ord($utf8{1})));
+
+            case 3:
+                // return a UTF-16 character from a 3-byte UTF-8 char
+                // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+                return chr((0xF0 & (ord($utf8{0}) << 4))
+                         | (0x0F & (ord($utf8{1}) >> 2)))
+                     . chr((0xC0 & (ord($utf8{1}) << 6))
+                         | (0x7F & ord($utf8{2})));
+        }
+
+        // ignoring UTF-32 for now, sorry
+        return '';
+    }
+
+   /**
+    * encodes an arbitrary variable into JSON format
+    *
+    * @param    mixed   $var    any number, boolean, string, array, or object to be encoded.
+    *                           see argument 1 to Services_JSON() above for array-parsing behavior.
+    *                           if var is a strng, note that encode() always expects it
+    *                           to be in ASCII or UTF-8 format!
+    *
+    * @return   mixed   JSON string representation of input var or an error if a problem occurs
+    * @access   public
+    */
+    function encode($var)
+    {
+        switch (gettype($var)) {
+            case 'boolean':
+                return $var ? 'true' : 'false';
+
+            case 'NULL':
+                return 'null';
+
+            case 'integer':
+                return (int) $var;
+
+            case 'double':
+            case 'float':
+                return (float) $var;
+
+            case 'string':
+                // STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT
+                $ascii = '';
+                $strlen_var = strlen($var);
+
+               /*
+                * Iterate over every character in the string,
+                * escaping with a slash or encoding to UTF-8 where necessary
+                */
+                for ($c = 0; $c < $strlen_var; ++$c) {
+
+                    $ord_var_c = ord($var{$c});
+
+                    switch (true) {
+                        case $ord_var_c == 0x08:
+                            $ascii .= '\b';
+                            break;
+                        case $ord_var_c == 0x09:
+                            $ascii .= '\t';
+                            break;
+                        case $ord_var_c == 0x0A:
+                            $ascii .= '\n';
+                            break;
+                        case $ord_var_c == 0x0C:
+                            $ascii .= '\f';
+                            break;
+                        case $ord_var_c == 0x0D:
+                            $ascii .= '\r';
+                            break;
+
+                        case $ord_var_c == 0x22:
+                        case $ord_var_c == 0x2F:
+                        case $ord_var_c == 0x5C:
+                            // double quote, slash, slosh
+                            $ascii .= '\\'.$var{$c};
+                            break;
+
+                        case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)):
+                            // characters U-00000000 - U-0000007F (same as ASCII)
+                            $ascii .= $var{$c};
+                            break;
+
+                        case (($ord_var_c & 0xE0) == 0xC0):
+                            // characters U-00000080 - U-000007FF, mask 110XXXXX
+                            // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+                            $char = pack('C*', $ord_var_c, ord($var{$c + 1}));
+                            $c += 1;
+                            $utf16 = $this->utf82utf16($char);
+                            $ascii .= sprintf('\u%04s', bin2hex($utf16));
+                            break;
+
+                        case (($ord_var_c & 0xF0) == 0xE0):
+                            // characters U-00000800 - U-0000FFFF, mask 1110XXXX
+                            // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+                            $char = pack('C*', $ord_var_c,
+                                         ord($var{$c + 1}),
+                                         ord($var{$c + 2}));
+                            $c += 2;
+                            $utf16 = $this->utf82utf16($char);
+                            $ascii .= sprintf('\u%04s', bin2hex($utf16));
+                            break;
+
+                        case (($ord_var_c & 0xF8) == 0xF0):
+                            // characters U-00010000 - U-001FFFFF, mask 11110XXX
+                            // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+                            $char = pack('C*', $ord_var_c,
+                                         ord($var{$c + 1}),
+                                         ord($var{$c + 2}),
+                                         ord($var{$c + 3}));
+                            $c += 3;
+                            $utf16 = $this->utf82utf16($char);
+                            $ascii .= sprintf('\u%04s', bin2hex($utf16));
+                            break;
+
+                        case (($ord_var_c & 0xFC) == 0xF8):
+                            // characters U-00200000 - U-03FFFFFF, mask 111110XX
+                            // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+                            $char = pack('C*', $ord_var_c,
+                                         ord($var{$c + 1}),
+                                         ord($var{$c + 2}),
+                                         ord($var{$c + 3}),
+                                         ord($var{$c + 4}));
+                            $c += 4;
+                            $utf16 = $this->utf82utf16($char);
+                            $ascii .= sprintf('\u%04s', bin2hex($utf16));
+                            break;
+
+                        case (($ord_var_c & 0xFE) == 0xFC):
+                            // characters U-04000000 - U-7FFFFFFF, mask 1111110X
+                            // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+                            $char = pack('C*', $ord_var_c,
+                                         ord($var{$c + 1}),
+                                         ord($var{$c + 2}),
+                                         ord($var{$c + 3}),
+                                         ord($var{$c + 4}),
+                                         ord($var{$c + 5}));
+                            $c += 5;
+                            $utf16 = $this->utf82utf16($char);
+                            $ascii .= sprintf('\u%04s', bin2hex($utf16));
+                            break;
+                    }
+                }
+
+                return '"'.$ascii.'"';
+
+            case 'array':
+               /*
+                * As per JSON spec if any array key is not an integer
+                * we must treat the the whole array as an object. We
+                * also try to catch a sparsely populated associative
+                * array with numeric keys here because some JS engines
+                * will create an array with empty indexes up to
+                * max_index which can cause memory issues and because
+                * the keys, which may be relevant, will be remapped
+                * otherwise.
+                *
+                * As per the ECMA and JSON specification an object may
+                * have any string as a property. Unfortunately due to
+                * a hole in the ECMA specification if the key is a
+                * ECMA reserved word or starts with a digit the
+                * parameter is only accessible using ECMAScript's
+                * bracket notation.
+                */
+
+                // treat as a JSON object
+                if (is_array($var) && count($var) && (array_keys($var) !== range(0, sizeof($var) - 1))) {
+                    $properties = array_map(array($this, 'name_value'),
+                                            array_keys($var),
+                                            array_values($var));
+
+                    foreach($properties as $property) {
+                        if(Services_JSON::isError($property)) {
+                            return $property;
+                        }
+                    }
+
+                    return '{' . join(',', $properties) . '}';
+                }
+
+                // treat it like a regular array
+                $elements = array_map(array($this, 'encode'), $var);
+
+                foreach($elements as $element) {
+                    if(Services_JSON::isError($element)) {
+                        return $element;
+                    }
+                }
+
+                return '[' . join(',', $elements) . ']';
+
+            case 'object':
+                $vars = get_object_vars($var);
+
+                $properties = array_map(array($this, 'name_value'),
+                                        array_keys($vars),
+                                        array_values($vars));
+
+                foreach($properties as $property) {
+                    if(Services_JSON::isError($property)) {
+                        return $property;
+                    }
+                }
+
+                return '{' . join(',', $properties) . '}';
+
+            default:
+                return ($this->use & SERVICES_JSON_SUPPRESS_ERRORS)
+                    ? 'null'
+                    : new Services_JSON_Error(gettype($var)." can not be encoded as JSON string");
+        }
+    }
+
+   /**
+    * array-walking function for use in generating JSON-formatted name-value pairs
+    *
+    * @param    string  $name   name of key to use
+    * @param    mixed   $value  reference to an array element to be encoded
+    *
+    * @return   string  JSON-formatted name-value pair, like '"name":value'
+    * @access   private
+    */
+    function name_value($name, $value)
+    {
+        $encoded_value = $this->encode($value);
+
+        if(Services_JSON::isError($encoded_value)) {
+            return $encoded_value;
+        }
+
+        return $this->encode(strval($name)) . ':' . $encoded_value;
+    }
+
+   /**
+    * reduce a string by removing leading and trailing comments and whitespace
+    *
+    * @param    $str    string      string value to strip of comments and whitespace
+    *
+    * @return   string  string value stripped of comments and whitespace
+    * @access   private
+    */
+    function reduce_string($str)
+    {
+        $str = preg_replace(array(
+
+                // eliminate single line comments in '// ...' form
+                '#^\s*//(.+)$#m',
+
+                // eliminate multi-line comments in '/* ... */' form, at start of string
+                '#^\s*/\*(.+)\*/#Us',
+
+                // eliminate multi-line comments in '/* ... */' form, at end of string
+                '#/\*(.+)\*/\s*$#Us'
+
+            ), '', $str);
+
+        // eliminate extraneous space
+        return trim($str);
+    }
+
+   /**
+    * decodes a JSON string into appropriate variable
+    *
+    * @param    string  $str    JSON-formatted string
+    *
+    * @return   mixed   number, boolean, string, array, or object
+    *                   corresponding to given JSON input string.
+    *                   See argument 1 to Services_JSON() above for object-output behavior.
+    *                   Note that decode() always returns strings
+    *                   in ASCII or UTF-8 format!
+    * @access   public
+    */
+    function decode($str)
+    {
+        $str = $this->reduce_string($str);
+
+        switch (strtolower($str)) {
+            case 'true':
+                return true;
+
+            case 'false':
+                return false;
+
+            case 'null':
+                return null;
+
+            default:
+                $m = array();
+
+                if (is_numeric($str)) {
+                    // Lookie-loo, it's a number
+
+                    // This would work on its own, but I'm trying to be
+                    // good about returning integers where appropriate:
+                    // return (float)$str;
+
+                    // Return float or int, as appropriate
+                    return ((float)$str == (integer)$str)
+                        ? (integer)$str
+                        : (float)$str;
+
+                } elseif (preg_match('/^("|\').*(\1)$/s', $str, $m) && $m[1] == $m[2]) {
+                    // STRINGS RETURNED IN UTF-8 FORMAT
+                    $delim = substr($str, 0, 1);
+                    $chrs = substr($str, 1, -1);
+                    $utf8 = '';
+                    $strlen_chrs = strlen($chrs);
+
+                    for ($c = 0; $c < $strlen_chrs; ++$c) {
+
+                        $substr_chrs_c_2 = substr($chrs, $c, 2);
+                        $ord_chrs_c = ord($chrs{$c});
+
+                        switch (true) {
+                            case $substr_chrs_c_2 == '\b':
+                                $utf8 .= chr(0x08);
+                                ++$c;
+                                break;
+                            case $substr_chrs_c_2 == '\t':
+                                $utf8 .= chr(0x09);
+                                ++$c;
+                                break;
+                            case $substr_chrs_c_2 == '\n':
+                                $utf8 .= chr(0x0A);
+                                ++$c;
+                                break;
+                            case $substr_chrs_c_2 == '\f':
+                                $utf8 .= chr(0x0C);
+                                ++$c;
+                                break;
+                            case $substr_chrs_c_2 == '\r':
+                                $utf8 .= chr(0x0D);
+                                ++$c;
+                                break;
+
+                            case $substr_chrs_c_2 == '\\"':
+                            case $substr_chrs_c_2 == '\\\'':
+                            case $substr_chrs_c_2 == '\\\\':
+                            case $substr_chrs_c_2 == '\\/':
+                                if (($delim == '"' && $substr_chrs_c_2 != '\\\'') ||
+                                   ($delim == "'" && $substr_chrs_c_2 != '\\"')) {
+                                    $utf8 .= $chrs{++$c};
+                                }
+                                break;
+
+                            case preg_match('/\\\u[0-9A-F]{4}/i', substr($chrs, $c, 6)):
+                                // single, escaped unicode character
+                                $utf16 = chr(hexdec(substr($chrs, ($c + 2), 2)))
+                                       . chr(hexdec(substr($chrs, ($c + 4), 2)));
+                                $utf8 .= $this->utf162utf8($utf16);
+                                $c += 5;
+                                break;
+
+                            case ($ord_chrs_c >= 0x20) && ($ord_chrs_c <= 0x7F):
+                                $utf8 .= $chrs{$c};
+                                break;
+
+                            case ($ord_chrs_c & 0xE0) == 0xC0:
+                                // characters U-00000080 - U-000007FF, mask 110XXXXX
+                                //see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+                                $utf8 .= substr($chrs, $c, 2);
+                                ++$c;
+                                break;
+
+                            case ($ord_chrs_c & 0xF0) == 0xE0:
+                                // characters U-00000800 - U-0000FFFF, mask 1110XXXX
+                                // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+                                $utf8 .= substr($chrs, $c, 3);
+                                $c += 2;
+                                break;
+
+                            case ($ord_chrs_c & 0xF8) == 0xF0:
+                                // characters U-00010000 - U-001FFFFF, mask 11110XXX
+                                // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+                                $utf8 .= substr($chrs, $c, 4);
+                                $c += 3;
+                                break;
+
+                            case ($ord_chrs_c & 0xFC) == 0xF8:
+                                // characters U-00200000 - U-03FFFFFF, mask 111110XX
+                                // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+                                $utf8 .= substr($chrs, $c, 5);
+                                $c += 4;
+                                break;
+
+                            case ($ord_chrs_c & 0xFE) == 0xFC:
+                                // characters U-04000000 - U-7FFFFFFF, mask 1111110X
+                                // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+                                $utf8 .= substr($chrs, $c, 6);
+                                $c += 5;
+                                break;
+
+                        }
+
+                    }
+
+                    return $utf8;
+
+                } elseif (preg_match('/^\[.*\]$/s', $str) || preg_match('/^\{.*\}$/s', $str)) {
+                    // array, or object notation
+
+                    if ($str{0} == '[') {
+                        $stk = array(SERVICES_JSON_IN_ARR);
+                        $arr = array();
+                    } else {
+                        if ($this->use & SERVICES_JSON_LOOSE_TYPE) {
+                            $stk = array(SERVICES_JSON_IN_OBJ);
+                            $obj = array();
+                        } else {
+                            $stk = array(SERVICES_JSON_IN_OBJ);
+                            $obj = new stdClass();
+                        }
+                    }
+
+                    array_push($stk, array('what'  => SERVICES_JSON_SLICE,
+                                           'where' => 0,
+                                           'delim' => false));
+
+                    $chrs = substr($str, 1, -1);
+                    $chrs = $this->reduce_string($chrs);
+
+                    if ($chrs == '') {
+                        if (reset($stk) == SERVICES_JSON_IN_ARR) {
+                            return $arr;
+
+                        } else {
+                            return $obj;
+
+                        }
+                    }
+
+                    //print("\nparsing {$chrs}\n");
+
+                    $strlen_chrs = strlen($chrs);
+
+                    for ($c = 0; $c <= $strlen_chrs; ++$c) {
+
+                        $top = end($stk);
+                        $substr_chrs_c_2 = substr($chrs, $c, 2);
+
+                        if (($c == $strlen_chrs) || (($chrs{$c} == ',') && ($top['what'] == SERVICES_JSON_SLICE))) {
+                            // found a comma that is not inside a string, array, etc.,
+                            // OR we've reached the end of the character list
+                            $slice = substr($chrs, $top['where'], ($c - $top['where']));
+                            array_push($stk, array('what' => SERVICES_JSON_SLICE, 'where' => ($c + 1), 'delim' => false));
+                            //print("Found split at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
+
+                            if (reset($stk) == SERVICES_JSON_IN_ARR) {
+                                // we are in an array, so just push an element onto the stack
+                                array_push($arr, $this->decode($slice));
+
+                            } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) {
+                                // we are in an object, so figure
+                                // out the property name and set an
+                                // element in an associative array,
+                                // for now
+                                $parts = array();
+                                
+                                if (preg_match('/^\s*(["\'].*[^\\\]["\'])\s*:\s*(\S.*),?$/Uis', $slice, $parts)) {
+                                    // "name":value pair
+                                    $key = $this->decode($parts[1]);
+                                    $val = $this->decode($parts[2]);
+
+                                    if ($this->use & SERVICES_JSON_LOOSE_TYPE) {
+                                        $obj[$key] = $val;
+                                    } else {
+                                        $obj->$key = $val;
+                                    }
+                                } elseif (preg_match('/^\s*(\w+)\s*:\s*(\S.*),?$/Uis', $slice, $parts)) {
+                                    // name:value pair, where name is unquoted
+                                    $key = $parts[1];
+                                    $val = $this->decode($parts[2]);
+
+                                    if ($this->use & SERVICES_JSON_LOOSE_TYPE) {
+                                        $obj[$key] = $val;
+                                    } else {
+                                        $obj->$key = $val;
+                                    }
+                                }
+
+                            }
+
+                        } elseif ((($chrs{$c} == '"') || ($chrs{$c} == "'")) && ($top['what'] != SERVICES_JSON_IN_STR)) {
+                            // found a quote, and we are not inside a string
+                            array_push($stk, array('what' => SERVICES_JSON_IN_STR, 'where' => $c, 'delim' => $chrs{$c}));
+                            //print("Found start of string at {$c}\n");
+
+                        } elseif (($chrs{$c} == $top['delim']) &&
+                                 ($top['what'] == SERVICES_JSON_IN_STR) &&
+                                 ((strlen(substr($chrs, 0, $c)) - strlen(rtrim(substr($chrs, 0, $c), '\\'))) % 2 != 1)) {
+                            // found a quote, we're in a string, and it's not escaped
+                            // we know that it's not escaped becase there is _not_ an
+                            // odd number of backslashes at the end of the string so far
+                            array_pop($stk);
+                            //print("Found end of string at {$c}: ".substr($chrs, $top['where'], (1 + 1 + $c - $top['where']))."\n");
+
+                        } elseif (($chrs{$c} == '[') &&
+                                 in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) {
+                            // found a left-bracket, and we are in an array, object, or slice
+                            array_push($stk, array('what' => SERVICES_JSON_IN_ARR, 'where' => $c, 'delim' => false));
+                            //print("Found start of array at {$c}\n");
+
+                        } elseif (($chrs{$c} == ']') && ($top['what'] == SERVICES_JSON_IN_ARR)) {
+                            // found a right-bracket, and we're in an array
+                            array_pop($stk);
+                            //print("Found end of array at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
+
+                        } elseif (($chrs{$c} == '{') &&
+                                 in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) {
+                            // found a left-brace, and we are in an array, object, or slice
+                            array_push($stk, array('what' => SERVICES_JSON_IN_OBJ, 'where' => $c, 'delim' => false));
+                            //print("Found start of object at {$c}\n");
+
+                        } elseif (($chrs{$c} == '}') && ($top['what'] == SERVICES_JSON_IN_OBJ)) {
+                            // found a right-brace, and we're in an object
+                            array_pop($stk);
+                            //print("Found end of object at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
+
+                        } elseif (($substr_chrs_c_2 == '/*') &&
+                                 in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) {
+                            // found a comment start, and we are in an array, object, or slice
+                            array_push($stk, array('what' => SERVICES_JSON_IN_CMT, 'where' => $c, 'delim' => false));
+                            $c++;
+                            //print("Found start of comment at {$c}\n");
+
+                        } elseif (($substr_chrs_c_2 == '*/') && ($top['what'] == SERVICES_JSON_IN_CMT)) {
+                            // found a comment end, and we're in one now
+                            array_pop($stk);
+                            $c++;
+
+                            for ($i = $top['where']; $i <= $c; ++$i)
+                                $chrs = substr_replace($chrs, ' ', $i, 1);
+
+                            //print("Found end of comment at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
+
+                        }
+
+                    }
+
+                    if (reset($stk) == SERVICES_JSON_IN_ARR) {
+                        return $arr;
+
+                    } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) {
+                        return $obj;
+
+                    }
+
+                }
+        }
+    }
+
+    /**
+     * @todo Ultimately, this should just call PEAR::isError()
+     */
+    function isError($data, $code = null)
+    {
+        if (class_exists('pear')) {
+            return PEAR::isError($data, $code);
+        } elseif (is_object($data) && (get_class($data) == 'services_json_error' ||
+                                 is_subclass_of($data, 'services_json_error'))) {
+            return true;
+        }
+
+        return false;
+    }
+}
+
+if (class_exists('PEAR_Error')) {
+
+    class Services_JSON_Error extends PEAR_Error
+    {
+        function Services_JSON_Error($message = 'unknown error', $code = null,
+                                     $mode = null, $options = null, $userinfo = null)
+        {
+            parent::PEAR_Error($message, $code, $mode, $options, $userinfo);
+        }
+    }
+
+} else {
+
+    /**
+     * @todo Ultimately, this class shall be descended from PEAR_Error
+     */
+    class Services_JSON_Error
+    {
+        function Services_JSON_Error($message = 'unknown error', $code = null,
+                                     $mode = null, $options = null, $userinfo = null)
+        {
+
+        }
+    }
+
+}
+    
+?>
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/os/lib/launcher.php
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/os/lib/launcher.php	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/os/lib/launcher.php	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,257 @@
+<?php
+/*
+ * qWikiOffice Desktop 0.8.1
+ * Copyright(c) 2007-2008, Integrated Technologies, Inc.
+ * licensing@xxxxxxxxxxxxxxx
+ * 
+ * http://www.qwikioffice.com/license
+ */
+
+class launcher {
+
+	private $os;
+
+
+
+	public function __construct($os){
+		$this->os = $os;
+	}
+	
+	
+	
+	/** get_id()
+	  * 
+	  * @param {string} launcher (e.g. autorun, contextmenu, quickstart, shortcut, startmenu)
+	  **/
+	private function get_id($launcher){
+		// default
+		$id = '';
+		
+		if($this->os->session->exists() && $launcher != ""){
+			$sql = "select
+				id
+				from
+				qo_launchers
+				where
+				name = '".$launcher."'";
+			
+			if(mysql_num_rows($result = mysql_query($sql)) > 0){
+				$row = mysql_fetch_assoc($result);
+				$id = $row["id"];
+			}
+		}
+		
+		return $id;
+	} // end get_id()
+	
+	
+	
+	/** clear() Clears a members launcher
+	  * 
+	  * @access public
+	  * @param {string} type ["system", "member"]
+	  * @param {string} launcher (e.g. autorun, contextmenu, quickstart, shortcut, startmenu)
+	  **/
+	public function clear($type, $launcher){
+		// default
+		$response = false;
+		
+		// only if system or member type
+		if($launcher != "" && ($type == "system" || $type == "member")){
+			// if system
+			if($type == "system"){
+				$member_id = 0;
+				$group_id = 0;
+			}else{
+				// else is member
+				$member_id = $this->os->session->get_member_id();
+				$group_id = $this->os->session->get_group_id();
+			}
+			
+			if($member_id != "" && $group_id != ""){
+				// get the launchers id
+				$sql = "select id from qo_launchers where name = '".$launcher."'";
+
+				if(mysql_num_rows($result = mysql_query($sql)) > 0){
+					$row = mysql_fetch_assoc($result);
+					
+					// clear members launcher
+					$sql = "DELETE
+						FROM
+						qo_members_has_module_launchers
+						WHERE
+						qo_members_id = ".$member_id."
+						AND
+						qo_groups_id = ".$group_id."
+						AND
+						qo_launchers_id = ".$row["id"];
+					
+					if(mysql_query($sql)){
+						$response = true;
+					}
+				}
+			}
+		}
+		
+		return $response;
+	} // end clear()
+	
+	
+	
+	/** set()
+	  * 
+	  * @access public
+	  * @param {string} type The type of launcher ["system", "member"]
+	  * @param {array} ids An array containing each module's moduleId property
+	  * @param {string} launcher ["autorun", "contextmenu", "quickstart", "shortcut", "startmenu"]
+	  * 
+	  * @usage set("system", ["demo-grid", "tabs-grid"], "shortcut", 10);
+	  **/
+	public function set($member_id, $group_id, $ids, $launcher){
+		// default
+		$response = false;
+
+		if($member_id != "" && $group_id != "" && count($ids) > 0 && $launcher != ""){
+			
+			// get the launcher's Db record id based on its launcher name
+			$launcher_id = $this->get_id($launcher);
+
+			if($launcher_id != ""){
+				// initialize
+				$sort_order = 0;
+
+				// loop through ids array
+				foreach($ids as $id){
+					// get the module's Db record id based on its moduleId property
+					$module_id = $this->os->module->get_id($id);
+					
+					if($module_id != ""){
+						$sql = "INSERT INTO
+							qo_members_has_module_launchers
+							(qo_members_id,
+							qo_groups_id,
+							qo_modules_id,
+							qo_launchers_id,
+							sort_order)
+							VALUES
+							(".$member_id.",
+							".$group_id.",
+							".$module_id.",
+							".$launcher_id.",
+							".$sort_order.")";
+						
+						mysql_query($sql);
+						
+						$response = true;
+						
+						/* ToDo: handle errors
+						if(!mysql_query($sql))
+						{
+							$response = true;
+						} */
+					
+						$sort_order++;
+					}
+				}
+			}
+		}
+		
+		return $response;
+	} // end set()
+	
+	
+	
+	/** get()
+	  *
+	  * @access public
+	  * @param {integer} $member_id
+	  * @param {integer} $group_id
+	  **/
+	public function get($member_id, $group_id){
+		$response = array();
+		
+		if($member_id != "" && $group_id != ""){			
+			// get the launchers
+			$sql = "SELECT
+				id,
+				name
+				FROM
+				qo_launchers";
+			
+			if($result = mysql_query($sql)){
+				while($row = mysql_fetch_assoc($result)){
+					$response[$row["name"]] = $this->get_modules($member_id, $group_id, $row["id"]);
+				}
+			}
+		}
+		
+		return $response;
+	} // end get()
+	
+	
+	
+	/** get_all() Will load ALL the launchers associated
+	  * with a member (in group) at once.  Includes the default launchers
+	  *
+	  * @access private
+	  * @param $member_id int, the member id
+	  **/
+	public function get_all(){
+		$member_id = $this->os->session->get_member_id();
+		$group_id = $this->os->session->get_group_id();
+		
+		if($member_id != "" && $group_id != ""){
+			// get system default			
+			$l_default = $this->get("0", "0");
+			
+			// get member preferences
+			$l_member = $this->get($member_id, $group_id);
+		}
+		
+		// overwrite system default launchers with member preference
+		if(count($l_member) > 0){
+			$launchers = $this->os->overwrite_assoc_array($l_default, $l_member);
+		}else{
+			$launchers = $l_default;
+		}
+		
+		return json_encode($launchers);
+	} // end get_all()
+	
+	
+	
+	/** get_modules() Returns an array containing all modules for the passed in launcher.
+	  * 
+	  * @param {integer} $member_id
+	  * @param {integer} $group_id
+	  * @param {integer} $launcher_id
+	  **/
+	private function get_modules($member_id, $group_id, $launcher_id){
+	    $response = array();
+	    
+	    if($member_id != '' && $group_id != '' && $launcher_id != ''){
+	    	$sql = "SELECT
+				M.module_id as moduleId
+				FROM
+				qo_members_has_module_launchers ML
+					-- Modules --
+					INNER JOIN qo_modules AS M ON M.id = ML.qo_modules_id
+				WHERE
+				qo_launchers_id = ".$launcher_id."
+				AND
+				qo_members_id = ".$member_id."
+				AND
+				qo_groups_id = ".$group_id."
+				ORDER BY  ML.sort_order asc";
+			
+			if($result = mysql_query($sql)){
+				while($row = mysql_fetch_assoc($result)){
+			    	$response[] = $row["moduleId"];
+				}
+			}
+	    }
+	    
+	    return $response;
+	} // end get_modules()
+}
+?>
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/os/lib/member.php
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/os/lib/member.php	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/os/lib/member.php	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,229 @@
+<?php
+/*
+ * qWikiOffice Desktop 0.8.1
+ * Copyright(c) 2007-2008, Integrated Technologies, Inc.
+ * licensing@xxxxxxxxxxxxxxx
+ * 
+ * http://www.qwikioffice.com/license
+ */
+
+class member {
+
+	private $os;
+
+
+
+	public function __construct($os){
+		$this->os = $os;
+	}
+
+
+
+	/** exits() Returns true if a record exists for the passed in email address.
+	  * 
+	  * @param {string} $email The members email address
+	  * @return {boolean}
+	  **/
+	public function exists($email){
+		
+		$response = false;
+		
+		if($email != ''){
+			$sql = "SELECT
+				id
+				FROM
+				qo_members
+				WHERE
+				email_address = '".$email."'";
+			
+			if(mysql_num_rows($result = mysql_query($sql)) > 0){
+				$response = true;
+			}
+		}
+		
+		return $response;
+	} // end exits()
+	
+	
+	
+	/** is_active()
+	  * 
+	  * @param {string} $email The members email address
+	  * @return {boolean}
+	  **/
+	public function is_active($email){
+		$response = false;
+			
+		if($email != ''){
+			$sql = "SELECT
+				active
+				FROM
+				qo_members
+				WHERE
+				email_address = '".$email."'";
+				
+			if(mysql_num_rows($result = mysql_query($sql)) > 0){
+				$row = mysql_fetch_assoc($result);
+				
+				if($row["active"] == 1){
+					$response = true;
+				}
+			}
+		}
+		
+		return $response;
+	} // end is_active()
+	
+	
+	
+	/** get_name() Returns the name of a member.
+	  *
+	  * @param $member_id integer
+	  **/
+	function get_name($member_id){
+		$response = '';
+		
+		if($member_id != ""){
+			// query the db for the members name
+			$sql = "SELECT
+				first_name,
+				last_name
+				FROM
+				qo_members
+				WHERE
+				id = ".$member_id;
+			
+			if(mysql_num_rows($result = mysql_query($sql)) > 0){
+				$row = mysql_fetch_assoc($result);
+				$response = $row['first_name']." ".$row['last_name'];
+			}
+		}
+		
+		return $response;
+	} // end get_name()
+	
+	
+	
+	/** clear() Clears a members launcher
+	  * 
+	  * @access public
+	  * @param {string} type ["system", "member"]
+	  * @param {string} launcher (e.g. autorun, contextmenu, quickstart, shortcut, startmenu)
+	  **/
+	public function clear($type, $launcher){
+		// default
+		$response = false;
+		
+		// only if system or member type
+		if($launcher != "" && ($type == "system" || $type == "member")){
+			// if system
+			if($type == "system"){
+				$member_id = 0;
+				$group_id = 0;
+			}else{
+				// else is member
+				$member_id = $this->os->session->get_member_id();
+				$group_id = $this->os->session->get_group_id();
+			}
+			
+			if($member_id != "" && $group_id != ""){
+				// get the launchers id
+				$sql = "select id from qo_launchers where name = '".$launcher."'";
+
+				if(mysql_num_rows($result = mysql_query($sql)) > 0){
+					$row = mysql_fetch_assoc($result);
+					
+					// clear members launcher
+					$sql = "DELETE
+						FROM
+						qo_members_has_module_launchers
+						WHERE
+						qo_members_id = ".$member_id."
+						AND
+						qo_groups_id = ".$group_id."
+						AND
+						qo_launchers_id = ".$row["id"];
+					
+					if(mysql_query($sql)){
+						$response = true;
+					}
+				}
+			}
+		}
+		
+		return $response;
+	} // end clear()
+	
+	
+	
+	/** set()
+	  * 
+	  * @access public
+	  * @param {string} type The type of launcher ["system", "member"]
+	  * @param {array} ids An array containing each module's moduleId property
+	  * @param {string} launcher ["autorun", "contextmenu", "quickstart", "shortcut", "startmenu"]
+	  * 
+	  * @usage set("system", ["demo-grid", "tabs-grid"], "shortcut", 10);
+	  **/
+	public function set($type, $ids, $launcher){
+		// default
+		$response = false;
+
+		if($launcher != "" && ($type == "system" || $type == "member")){
+			// if system
+			if($type == "system"){
+				$member_id = 0;
+				$group_id = 0;
+			}else{
+				// else is member
+				$member_id = $this->os->session->get_member_id();
+				$group_id = $this->os->session->get_group_id();
+			}
+
+			// get the launcher's Db record id based on its launcher name
+			$launcher_id = $this->os->get_launcher_id($launcher);
+
+			if($member_id != "" && $group_id != "" && $launcher_id != ""){
+				// initialize
+				$sort_order = 0;
+
+				// loop through ids array
+				foreach($ids as $id){
+					// get the module's Db record id based on its moduleId property
+					$module_id = $this->os->get_module_id($id);
+					
+					if($module_id != ""){
+						$sql = "INSERT INTO
+							qo_members_has_module_launchers
+							(qo_members_id,
+							qo_groups_id,
+							qo_modules_id,
+							qo_launchers_id,
+							sort_order)
+							VALUES
+							(".$member_id.",
+							".$group_id.",
+							".$module_id.",
+							".$launcher_id.",
+							".$sort_order.")";
+						
+						mysql_query($sql);
+						
+						$response = true;
+						
+						/* ToDo: handle errors
+						if(!mysql_query($sql))
+						{
+							$response = true;
+						} */
+					
+						$sort_order++;
+					}
+				}
+			}
+		}
+		
+		return $response;
+	} // end set()
+}
+?>
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/os/lib/module.php
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/os/lib/module.php	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/os/lib/module.php	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,426 @@
+<?php
+/*
+ * qWikiOffice Desktop 1.0
+ * Copyright(c) 2007-2008, Integrated Technologies, Inc.
+ * licensing@xxxxxxxxxxxxxxx
+ * 
+ * http://www.qwikioffice.com/license
+ */
+
+class module {
+
+	private $os;
+	
+	public function __construct($os){
+		$this->os = $os;
+	}
+	
+	/** init() Initial page load or refresh has occured
+	  * 
+	  **/
+	public function init(){
+	    if(isset($_SESSION['modules'])){
+	        unset($_SESSION['modules']);
+	    }
+	    
+		if(isset($_SESSION['dependencies'])){
+			unset($_SESSION['dependencies']);
+		}
+	}
+	
+	/** is_loadable() Returns true if all of the module's files (and dependencies) are found.
+	  * The module can be loaded.
+	  * 
+	  * @param {string} $moduleId The client moduleId property 
+	  **/
+	private function is_loadable($moduleId){
+	    $response = false;
+	    
+	    if(!isset($_SESSION['modules'])){
+	        $this->find_files();
+	    }
+	    
+	    if(isset($_SESSION['modules']['can_load'][$moduleId])){
+			if($_SESSION['modules']['can_load'][$moduleId]){
+				$response = true;
+			}
+		}
+		
+		return $response;
+	} // end is_loadable()
+	
+	
+	
+	/** find_files() Queries the Db and checks the module files.
+	  * Results are stored in session.
+	  **/
+	private function find_files(){
+	    $member_id = $this->os->session->get_member_id();
+		$group_id = $this->os->session->get_group_id();
+		
+		if($member_id != "" && $group_id != ""){
+	    	unset($_SESSION['modules']);
+	    	
+	    	$modules_dir = $this->os->get_module_dir();
+			
+			$sql = "SELECT
+				M.id,
+				M.module_id AS moduleId,
+				concat(F.directory, F.file) AS path
+				FROM
+				qo_modules_files AS F
+					INNER JOIN qo_modules AS M ON M.id = F.qo_modules_id
+				WHERE
+				M.active = 1";
+			
+			if($result = mysql_query($sql)){
+				$prev_module = '';
+				$is_allowed = false;
+						
+				while($row = mysql_fetch_assoc($result)){
+					$cur_module = $row['id'];
+					
+					if($prev_module != $cur_module){
+						$prev_module = $cur_module;
+						$is_loadable = 1;
+
+						if($this->os->privilege->is_allowed("loadModule", $row["moduleId"], $member_id, $group_id)){					    
+						    if(!$this->check_dependencies($modules_dir, $cur_module)){
+								$is_loadable = 0;
+							}
+							$is_allowed = true;
+						}else{
+						    $is_allowed = false;
+						}
+					}
+					
+					if($is_allowed){
+						$path = $row['path'];
+						if($path != ''){
+							if(!is_file($modules_dir.$path)){
+								$_SESSION['modules']['has_error'][] = 'Script: module.php, Method: find_files, Missing file: '.$modules_dir.$path;
+								$is_loadable = 0;
+							}
+						}
+					}
+
+					// store in session
+					$_SESSION['modules']['can_load'][ $row['moduleId'] ] = $is_loadable;
+				}
+				
+				// report errors
+				if(count($_SESSION['modules']['has_error']) > 0){
+				    $this->os->error->log($_SESSION['modules']['has_error']);
+				}
+			}
+	    }
+	} // end find_files()
+	
+	
+	
+	/** check_dependencies()
+	  * 
+	  * $param {integer} $id The server (database) module id
+	  **/
+	private function check_dependencies($modules_dir, $id){
+		$response = true;
+	    
+	    $sql = "SELECT
+	    	M.module_id AS moduleId,
+			D.directory,
+			D.file
+			FROM
+			qo_modules_has_dependencies AS MD
+				INNER JOIN qo_dependencies AS D ON D.id = MD.qo_dependencies_id
+				INNER JOIN qo_modules AS M ON M.id = MD.qo_modules_id
+			WHERE
+			M.id = ".$id;
+		
+		if($result = mysql_query($sql)){
+		    while($row = mysql_fetch_assoc($result)){
+				$path = $row['directory'].$row['file'];
+				if($path != ''){
+					if(!is_file($modules_dir.$path)){
+						$_SESSION['modules']['has_error'][] = 'Script: module.php, Method: check_dependencies, Missing file: '.$modules_dir.$path;
+						$response = false;
+					}
+				}
+		    }
+		}
+	    
+	    return $response;
+	} // end check_dependencies()
+	
+	
+	
+	/** get_id() Returns the id of a module's database record.
+	  * 
+	  * @param {string} $moduleId The client module's moduleId property.
+	  **/
+	public function get_id($moduleId){
+		$id = '';
+		
+		if($this->os->session->exists() && $moduleId != ""){
+			$sql = "SELECT
+				id
+				FROM
+				qo_modules
+				WHERE
+				module_id = '".$moduleId."'";
+			
+			if(mysql_num_rows($result = mysql_query($sql)) > 0){
+				$row = mysql_fetch_assoc($result);
+				$id = $row["id"];
+			}
+		}
+		
+		return $id;
+	} // end get_id()
+	
+	
+	
+	/** get_all() Returns new instances of the loaded modules.
+	  * Used by getModules() of QoDesk.php
+	  **/
+	public function get_all(){
+		$response = '';
+		$m = $_SESSION['modules']['loaded'];
+		
+		for($i = 0, $len = count($m); $i < $len; $i++){
+			$response .= "new ".$m[$i]['class']."(),";
+		}
+		
+		$response = rtrim($response, ","); // trim the trailing comma
+		
+		return $response;
+	} // end get_all()
+	
+	
+	
+	/** get_css() Returns a string of all css files to include
+	  * Used by index.php
+	  **/
+	public function get_css(){
+		$response = '';
+		$member_id = $this->os->session->get_member_id();
+		$group_id = $this->os->session->get_group_id();
+		$modules_dir = $this->os->get_module_dir();
+		
+		if($member_id != "" && $group_id != ""){
+			$sql = "SELECT
+				M.module_id AS moduleId,
+				F.directory,
+				F.file
+				FROM
+				qo_modules_files AS F
+					INNER JOIN qo_modules AS M ON M.id = F.qo_modules_id
+				WHERE
+				F.is_stylesheet = 1
+				AND
+				M.active = 1";
+			
+			if($result = mysql_query($sql)){				
+				while($row = mysql_fetch_assoc($result)){
+					// if the member is not allowed to load this module, skip it
+				    if(!$this->os->privilege->is_allowed("loadModule", $row["moduleId"], $member_id, $group_id)){
+				    	continue;
+				    }
+				    
+				    if(!$this->is_loadable($row["moduleId"])){
+				        continue;
+				    }
+				    
+				    $response .= '<link rel="stylesheet" type="text/css" href="'.$modules_dir.$row["directory"].$row["file"].'" />';
+				}
+			}
+			
+			$response;
+		}
+		
+		return $response;
+	} // end get_css()
+	
+	
+	
+	/** load() Prints the contents of the module's javascript files.
+	  * Dependencies will also be loaded if needed.
+	  * Used for Module on Demand functionality.
+	  * 
+	  * @param {string} $moduleId The client moduleId property
+	  **/
+	public function load($moduleId){
+		
+		$module_id = $this->get_id($moduleId); // the server (database) module id
+		$member_id = $this->os->session->get_member_id();
+		$group_id = $this->os->session->get_group_id();
+		
+		if($module_id != "" && $member_id != "" && $group_id != ""){
+			
+			// if the member is not allowed to load this module, skip it
+	    	if(!$this->os->privilege->is_allowed("loadModule", $moduleId, $member_id, $group_id)){
+	    		die("{success: false, msg: 'You do not have the required privileges!'}");
+	    	}
+	    
+			$document_root = $this->os->get_document_root();
+			$modules_dir = $this->os->get_module_dir();
+			
+			// get module dependencies based on the member group
+			$sql = "SELECT
+				D.id,
+		    	D.directory,
+				D.file
+				FROM
+				qo_modules_has_dependencies AS MD
+					INNER JOIN qo_dependencies AS D ON D.id = MD.qo_dependencies_id
+					INNER JOIN qo_modules AS M ON M.id = MD.qo_modules_id
+				WHERE
+				M.active = 1
+				AND
+				M.id = ".$module_id;
+			
+			if($result = mysql_query($sql)){
+				while($row = mysql_fetch_assoc($result)){
+					if($_SESSION['dependencies']['loaded'][ $row['id'] ]){ continue; }
+					
+				    print file_get_contents($document_root.$modules_dir.$row["directory"].$row["file"]);
+				    $_SESSION['dependencies']['loaded'][ $row['id'] ] = 1;
+				}
+			}
+			
+			// get module files
+			$sql = "SELECT
+				F.directory,
+				F.file
+				FROM
+				qo_modules_files AS F
+					INNER JOIN qo_modules AS M ON M.id = F.qo_modules_id
+				WHERE
+				F.is_stylesheet = 0
+				AND
+				F.is_server_module = 0
+				AND
+				F.is_client_module = 0
+				AND
+				M.active = 1
+				AND
+				M.id = '".$module_id."'";
+			
+			if($result = mysql_query($sql)){
+				while($row = mysql_fetch_assoc($result)){				    
+				    print file_get_contents($document_root.$modules_dir.$row["directory"].$row["file"]);
+				}
+			}
+		}
+	} // end load()
+	
+	
+	
+	/** load_all() Prints the content of all the client module files
+	  **/
+	public function load_all(){
+		$member_id = $this->os->session->get_member_id();
+		$group_id = $this->os->session->get_group_id();
+		
+		if($member_id != "" && $group_id != ""){
+			$document_root = $this->os->get_document_root();
+			$modules_dir = $this->os->get_module_dir();
+			
+			// get active modules
+			$sql = "SELECT
+				M.module_id AS moduleId,
+				F.directory,
+				F.file,
+				F.class_name AS class
+				FROM
+				qo_modules_files AS F
+					INNER JOIN qo_modules AS M ON M.id = F.qo_modules_id
+				WHERE
+				F.is_client_module = 1
+				AND
+				M.active = 1";
+			
+			if($result = mysql_query($sql)){
+				$count = 0;
+				
+				while($row = mysql_fetch_assoc($result)){
+					if($row['moduleId'] != '' && $row['directory'] != '' && $row['file'] != '' && $row['class'] != ''){
+						
+						// if the member is not allowed to load this module, skip it
+					    if(!$this->os->privilege->is_allowed("loadModule", $row["moduleId"], $member_id, $group_id)){
+					    	continue;
+					    }
+					    
+					    // if the module is not valid
+					    if(!$this->is_loadable($row["moduleId"])){
+					        continue;
+					    }
+					    
+					    print file_get_contents($document_root.$modules_dir.$row["directory"].$row["file"]);
+					    
+					    // track loaded modules
+					    $_SESSION['modules']['loaded'][$count]['moduleId'] = $row["moduleId"];
+					    $_SESSION['modules']['loaded'][$count]['class'] = $row["class"];
+					    
+					    $count++;
+					}
+				}
+			}
+		}
+	} // end load_all()
+	
+	
+	
+	/** run_action() Will check the users privileges and execute the action if allowed
+	  * 
+	  * @param {string} $moduleId The client moduleId property
+	  * @param {string} $action, the name of the action/method to call (e.g. $module->action())
+	  **/
+	public function run_action($moduleId, $action){
+		$member_id = $this->os->session->get_member_id();
+		$group_id = $this->os->session->get_group_id();
+
+		if($member_id == '' || $group_id == ''){
+			die("{success: false, msg: 'You are not currently logged in'}");
+		}else{
+			//if member is allowed this action on this module
+			if(!$this->os->privilege->is_allowed($action, $moduleId, $member_id, $group_id)){
+				die("{success: false, msg: 'You do not have the required privileges!'}");
+			}
+			
+			$sql = "SELECT
+				F.directory,
+				F.file,
+				F.class_name AS class
+				FROM
+				qo_modules_files AS F
+					INNER JOIN qo_modules AS M ON M.id = F.qo_modules_id
+				WHERE
+				F.is_server_module = 1
+				AND
+				M.active = 1
+				AND
+				M.module_id = '".$moduleId."'";
+				
+			if(mysql_num_rows($result = mysql_query($sql)) > 0){
+				$row = mysql_fetch_assoc($result);
+				$module_dir = $this->os->get_module_dir();
+				
+				$file = $module_dir.$row["directory"].$row["file"];
+				$class = $row["class"];
+
+				if(is_file($file)){
+					require($file);
+
+					if(class_exists($class)){				
+						$module = new $class($this->os);
+
+						if(method_exists($module, $action)){
+							$module->$action();
+						}
+					}
+				}
+			}
+		}
+	} // end run_action()
+}
+?>
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/os/lib/preference.php
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/os/lib/preference.php	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/os/lib/preference.php	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,283 @@
+<?php
+/*
+ * qWikiOffice Desktop 0.8.1
+ * Copyright(c) 2007-2008, Integrated Technologies, Inc.
+ * licensing@xxxxxxxxxxxxxxx
+ * 
+ * http://www.qwikioffice.com/license
+ */
+
+class preference {
+
+	private $os;
+
+
+
+	public function __construct($os){
+		$this->os = $os;
+	}
+
+
+
+	/** get_styles() Returns all the styles associated with a member (in group)
+	  * for this session.
+	  *
+	  * @access public
+	  **/
+	public function get_styles(){
+		$styles = '{}';
+		
+		$member_id = $this->os->session->get_member_id();
+		$group_id = $this->os->session->get_group_id();
+		
+		if($member_id != "" && $group_id != ""){
+			// get system default
+			$s_default = $this->get_style("0", "0");
+			
+			// get group default
+			$s_group = $this->get_style("0", $group_id);
+			
+			// get member preferences
+			$s_member = $this->get_style($member_id, $group_id);
+		}
+		
+		// default styles
+		$styles = $s_default;
+		
+		// overwrite with group default
+		if(count($s_group) > 0){
+			$styles = $this->os->overwrite_assoc_array($styles, $s_group);
+		}
+		
+		// overwrite with member preference
+		if(count($s_member) > 0){
+			$styles = $this->os->overwrite_assoc_array($styles, $s_member);
+		}
+		
+		return json_encode($styles);
+	} // end get_styles()
+	
+	
+	
+	/** get_style() Will return the style associated with a member (in group).
+	  *
+	  * @access private
+	  * @param $member_id int, the member id
+	  * @param $group_id int, the group id
+	  **/
+	private function get_style($member_id, $group_id){
+		$response = array();
+		
+		if($member_id != "" && $group_id != ""){			
+			// get system default
+			$sql = "SELECT
+				backgroundcolor,
+				fontcolor,
+				transparency,
+				T.id AS themeid,
+				T.name AS themename,
+				T.path_to_file AS themefile,
+				W.id AS wallpaperid,
+				W.name AS wallpapername,
+				W.path_to_file AS wallpaperfile,
+				wallpaperposition
+				FROM
+				qo_styles S
+					-- Themes --
+					INNER JOIN qo_themes AS T ON T.id = S.qo_themes_id
+					-- Wallpapers --
+					INNER JOIN qo_wallpapers AS W ON W.id = S.qo_wallpapers_id
+				WHERE
+				qo_members_id = ".$member_id."
+				AND
+				qo_groups_id = ".$group_id;
+			
+			$result = mysql_query($sql);
+			
+			// if a record was returned
+			if(mysql_num_rows($result = mysql_query($sql)) > 0){
+				$row = mysql_fetch_assoc($result);
+				
+				$response["backgroundcolor"] = $row["backgroundcolor"];
+				$response["fontcolor"] = $row["fontcolor"];
+				$response["transparency"] = $row["transparency"];
+				$response["theme"] = array(
+					"id" => $row["themeid"],
+					"name" => $row["themename"],
+					"pathtofile" => $this->os->config->THEMES_DIR.$row["themefile"]
+				);
+				$response["wallpaper"] = array(
+					"id" => $row["wallpaperid"],
+					"name" => $row["wallpapername"],
+					"pathtofile" => $this->os->config->WALLPAPERS_DIR.$row["wallpaperfile"]
+				);
+				$response["wallpaperposition"] = $row["wallpaperposition"];
+			}
+		}
+		
+		return $response;
+	} // end get_style()
+	
+	
+	
+	/** set_style() Creates a new style record, or updates one if it already exists
+	  * 
+	  * @param {integer} $member_id
+	  * @param {integer} $group_id
+	  * @param {array} $styles
+	  * @return {boolean}
+	  **/
+	public function set_styles($styles){
+		$result = false;
+		$member_id = $this->os->session->get_member_id();
+		$group_id = $this->os->session->get_group_id();
+		
+		if($member_id != "" && $group_id != ""){			
+			if($this->style_exists($member_id, $group_id)){
+				$sql = "update
+					qo_styles
+					set
+					backgroundcolor = '".$styles['backgroundcolor']."',
+					fontcolor = '".$styles['fontcolor']."',
+					qo_themes_id = ".$styles['theme_id'].",
+					transparency = '".$styles['transparency']."',
+					qo_wallpapers_id = ".$styles['wallpaper_id'].",
+					wallpaperposition = '".$styles['wallpaperposition']."'
+					where
+					qo_members_id = ".$member_id." and
+					qo_groups_id = ".$group_id;
+			}else{
+				$sql = "insert into qo_styles (
+					qo_members_id,
+					qo_groups_id,
+					backgroundcolor,
+					fontcolor,
+					qo_themes_id,
+					transparency,
+					qo_wallpapers_id,
+					wallpaperposition)
+					values (
+					".$styles['member_id'].",
+					".$styles['group_id'].",
+					'".$styles['backgroundcolor']."',
+					'".$styles['fontcolor']."',
+					".$styles['theme_id'].",
+					'".$styles['transparency']."',
+					".$styles['wallpaper_id'].",
+					'".$styles['wallpaperposition']."')";
+			}
+			
+			if(mysql_query($sql)){
+				$result = true;
+			}
+		}
+		
+		return $result;
+	} // end set_styles()
+	
+	
+	
+	/** style_exists() Returns true if a style record exists for the member id and group id.
+	  * 
+	  * @param {integer} $member_id
+	  * $param {integer} $group_id
+	  * @return boolean
+	  **/
+	private function style_exists($member_id, $group_id){
+		$result = false;
+		
+		if($member_id != "" && $group_id != ""){				
+			$sql = "select
+				transparency
+				from
+				qo_styles
+				where
+				qo_members_id = ".$member_id." and
+				qo_groups_id = ".$group_id;
+		
+			// if a record exists
+			if(mysql_num_rows(mysql_query($sql)) > 0){
+				$result = true;
+			}
+		}
+		
+		return $result;
+	} // end style_exists()
+	
+	
+	
+	/** get_theme_thumbs()
+	  **/
+	public function get_theme_thumbs(){
+	    $themes = "{'images': []}";
+	    $member_id = $this->os->session->get_member_id();
+	    
+	    if($member_id != ''){
+	        $sql = "select
+				id,
+				name,
+				path_to_thumbnail as pathtothumbnail,
+				path_to_file as pathtofile
+				from
+				qo_themes
+				order by name";
+		
+			if($result = mysql_query($sql)){
+				$items = array();
+				$count = 0;
+				$path = $this->os->config->THEMES_DIR;
+				
+				while($row = mysql_fetch_assoc($result)){
+					$items[$count] = $row;
+					$items[$count]["pathtothumbnail"] = $path.$items[$count]["pathtothumbnail"];
+					$items[$count]["pathtofile"] = $path.$items[$count]["pathtofile"];
+					
+					$count++;
+				}
+				
+				$themes = '{"images":'.json_encode($items).'}';
+			}
+	    }
+	    
+	    return $themes;
+	} // end get_theme_thumbs()
+	
+	
+	
+	/** get_wallpaper_thumbs()
+	  **/
+	public function get_wallpaper_thumbs(){
+	    $wallpapers = "{'images': []}";
+	    $member_id = $this->os->session->get_member_id();
+	    
+	    if($member_id != ''){
+	        $sql = "select
+				id,
+				name,
+				path_to_thumbnail as pathtothumbnail,
+				path_to_file as pathtofile
+				from
+				qo_wallpapers
+				order by name";
+		
+			if($result = mysql_query($sql)){
+				$items = array();
+				$count = 0;
+				$path = $this->os->config->WALLPAPERS_DIR;
+				
+				while($row = mysql_fetch_assoc($result)){
+					$items[$count] = $row;
+					$items[$count]["pathtothumbnail"] = $path.$items[$count]["pathtothumbnail"];
+					$items[$count]["pathtofile"] = $path.$items[$count]["pathtofile"];
+					
+					$count++;
+				}
+				
+				$wallpapers = '{"images":'.json_encode($items).'}';
+			}
+	    }
+	    
+	    return $wallpapers;
+	} // end get_wallpaper_thumbs
+}
+?>
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/os/lib/privilege.php
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/os/lib/privilege.php	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/os/lib/privilege.php	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,228 @@
+<?php
+/*
+ * qWikiOffice Desktop 0.8.1
+ * Copyright(c) 2007-2008, Integrated Technologies, Inc.
+ * licensing@xxxxxxxxxxxxxxx
+ * 
+ * http://www.qwikioffice.com/license
+ */
+
+class privilege {
+	
+    private $os;
+    
+    public function __construct($os){
+        $this->os = $os;
+    }
+    
+    /** init() Initial page load or refresh has occured 
+	  **/
+	public function init(){
+		if(isset($_SESSION['privileges'])){
+	        unset($_SESSION['privileges']);
+	    }
+	}
+    
+    /** get_all() Will return all the privileges associated with a member for the current session.
+	  *
+	  * @access public
+	  * @param {integer} $member_id The member id
+	  * @param {integer} $group_id The group id
+	  **/
+	public function get_all($member_id, $group_id){
+		$privileges = array();
+		
+		$member_id = $this->os->session->get_member_id();
+		$group_id = $this->os->session->get_group_id();
+		
+		if($member_id != "" && $group_id != ""){
+			
+			unset($_SESSION['privileges']);
+		
+			$sql = "SELECT
+				is_allowed,
+				P.is_singular AS is_privilege_singular,
+				A.name AS action,
+				D.is_singular AS is_domain_singular,
+				M.id AS module_id,
+				M.module_id AS moduleId,
+				G.importance
+				FROM qo_groups_has_domain_privileges AS GDP
+					-- Privileges Joins --
+					INNER JOIN qo_privileges AS P ON P.id = GDP.qo_privileges_id 
+					INNER JOIN qo_privileges_has_module_actions AS PA ON PA.qo_privileges_id = P.id
+					INNER JOIN qo_modules_actions AS A ON A.id = PA.qo_modules_actions_id
+					-- Domain Joins --
+					INNER JOIN qo_domains AS D ON D.id = GDP.qo_domains_id
+					INNER JOIN qo_domains_has_modules AS DM ON DM.qo_domains_id = D.id
+					INNER JOIN qo_modules AS M ON M.id = DM.qo_modules_id
+					-- Groups to member Joins --
+					INNER JOIN qo_groups AS G ON G.id = GDP.qo_groups_id
+					INNER JOIN qo_groups_has_members AS MG ON MG.qo_groups_id = G.id
+				WHERE
+				qo_members_id = ".$member_id."
+				AND
+				G.id = ".$group_id."
+				ORDER BY
+				A.name, G.importance DESC";
+			
+			$result = mysql_query($sql);
+			
+			// Initialise variables.
+			$weight = -1; // Used to find out which privileges take precedence.
+			$is_allowed = 0; // FALSE, initialise
+			$prev_importance = '';
+			$prev_action= '';
+			$prev_module = '';
+			$prev_is_allowed= '';
+			$count = 0;
+			$arr_data = array(); // Store temporary data
+			
+			// Loop through all matches
+			while($row = mysql_fetch_assoc($result)){
+				$action = $row["action"];
+				$module_id = $row["module_id"]; // MySQL table id
+				$moduleId = $row["moduleId"]; // moduleId property of the module
+				$importance = $row["importance"];
+				$is_allowed = (int) $row["is_allowed"];
+				
+				// We are only interested in the groups with the most importance (i.e. Some groups may have the same importance.)
+				
+				if ($count > 0 && $action === $prev_action && $module_id === $prev_module){
+					if ($importance < $prev_importance || $prev_is_allowed === 0){
+						continue;
+					}
+				}
+				
+				$new_weight = (int) $row["is_privilege_singular"] + (int) $row["is_domain_singular"];
+				
+				if ($new_weight > $weight){
+					
+					$weight = $new_weight;
+				}
+				else if ($new_weight == $weight && (int) $is_allowed === 1 && $is_allowed === 0){
+					
+					// We always give more weight to denials.
+					$weight = $new_weight;
+				}
+				
+				//echo "Group: ".$row["group"]."<br /> weight: ".$new_weight."<br />is_allowed: ".$row["is_allowed"]."<br>";
+				
+				$prev_importance = $importance;
+				$prev_module = $module_id;
+				$prev_action = $action;
+				$prev_is_allowed = $is_allowed;
+				
+				$count++;
+				
+				// store value in sessions for next time
+				// note: module id here referes to the MySQL record id
+				$_SESSION['privileges'][$action][$moduleId] = $is_allowed;
+				
+				// store value in an array to return
+				if($is_allowed){
+					// note: moduleId here referes to the javascript moduleId
+					$privileges[$action][] = $moduleId;
+				}
+				//$privileges[$action][$module_id] = $is_allowed;
+			}
+		}
+		
+		return json_encode($privileges);
+	} // end get_all()
+	
+	/** is_allowed() checks whether a member (in group) is allowed
+	  * an action on a module.
+	  *
+	  * @param {string} $action The action name
+	  * @param {integer} $module_id The module id
+	  * @param {integer} $member_id The member id
+	  * @param {integer} $group_id The group id
+	  * @return {boolean}
+	  **/
+	public function is_allowed($action, $moduleId, $member_id, $group_id){
+		
+		if($member_id != "" && $group_id != "" && $action != "" && $moduleId != ""){
+			
+			// check if answer is already in sessions
+			if(isset($_SESSION['privileges'][$action][$moduleId])){
+				if($_SESSION['privileges'][$action][$moduleId]){
+					return TRUE;
+				}else{
+					return FALSE;
+				}
+			}
+
+			$sql = "SELECT
+				is_allowed,
+				P.is_singular AS is_privilege_singular,
+				D.is_singular AS is_domain_singular,
+				G.importance
+				FROM
+				qo_groups_has_domain_privileges AS GDP
+					-- Privileges Joins --
+					INNER JOIN qo_privileges AS P ON P.id = GDP.qo_privileges_id 
+					INNER JOIN qo_privileges_has_module_actions AS PA ON PA.qo_privileges_id = P.id
+					INNER JOIN qo_modules_actions AS A ON A.id = PA.qo_modules_actions_id
+					-- Domain Joins --
+					INNER JOIN qo_domains AS D ON D.id = GDP.qo_domains_id
+					INNER JOIN qo_domains_has_modules AS DM ON DM.qo_domains_id = D.id
+					INNER JOIN qo_modules AS M ON M.id = DM.qo_modules_id
+					-- Groups to members Joins --
+					INNER JOIN qo_groups AS G ON G.id = GDP.qo_groups_id
+					INNER JOIN qo_groups_has_members AS MG ON MG.qo_groups_id = G.id
+				WHERE
+				qo_members_id = ".$member_id."
+				AND
+				G.id = ".$group_id."
+				AND
+				A.name = '".$action."'
+				AND
+				M.module_id = '".$moduleId."'
+				ORDER BY
+				G.importance DESC, G.name";
+			
+			$result = mysql_query($sql);
+			
+			// Initialise variables.
+			$weight = -1; // Used to find out which privileges take precedence.
+			$is_allowed = 0; // FALSE, initialise
+			$prev_importance = '';
+			$count = 0;
+			
+			while($row = mysql_fetch_assoc($result)){
+				$importance = $row["importance"];
+				$is_allowed = (int) $row["is_allowed"];
+				
+				// Only interested in the groups with the most importance (i.e. Some groups may have the same importance.)
+				if ($count > 0 && $importance !== $prev_importance){
+					break;
+				}
+				
+				$new_weight = (int) $row["is_privilege_singular"] + (int) $row["is_domain_singular"];
+				
+				if ($new_weight > $weight){
+					$weight = $new_weight;
+				}else if($new_weight == $weight && (int) $is_allowed === 1 && (int) $is_allowed === 0){
+					// Give more weight to denials.
+					$weight = $new_weight;
+				}
+				
+				$prev_importance = $importance;
+				$count++;
+				
+			}
+		}
+		
+		// Store value in sessions for next time
+		$_SESSION['privileges'][$action][$moduleId] = $is_allowed;
+		
+		// Return answer
+		if ($is_allowed){
+			return true;
+		}else{
+			return false;
+		}
+	} // end is_allowed()
+}
+?>
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/os/lib/session.php
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/os/lib/session.php	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/os/lib/session.php	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,299 @@
+<?php
+/*
+ * qWikiOffice Desktop 0.8.1
+ * Copyright(c) 2007-2008, Integrated Technologies, Inc.
+ * licensing@xxxxxxxxxxxxxxx
+ * 
+ * http://www.qwikioffice.com/license
+ */
+
+class session {
+	
+	private $os;
+	
+	
+	
+	public function __construct($os){
+		$this->os = $os;
+	}
+	
+	
+	
+	/** get_id() Returns the id of the current session.
+	  *
+	  * @access private
+	  **/
+	public function get_id(){
+		if(isset($_COOKIE["sessionId"])){
+			return $_COOKIE["sessionId"];
+		}else{
+		    return null;
+		}
+	} // end get_id()
+	
+	
+	
+	/** get_member_id() Returns the id of member from the current session.
+	  *
+	  * @param $session_id string
+	  **/
+	public function get_member_id(){
+		$response = '';
+		$session_id = $this->get_id();
+		
+		if($session_id != ""){
+			$sql = "select
+				qo_members_id as id
+				from
+				qo_sessions
+				where
+				id = '".$session_id."'";
+				
+			if(mysql_num_rows($result = mysql_query($sql)) > 0){
+				$row = mysql_fetch_assoc($result);
+				$response = $row['id'];
+			}
+		}
+		
+		return $response;
+	} // end get_member_id()
+	
+	
+	
+	/** get_group_id() Returns the member's group id for this session.
+	  * 
+	  * @access public
+	  * @param $member_id
+	  **/
+	public function get_group_id(){
+		$response = '';
+		$session_id = $this->get_id();
+		
+		if($session_id != ""){
+			$sql = "select
+				qo_groups_id as id
+				from
+				qo_sessions
+				where
+				id = '".$session_id."'";
+			
+			if(mysql_num_rows($result = mysql_query($sql)) > 0){
+				$row = mysql_fetch_assoc($result);
+				$response = $row['id'];
+			}
+		}
+		
+		return $response;
+	} // end get_group_id()
+	
+	
+	
+	/** get_group_name() Returns the member's group name for this session.
+	  *
+	  * @access public
+	  **/
+	public function get_group_name(){
+		$response = '';
+		$group_id = $this->get_group_id();
+		
+		if($group_id != ""){			
+			$sql = "SELECT
+				name
+				FROM
+				qo_groups
+				WHERE
+				id = ".$group_id;
+			
+			if(mysql_num_rows($result = mysql_query($sql)) > 0){
+				$row = mysql_fetch_assoc($result);
+				$response = $row['name'];
+			}
+		}
+		
+		return $response;
+	} // end get_group_name()
+	
+	
+	
+	/** exists()
+	  *
+	  * @param $session_id string
+	  **/
+	function exists($session_id=""){
+		$response = false;
+		$session_id = $session_id != "" ? $session_id : $this->get_id();
+		
+		if($session_id != ""){
+			// query the db for the session id
+			$sql = "select
+				qo_members_id
+				from
+				qo_sessions
+				where
+				id = '".$session_id."'";
+			
+			// if a record is found, they are logged in
+			if(mysql_num_rows($result = mysql_query($sql)) > 0)	{
+				$response = true;
+			}
+		}
+		
+		return $response;
+	} // end exists()
+	
+	
+	
+	/** login()
+	  * 
+	  * @access public
+	  *	@param $module string
+	  * @param $user string
+	  * @param $pass string 
+	  **/
+	public function login($user, $pass, $group_id=""){
+		$response = "{success: false}";
+		
+		if(!isset($user)||!strlen($user)){
+			$response = "{errors:[{id:'user', msg:'Required Field'}]}";
+		}elseif(!isset($pass)||!strlen($pass)){
+			$response = "{errors:[{id:'pass', msg:'Required Field'}]}";
+		}else if(!$this->os->member->exists($user)){
+			$response = "{errors:[{id:'user', msg:'User not found'}]}";
+		}else if(!$this->os->member->is_active($user)){
+			$response = "{errors:[{id:'user', msg:'This account is not active'}]}";
+		}else{
+			// check password
+			$sql = "SELECT
+				id,
+				email_address
+				FROM
+				qo_members
+				WHERE
+				email_address = '".$user."'
+				AND
+				password = '".$pass."'";
+			
+			if(mysql_num_rows($result = mysql_query($sql)) < 1){
+				$response = "{errors:[{id:'pass', msg:'Incorrect Password'}]}";
+			}else{
+				// successful login, check for groups
+				
+				// get member id
+				$row = mysql_fetch_assoc($result);
+				$member_id = $row['id'];
+				
+				// if group id was not supplied
+				if($group_id == ""){
+					
+					// get members active groups
+					$sql = "SELECT
+						G.id,
+						G.name
+						FROM
+						qo_groups_has_members GM
+							-- Groups Join --
+							INNER JOIN qo_groups AS G ON G.id = GM.qo_groups_id AND G.active = 1
+						WHERE
+						qo_members_id = ".$member_id."
+						ORDER BY
+						G.name";
+					
+					$result = mysql_query($sql);
+					
+					if(mysql_num_rows($result = mysql_query($sql)) > 1){
+						$groups = array();
+						
+						while($row = mysql_fetch_assoc($result)){
+							$groups[] = $row;
+						}
+						
+						$response = "{success:true, groups: ".json_encode($groups)."}";
+					
+					}else{
+						
+						$row = mysql_fetch_assoc($result);
+						
+						// log member in with this group id
+						$group_id = $row["id"];
+						
+					}
+					
+				}
+				
+				// if group id was supplied
+				if($group_id != ""){
+				
+					/* delete existing session
+					$sql = "DELETE FROM
+						qo_sessions
+						WHERE
+						qo_members_id = ".$member_id;
+					
+					if(!mysql_query($sql)){
+						$response = "{errors:[{id:'user', msg:'Login Failed'}]}";
+					}else{ */
+					
+						// get our random session id
+						$session_id = $this->os->build_random_id();
+						
+						// save temporary session id to our db
+						$sql = "INSERT INTO qo_sessions (
+							qo_members_id,
+							qo_groups_id,
+							id,
+							ip,
+							date
+							) VALUES (
+							".$member_id.",
+							".$group_id.",
+							'".$session_id."',
+							'".$_SERVER['REMOTE_ADDR']."',
+							'".date("Y-m-d H:i:s")."')";
+						
+						// attempt to save login session
+						if(!mysql_query($sql)){
+							
+							$response = "{errors:[{id:'user', msg:'Login Failed'}]}";
+							
+						}else{
+							
+							// successful login
+							$response = "{success:true, sessionId:'".$session_id."'}\n";
+							
+						}
+					//}					
+				}
+			}
+		}
+		return $response;
+	} // end login()
+	
+	
+	
+	/** logout()
+	  *
+	  * @access public
+	  **/
+	public function logout(){
+		$session_id = $this->get_id();
+		
+		if(isset($session_id)){
+			$sql = "delete
+				from
+				qo_sessions
+				where
+				id = '".$session_id."'";
+			
+			if(mysql_query($sql)){
+				session_destroy();
+				
+				// clear the cookie
+				setcookie("sessionId", "");
+				
+			    // redirect to login page
+				header('Location: '.$this->os->get_login_url());
+			}
+		}
+	} // end logout()
+}
+?>
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/os/lib/theme.php
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/os/lib/theme.php	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/os/lib/theme.php	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,75 @@
+<?php
+/*
+ * qWikiOffice Desktop 0.8.1
+ * Copyright(c) 2007-2008, Integrated Technologies, Inc.
+ * licensing@xxxxxxxxxxxxxxx
+ * 
+ * http://www.qwikioffice.com/license
+ */
+
+class theme {
+    
+    private $os;
+
+
+
+	public function __construct($os){
+		$this->os = $os;
+	}
+	
+	
+	
+    /** get() Returns a string of the theme css to include
+	  * 
+	  * @param {integer} $member_id
+	  * @param {integer} $group_id
+	  * @param {string} $theme_dir
+	  **/
+	public function get(){
+		$member_id = $this->os->session->get_member_id();
+		$group_id = $this->os->session->get_group_id();
+		$theme_dir = $this->os->get_theme_dir();
+		
+		// get members saved theme
+		$theme = $this->get_link($member_id, $group_id, $theme_dir);
+		
+		if($theme == ''){
+			// get the default
+		    $theme = $this->get_link('0', '0', $theme_dir);
+		}
+		
+		return $theme;
+	} // end get()
+	
+	
+	
+	/** get_link()
+	  * 
+	  * @param {integer} $member_id
+	  * @param {integer} $group_id
+	  * @param {string} $theme_dir
+	  **/
+	private function get_link($member_id, $group_id, $theme_dir){
+	    $theme = '';
+		
+		if($member_id != "" && $group_id != "" && $theme_dir){
+			$sql = "SELECT
+				path_to_file as path
+				FROM
+				qo_themes T
+					INNER JOIN qo_styles AS S ON S.qo_themes_id = T.id
+				WHERE
+				qo_members_id = ".$member_id."
+				AND
+				qo_groups_id = ".$group_id;
+			
+			if(mysql_num_rows($result = mysql_query($sql)) > 0){
+				$row = mysql_fetch_assoc($result);
+				$theme = '<link id="theme" rel="stylesheet" type="text/css" href="'.$theme_dir.$row["path"].'" />';
+			}
+		}
+		
+		return $theme;
+	} // end get_link()
+}
+?>
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/os/os.php
===================================================================
--- mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/os/os.php	                        (rev 0)
+++ mickael/trunk/ext/v3.0.0-a1/learn/desktop/system/os/os.php	2008-12-02 03:45:15 UTC (rev 33)
@@ -0,0 +1,208 @@
+<?php
+/*
+ * qWikiOffice Desktop 0.8.1
+ * Copyright(c) 2007-2008, Integrated Technologies, Inc.
+ * licensing@xxxxxxxxxxxxxxx
+ * 
+ * http://www.qwikioffice.com/license
+ */
+//debugBreak();
+require('config.php');
+require('lib/error.php');
+require('lib/group.php');
+require('lib/launcher.php');
+require('lib/member.php');
+require('lib/module.php');
+require('lib/preference.php');
+require('lib/privilege.php');
+require('lib/session.php');
+require('lib/theme.php');
+
+class os {	
+	
+	public $connected_to_db = false;
+	
+	
+	
+	public function __construct(){
+		// initialise the $_SESSION superglobal array
+		// session is destroyed in session->logout()
+		session_start();
+		
+		// config
+		if(class_exists('config')){ $this->config = new config(); }
+			else{ die("Config class is missing!"); }
+		
+		// error
+		if(class_exists('error')){ $this->error = new error($this); }
+			else{ die("Error class is missing!"); }
+		
+		// group
+		if(class_exists('group')){ $this->group = new group($this); }
+			else{ die("Group class is missing!"); }
+		
+		// launcher
+		if(class_exists('launcher')){ $this->launcher = new launcher($this); }
+			else{ die("Launcher class is missing!"); }
+		
+		// member
+		if(class_exists('member')){ $this->member = new member($this); }
+			else{ die("Member class is missing!"); }
+		
+		// module
+		if(class_exists('module')){ $this->module = new module($this); }
+			else{ die("Module class is missing!"); }
+		
+		// privileges
+		if(class_exists('privilege')){ $this->privilege = new privilege($this); }
+			else{ die("Privilege class is missing!"); }
+		
+		// preference
+		if(class_exists('preference')){ $this->preference = new preference($this); }
+			else{ die("Preference class is missing!"); }
+		
+		// session
+		if(class_exists('session')){ $this->session = new session($this); }
+			else{ die("Session class is missing!"); }
+		
+		// theme
+		if(class_exists('theme')){ $this->theme = new theme($this); }
+			else{ die("Theme class is missing!"); }
+		
+		// json support
+		if(!function_exists('json_encode')){
+			require("lib/json.php");
+			$GLOBALS['JSON_OBJECT'] = new Services_JSON();
+			
+			function json_encode($value){
+				return $GLOBALS['JSON_OBJECT']->encode($value);
+			}
+   
+			function json_decode($value){
+				return $GLOBALS['JSON_OBJECT']->decode($value);
+			}
+		}
+		
+		// connect to the database
+		$this->connect_to_db();
+	
+		}
+	
+	
+	
+	/** init() Initial page load or refresh has occured 
+	  **/
+	public function init(){
+		$this->module->init();
+		$this->privilege->init();
+		}
+		
+	
+	
+	/** connect_to_db()
+	  *
+	  * @access private
+	  **/
+	private function connect_to_db(){
+		mysql_connect ($this->config->DB_HOST, $this->config->DB_USERNAME, $this->config->DB_PASSWORD) or die ('I cannot connect to mysql because: ' . mysql_error());
+		mysql_select_db ($this->config->DB_NAME) or die ('I cannot select the database because: '.mysql_error());
+		
+		$this->connected_to_db = true;
+	} // end connect_to_db()
+	
+	
+	
+	/** get_theme_dir()
+	  **/
+	public function get_theme_dir(){
+	    return $this->config->THEMES_DIR;
+	} // end get_theme_dir()
+	
+	
+	
+	/** get_module_dir()
+	  **/
+	public function get_module_dir(){
+	    return $this->config->MODULES_DIR;
+	} // end get_module_dir()
+		
+			
+			
+	/** get_document_root()
+	  **/
+	public function get_document_root(){
+	    return $this->config->DOCUMENT_ROOT;
+	} // end get_document_root()
+
+
+					
+	/** get_login_url()
+	  **/
+	public function get_login_url(){
+	    return $this->config->LOGIN_URL;
+	} // end get_login_url()
+			
+					
+	
+	/** Mod_addslashes()
+	 *
+	 * @param {string} string to be escaped
+	 * @return {string} escaped string
+	  **/
+	public function Mod_addslashes($string){
+		if(get_magic_quotes_gpc()==1){
+			return ($string);
+		}else{
+			return (addslashes($string ));
+		}
+	} // end Mod_addslashes()
+	
+	
+	
+	/** concat_arrays()
+	  * @access private
+	  *
+	  * @param {array}
+	  * @param {array}
+	  * @return {array} concated array
+	  **/
+	public function concat_arrays($a, $b){
+		$c = $a;  
+	    while(list(,$v)=each($b)){
+	        $c[] = $v;
+	    }
+	    
+	    return $c;
+	} // end concat_arrays()
+	
+	
+	
+	/** overwrite_assoc_array()
+	  * 
+	  * @param {array}
+	  * @param {array}
+	  * @return {array} Overwritten associative array
+	  **/
+	public function overwrite_assoc_array($a, $b){
+	    $c = $a;  
+	    while(list($k,$v)=each($b)){
+	        if(!is_array($v) || ( is_array($v) && count($v) > 0 )){
+	        	$c[$k] = $v;
+	        }
+	    }
+	    
+	    return $c;
+	} // end overwrite_assoc_array()
+	
+	
+	
+	/** build_random_id()
+	  * 
+	  * @return {string} A random id
+	  **/
+	public function build_random_id(){
+		return md5(uniqid(rand(), true));
+	} // end build_random_id()
+
+}
+?>
\ No newline at end of file

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/wallpapers/blue.jpg
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/wallpapers/blue.jpg
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/wallpapers/desk.jpg
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/wallpapers/desk.jpg
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/wallpapers/desktop.jpg
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/wallpapers/desktop.jpg
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/wallpapers/desktop2.jpg
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/wallpapers/desktop2.jpg
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/wallpapers/ext.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/wallpapers/ext.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/wallpapers/shiny.gif
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/wallpapers/shiny.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: mickael/trunk/ext/v3.0.0-a1/learn/desktop/wallpapers/sky.jpg
===================================================================
(Binary files differ)


Property changes on: mickael/trunk/ext/v3.0.0-a1/learn/desktop/wallpapers/sky.jpg
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream


Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/