partkeepr

fork of partkeepr
git clone https://git.e1e0.net/partkeepr.git
Log | Files | Refs | Submodules | README | LICENSE

commit 23c6a891f7c26f918cef594dd8ebdb28405b3abf
parent f1aa2092f2b3097d4f0ccb61f2092c16540e844d
Author: Felicitus <felicitus@felicitus.org>
Date:   Fri, 16 Dec 2011 03:33:47 +0100

Forgot to add the new frontend directory.

Diffstat:
Asrc/frontend/.htaccess | 6++++++
Asrc/frontend/css/PartKeepr.css | 120+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/css/partkeepr-theme.css | 1+
Asrc/frontend/favicon.ico | 0
Asrc/frontend/file.php | 68++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/image.php | 118+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/index.php | 89+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/Components/CategoryEditor/CategoryEditorForm.js | 19+++++++++++++++++++
Asrc/frontend/js/Components/CategoryEditor/CategoryEditorTree.js | 203+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/Components/CategoryEditor/CategoryEditorWindow.js | 67+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/Components/CategoryStore.js | 29+++++++++++++++++++++++++++++
Asrc/frontend/js/Components/CategoryTree.js | 110+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/Components/ConnectionButton.js | 17+++++++++++++++++
Asrc/frontend/js/Components/Distributor/DistributorEditor.js | 34++++++++++++++++++++++++++++++++++
Asrc/frontend/js/Components/Distributor/DistributorEditorComponent.js | 19+++++++++++++++++++
Asrc/frontend/js/Components/Distributor/DistributorGrid.js | 13+++++++++++++
Asrc/frontend/js/Components/Editor/Editor.js | 120+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/Components/Editor/EditorComponent.js | 202+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/Components/Editor/EditorGrid.js | 165+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/Components/Footprint/FootprintAttachmentGrid.js | 7+++++++
Asrc/frontend/js/Components/Footprint/FootprintEditor.js | 66++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/Components/Footprint/FootprintEditorComponent.js | 40++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/Components/Footprint/FootprintTree.js | 187+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/Components/Manufacturer/ManufacturerEditor.js | 130+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/Components/Manufacturer/ManufacturerEditorComponent.js | 19+++++++++++++++++++
Asrc/frontend/js/Components/Manufacturer/ManufacturerGrid.js | 12++++++++++++
Asrc/frontend/js/Components/Menu.js | 7+++++++
Asrc/frontend/js/Components/MenuBar.js | 210+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/Components/MessageLog.js | 23+++++++++++++++++++++++
Asrc/frontend/js/Components/Part/Editor/PartAttachmentGrid.js | 7+++++++
Asrc/frontend/js/Components/Part/Editor/PartDistributorGrid.js | 110+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/Components/Part/Editor/PartEditor.js | 231+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/Components/Part/Editor/PartEditorWindow.js | 96+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/Components/Part/Editor/PartManufacturerGrid.js | 100+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/Components/Part/Editor/PartParameterGrid.js | 150+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/Components/Part/PartCategoryTree.js | 54++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/Components/Part/PartDisplay.js | 190+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/Components/Part/PartFilterPanel.js | 164+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/Components/Part/PartStockHistory.js | 137+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/Components/Part/PartStockWindow.js | 153+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/Components/Part/PartsGrid.js | 158+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/Components/Part/PartsManager.js | 265+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/Components/PartUnit/PartUnitEditor.js | 14++++++++++++++
Asrc/frontend/js/Components/PartUnit/PartUnitEditorComponent.js | 21+++++++++++++++++++++
Asrc/frontend/js/Components/PartUnit/PartUnitGrid.js | 52++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/Components/Statistics/CurrentStatisticsPanel.js | 93+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/Components/Statistics/StatisticsChart.js | 134+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/Components/Statistics/StatisticsChartPanel.js | 66++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/Components/Statusbar.js | 67+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/Components/StorageLocation/StorageLocationEditor.js | 80+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/Components/StorageLocation/StorageLocationEditorComponent.js | 19+++++++++++++++++++
Asrc/frontend/js/Components/StorageLocation/StorageLocationGrid.js | 46++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/Components/StorageLocation/StorageLocationMultiAddDialog.js | 207+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/Components/StorageLocation/StorageLocationMultiAddWindow.js | 84+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/Components/SystemInformation/SystemInformationGrid.js | 102+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/Components/TimeDisplay.js | 29+++++++++++++++++++++++++++++
Asrc/frontend/js/Components/TipOfTheDay/TipOfTheDayWindow.js | 319+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/Components/Unit/UnitEditor.js | 67+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/Components/Unit/UnitEditorComponent.js | 21+++++++++++++++++++++
Asrc/frontend/js/Components/Unit/UnitGrid.js | 16++++++++++++++++
Asrc/frontend/js/Components/User/TipOfTheDayPreferences.js | 49+++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/Components/User/UserEditor.js | 42++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/Components/User/UserEditorComponent.js | 23+++++++++++++++++++++++
Asrc/frontend/js/Components/User/UserGrid.js | 12++++++++++++
Asrc/frontend/js/Components/User/UserPasswordChangePanel.js | 76++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/Components/User/UserPreferences.js | 15+++++++++++++++
Asrc/frontend/js/Components/Widgets/AttachmentGrid.js | 179+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/Components/Widgets/CategoryComboBox.js | 132+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/Components/Widgets/DistributorComboBox.js | 27+++++++++++++++++++++++++++
Asrc/frontend/js/Components/Widgets/FootprintComboBox.js | 27+++++++++++++++++++++++++++
Asrc/frontend/js/Components/Widgets/ManufacturerComboBox.js | 27+++++++++++++++++++++++++++
Asrc/frontend/js/Components/Widgets/PartParameterComboBox.js | 42++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/Components/Widgets/PartUnitComboBox.js | 27+++++++++++++++++++++++++++
Asrc/frontend/js/Components/Widgets/RemoteImageField.js | 113+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/Components/Widgets/RemoteImageFieldLayout.js | 34++++++++++++++++++++++++++++++++++
Asrc/frontend/js/Components/Widgets/ResistorCalculator.js | 30++++++++++++++++++++++++++++++
Asrc/frontend/js/Components/Widgets/ResistorDisplay.js | 25+++++++++++++++++++++++++
Asrc/frontend/js/Components/Widgets/SiUnitField.js | 391+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/Components/Widgets/SiUnitList.js | 8++++++++
Asrc/frontend/js/Components/Widgets/StorageLocationComboBox.js | 26++++++++++++++++++++++++++
Asrc/frontend/js/Components/Widgets/UnitComboBox.js | 27+++++++++++++++++++++++++++
Asrc/frontend/js/Components/Widgets/UserComboBox.js | 27+++++++++++++++++++++++++++
Asrc/frontend/js/Components/Widgets/UserPreferenceGrid.js | 71+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/Components/Widgets/WebcamPanel.js | 63+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/Dialogs/Auth/LoginDialog.js | 118+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/Dialogs/ExceptionWindow.js | 133+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/Dialogs/FileUploadDialog.js | 141+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/Ext.ux/ClearableComboBox.js | 29+++++++++++++++++++++++++++++
Asrc/frontend/js/Ext.ux/Iframe.js | 120+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/Ext.ux/SearchField.js | 66++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/ExtJS/Bugfixes/Ext.panel.Table-scrollDelta.js | 8++++++++
Asrc/frontend/js/ExtJS/Bugfixes/Ext.selection.Model-lateBinding.js | 39+++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/ExtJS/Enhancements/Ext.data.Connection-sessionInjection.js | 32++++++++++++++++++++++++++++++++
Asrc/frontend/js/ExtJS/Enhancements/Ext.layout.component.field.Trigger-theme.js | 26++++++++++++++++++++++++++
Asrc/frontend/js/ExtJS/Enhancements/Ext.tree.View-missingMethods.js | 31+++++++++++++++++++++++++++++++
Asrc/frontend/js/Models/AbstractCategory.js | 5+++++
Asrc/frontend/js/Models/Distributor.js | 18++++++++++++++++++
Asrc/frontend/js/Models/Footprint.js | 16++++++++++++++++
Asrc/frontend/js/Models/FootprintAttachment.js | 15+++++++++++++++
Asrc/frontend/js/Models/FootprintCategory.js | 14++++++++++++++
Asrc/frontend/js/Models/Manufacturer.js | 19+++++++++++++++++++
Asrc/frontend/js/Models/ManufacturerICLogo.js | 15+++++++++++++++
Asrc/frontend/js/Models/Message.js | 9+++++++++
Asrc/frontend/js/Models/Part.js | 55+++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/Models/PartAttachment.js | 14++++++++++++++
Asrc/frontend/js/Models/PartCategory.js | 14++++++++++++++
Asrc/frontend/js/Models/PartDistributor.js | 16++++++++++++++++
Asrc/frontend/js/Models/PartManufacturer.js | 14++++++++++++++
Asrc/frontend/js/Models/PartParameter.js | 14++++++++++++++
Asrc/frontend/js/Models/PartUnit.js | 14++++++++++++++
Asrc/frontend/js/Models/SiPrefix.js | 11+++++++++++
Asrc/frontend/js/Models/StatisticSample.js | 9+++++++++
Asrc/frontend/js/Models/StockEntry.js | 14++++++++++++++
Asrc/frontend/js/Models/StorageLocation.js | 14++++++++++++++
Asrc/frontend/js/Models/SystemInformationRecord.js | 15+++++++++++++++
Asrc/frontend/js/Models/TipOfTheDay.js | 11+++++++++++
Asrc/frontend/js/Models/Unit.js | 14++++++++++++++
Asrc/frontend/js/Models/User.js | 13+++++++++++++
Asrc/frontend/js/Models/UserPreference.js | 10++++++++++
Asrc/frontend/js/PartKeepr.js | 523+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/Util/JsonWithAssociationsWriter.js | 21+++++++++++++++++++++
Asrc/frontend/js/Util/ServiceCall.js | 187+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/Util/i18n.js | 4++++
Asrc/frontend/js/bugfixes.js | 214+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/compat.js | 2++
Asrc/frontend/js/org.jerrymouse.util.locale/locale.js | 42++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/js/webcam.js | 198+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/resources/diagona-icons/README.txt | 14++++++++++++++
Asrc/frontend/resources/diagona-icons/all.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/001.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/002.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/003.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/004.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/005.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/006.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/007.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/008.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/009.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/010.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/011.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/012.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/013.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/014.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/015.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/016.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/017.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/018.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/019.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/020.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/021.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/022.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/023.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/024.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/025.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/026.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/027.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/028.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/029.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/030.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/031.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/032.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/033.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/034.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/035.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/036.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/037.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/038.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/039.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/040.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/041.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/042.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/043.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/044.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/045.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/046.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/047.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/048.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/049.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/050.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/051.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/052.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/053.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/054.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/055.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/056.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/057.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/058.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/059.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/060.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/061.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/062.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/063.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/064.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/065.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/066.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/067.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/068.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/069.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/070.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/071.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/072.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/073.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/074.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/075.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/076.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/077.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/078.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/079.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/080.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/081.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/082.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/083.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/084.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/085.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/086.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/087.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/088.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/089.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/090.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/091.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/092.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/093.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/094.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/095.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/096.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/097.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/098.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/099.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/100.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/101.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/102.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/103.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/104.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/105.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/106.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/107.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/108.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/109.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/110.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/111.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/112.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/113.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/114.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/115.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/116.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/117.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/118.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/119.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/120.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/121.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/122.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/123.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/124.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/125.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/126.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/127.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/128.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/129.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/130.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/131.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/132.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/133.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/134.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/135.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/136.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/137.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/138.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/139.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/140.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/141.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/142.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/143.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/144.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/145.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/146.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/147.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/148.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/149.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/150.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/151.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/152.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/153.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/154.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/155.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/156.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/157.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/158.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/159.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/160.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/161.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/162.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/163.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/164.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/165.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/166.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/167.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/168.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/169.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/170.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/171.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/172.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/173.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/174.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/175.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/176.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/177.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/178.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/179.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/180.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/181.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/182.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/183.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/184.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/185.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/186.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/187.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/188.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/189.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/190.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/191.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/192.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/193.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/194.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/195.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/196.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/197.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/198.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/199.png | 0
Asrc/frontend/resources/diagona-icons/icons/10/200.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/001.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/002.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/003.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/004.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/005.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/006.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/007.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/008.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/009.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/010.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/011.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/012.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/013.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/014.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/015.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/016.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/017.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/018.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/019.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/020.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/021.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/022.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/023.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/024.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/025.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/026.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/027.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/028.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/029.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/030.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/031.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/032.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/033.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/034.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/035.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/036.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/037.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/038.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/039.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/040.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/041.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/042.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/043.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/044.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/045.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/046.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/047.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/048.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/049.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/050.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/051.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/052.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/053.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/054.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/055.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/056.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/057.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/058.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/059.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/060.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/061.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/062.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/063.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/064.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/065.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/066.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/067.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/068.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/069.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/070.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/071.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/072.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/073.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/074.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/075.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/076.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/077.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/078.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/079.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/080.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/081.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/082.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/083.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/084.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/085.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/086.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/087.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/088.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/089.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/090.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/091.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/092.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/093.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/094.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/095.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/096.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/097.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/098.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/099.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/100.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/101.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/102.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/103.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/104.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/105.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/106.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/107.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/108.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/109.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/110.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/111.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/112.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/113.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/114.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/115.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/116.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/117.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/118.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/119.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/120.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/121.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/122.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/123.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/124.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/125.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/126.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/127.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/128.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/129.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/130.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/131.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/132.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/133.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/134.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/135.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/136.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/137.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/138.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/139.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/140.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/141.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/142.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/143.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/144.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/145.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/146.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/147.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/148.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/149.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/150.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/151.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/152.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/153.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/154.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/155.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/156.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/157.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/158.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/159.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/160.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/161.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/162.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/163.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/164.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/165.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/166.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/167.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/168.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/169.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/170.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/171.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/172.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/173.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/174.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/175.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/176.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/177.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/178.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/179.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/180.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/181.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/182.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/183.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/184.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/185.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/186.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/187.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/188.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/189.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/190.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/191.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/192.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/193.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/194.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/195.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/196.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/197.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/198.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/199.png | 0
Asrc/frontend/resources/diagona-icons/icons/16/200.png | 0
Asrc/frontend/resources/flags | 1+
Asrc/frontend/resources/fugue-icons | 1+
Asrc/frontend/resources/icons/footprint_add.png | 0
Asrc/frontend/resources/icons/footprint_delete.png | 0
Asrc/frontend/resources/icons/stock_any.png | 0
Asrc/frontend/resources/icons/stock_below.png | 0
Asrc/frontend/resources/icons/stock_nonzero.png | 0
Asrc/frontend/resources/icons/stock_zero.png | 0
Asrc/frontend/resources/icons/storagelocation_multiadd.png | 0
Asrc/frontend/resources/icons/tip_next.png | 0
Asrc/frontend/resources/icons/tip_previous.png | 0
Asrc/frontend/resources/icons/unit.png | 0
Asrc/frontend/resources/icons/unit_add.png | 0
Asrc/frontend/resources/icons/unit_delete.png | 0
Asrc/frontend/resources/images/loading.gif | 0
Asrc/frontend/resources/images/over.gif | 0
Asrc/frontend/resources/images/selected.gif | 0
Asrc/frontend/resources/jmicons/ajax-loader.gif | 0
Asrc/frontend/resources/jmicons/contexthelp.png | 0
Asrc/frontend/resources/jmicons/menu-shade.gif | 0
Asrc/frontend/resources/mimetypes | 1+
Asrc/frontend/resources/selected.gif | 0
Asrc/frontend/resources/silkicons | 1+
Asrc/frontend/resources/themes/images/partkeepr/boundlist/trigger-arrow.png | 0
Asrc/frontend/resources/themes/images/partkeepr/box/corners-blue.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/box/corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/box/l-blue.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/box/l.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/box/r-blue.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/box/r.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/box/tb-blue.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/box/tb.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn-group/btn-group-default-framed-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn-group/btn-group-default-framed-notitle-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn-group/btn-group-default-framed-notitle-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn-group/btn-group-default-framed-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-large-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-large-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-large-disabled-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-large-disabled-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-large-disabled-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-large-focus-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-large-focus-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-large-focus-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-large-over-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-large-over-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-large-over-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-large-pressed-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-large-pressed-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-large-pressed-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-large-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-medium-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-medium-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-medium-disabled-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-medium-disabled-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-medium-disabled-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-medium-focus-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-medium-focus-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-medium-focus-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-medium-over-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-medium-over-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-medium-over-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-medium-pressed-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-medium-pressed-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-medium-pressed-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-medium-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-small-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-small-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-small-disabled-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-small-disabled-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-small-disabled-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-small-focus-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-small-focus-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-small-focus-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-small-over-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-small-over-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-small-over-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-small-pressed-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-small-pressed-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-small-pressed-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-small-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-toolbar-large-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-toolbar-large-disabled-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-toolbar-large-disabled-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-toolbar-large-focus-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-toolbar-large-focus-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-toolbar-large-focus-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-toolbar-large-over-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-toolbar-large-over-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-toolbar-large-over-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-toolbar-large-pressed-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-toolbar-large-pressed-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-toolbar-large-pressed-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-toolbar-large-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-toolbar-medium-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-toolbar-medium-disabled-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-toolbar-medium-disabled-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-toolbar-medium-focus-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-toolbar-medium-focus-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-toolbar-medium-focus-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-toolbar-medium-over-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-toolbar-medium-over-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-toolbar-medium-over-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-toolbar-medium-pressed-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-toolbar-medium-pressed-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-toolbar-medium-pressed-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-toolbar-medium-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-toolbar-small-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-toolbar-small-disabled-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-toolbar-small-disabled-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-toolbar-small-focus-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-toolbar-small-focus-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-toolbar-small-focus-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-toolbar-small-over-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-toolbar-small-over-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-toolbar-small-over-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-toolbar-small-pressed-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-toolbar-small-pressed-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-toolbar-small-pressed-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/btn/btn-default-toolbar-small-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/button/arrow-white.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/button/arrow.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/button/btn-arrow.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/button/btn-sprite.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/button/btn.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/button/group-cs.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/button/group-lr.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/button/group-tb.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/button/s-arrow-b-noline.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/button/s-arrow-b.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/button/s-arrow-bo.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/button/s-arrow-light.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/button/s-arrow-noline.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/button/s-arrow-o.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/button/s-arrow.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/datepicker/datepicker-footer-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/datepicker/datepicker-footer-bg.png | 0
Asrc/frontend/resources/themes/images/partkeepr/datepicker/datepicker-header-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/datepicker/datepicker-header-bg.png | 0
Asrc/frontend/resources/themes/images/partkeepr/dd/drop-add.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/dd/drop-no.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/dd/drop-yes.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/editor/tb-sprite.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/form-invalid-tip/form-invalid-tip-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/form-invalid-tip/form-invalid-tip-default-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/form-invalid-tip/form-invalid-tip-default-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/form-invalid-tip/form-invalid-tip-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/form/checkbox.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/form/checkbox.png | 0
Asrc/frontend/resources/themes/images/partkeepr/form/clear-trigger.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/form/clear-trigger.png | 0
Asrc/frontend/resources/themes/images/partkeepr/form/date-trigger.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/form/date-trigger.png | 0
Asrc/frontend/resources/themes/images/partkeepr/form/error-tip-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/form/exclamation.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/form/radio.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/form/radio.png | 0
Asrc/frontend/resources/themes/images/partkeepr/form/search-trigger.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/form/search-trigger.png | 0
Asrc/frontend/resources/themes/images/partkeepr/form/spinner-small.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/form/spinner.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/form/spinner.png | 0
Asrc/frontend/resources/themes/images/partkeepr/form/text-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/form/trigger-square.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/form/trigger-tpl.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/form/trigger.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/form/trigger.png | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/arrow-left-white.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/arrow-right-white.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/cell-special-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/cell-special-bg.png | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/cell-special-selected-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/cell-special-selected-bg.png | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/checked.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/col-move-bottom.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/col-move-top.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/column-header-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/column-header-bg.png | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/column-header-over-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/column-header-over-bg.png | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/columns.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/dd-insert-arrow-left.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/dd-insert-arrow-left.png | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/dd-insert-arrow-right.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/dd-insert-arrow-right.png | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/dirty.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/done.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/drop-no.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/drop-yes.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/footer-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/grid-blue-hd.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/grid-blue-split.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/grid-hrow.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/grid-loading.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/grid-split.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/grid-vista-hd.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/grid3-hd-btn.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/grid3-hrow-over.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/grid3-hrow.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/grid3-rowheader.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/group-by.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/group-collapse.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/group-expand-sprite.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/group-expand.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/hd-pop.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/hmenu-asc.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/hmenu-desc.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/hmenu-lock.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/hmenu-lock.png | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/hmenu-unlock.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/hmenu-unlock.png | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/invalid_line.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/loading.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/mso-hd.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/nowait.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/page-first-disabled.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/page-first.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/page-last-disabled.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/page-last.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/page-next-disabled.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/page-next.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/page-prev-disabled.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/page-prev.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/pick-button.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/property-cell-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/property-cell-selected-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/refresh-disabled.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/refresh.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/row-check-sprite.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/row-expand-sprite.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/row-over.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/row-sel.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/sort-hd.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/sort_asc.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/sort_asc.png | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/sort_desc.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/sort_desc.png | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/unchecked.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/grid/wait.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/layout/mini-bottom.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/layout/mini-left.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/layout/mini-right.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/layout/mini-top.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/menu/checked.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/menu/group-checked.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/menu/item-over-disabled.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/menu/item-over.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/menu/menu-item-active-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/menu/menu-item-active-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/menu/menu-item-active-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/menu/menu-parent.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/menu/menu.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/menu/unchecked.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/panel-header/panel-header-default-bottom-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/panel-header/panel-header-default-framed-bottom-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/panel-header/panel-header-default-framed-bottom-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/panel-header/panel-header-default-framed-bottom-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/panel-header/panel-header-default-framed-collapsed-bottom-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/panel-header/panel-header-default-framed-collapsed-bottom-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/panel-header/panel-header-default-framed-collapsed-bottom-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/panel-header/panel-header-default-framed-collapsed-left-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/panel-header/panel-header-default-framed-collapsed-left-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/panel-header/panel-header-default-framed-collapsed-left-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/panel-header/panel-header-default-framed-collapsed-right-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/panel-header/panel-header-default-framed-collapsed-right-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/panel-header/panel-header-default-framed-collapsed-right-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/panel-header/panel-header-default-framed-collapsed-top-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/panel-header/panel-header-default-framed-collapsed-top-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/panel-header/panel-header-default-framed-collapsed-top-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/panel-header/panel-header-default-framed-left-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/panel-header/panel-header-default-framed-left-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/panel-header/panel-header-default-framed-left-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/panel-header/panel-header-default-framed-right-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/panel-header/panel-header-default-framed-right-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/panel-header/panel-header-default-framed-right-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/panel-header/panel-header-default-framed-top-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/panel-header/panel-header-default-framed-top-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/panel-header/panel-header-default-framed-top-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/panel-header/panel-header-default-left-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/panel-header/panel-header-default-right-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/panel-header/panel-header-default-top-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/panel/panel-default-framed-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/panel/panel-default-framed-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/progress/progress-default-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/shared/blue-loading.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/shared/calendar.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/shared/glass-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/shared/hd-sprite.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/shared/icon-error.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/shared/icon-info.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/shared/icon-question.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/shared/icon-warning.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/shared/large-loading.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/shared/left-btn.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/shared/loading-balls.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/shared/right-btn.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/shared/shadow-c.png | 0
Asrc/frontend/resources/themes/images/partkeepr/shared/shadow-lr.png | 0
Asrc/frontend/resources/themes/images/partkeepr/shared/shadow.png | 0
Asrc/frontend/resources/themes/images/partkeepr/shared/warning.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/sizer/e-handle-dark.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/sizer/e-handle.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/sizer/ne-handle-dark.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/sizer/ne-handle.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/sizer/nw-handle-dark.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/sizer/nw-handle.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/sizer/s-handle-dark.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/sizer/s-handle.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/sizer/se-handle-dark.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/sizer/se-handle.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/sizer/square.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/sizer/sw-handle-dark.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/sizer/sw-handle.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/slider/slider-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/slider/slider-bg.png | 0
Asrc/frontend/resources/themes/images/partkeepr/slider/slider-thumb.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/slider/slider-thumb.png | 0
Asrc/frontend/resources/themes/images/partkeepr/slider/slider-v-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/slider/slider-v-bg.png | 0
Asrc/frontend/resources/themes/images/partkeepr/slider/slider-v-thumb.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/slider/slider-v-thumb.png | 0
Asrc/frontend/resources/themes/images/partkeepr/tab-bar/scroll-left.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tab-bar/scroll-right.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tab-bar/tab-bar-default-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tab/tab-default-bottom-active-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tab/tab-default-bottom-active-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tab/tab-default-bottom-active-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tab/tab-default-bottom-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tab/tab-default-bottom-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tab/tab-default-bottom-disabled-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tab/tab-default-bottom-disabled-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tab/tab-default-bottom-disabled-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tab/tab-default-bottom-over-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tab/tab-default-bottom-over-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tab/tab-default-bottom-over-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tab/tab-default-bottom-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tab/tab-default-close.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tab/tab-default-top-active-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tab/tab-default-top-active-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tab/tab-default-top-active-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tab/tab-default-top-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tab/tab-default-top-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tab/tab-default-top-disabled-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tab/tab-default-top-disabled-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tab/tab-default-top-disabled-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tab/tab-default-top-over-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tab/tab-default-top-over-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tab/tab-default-top-over-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tab/tab-default-top-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tip/tip-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tip/tip-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/toolbar/more.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/toolbar/scroll-left.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/toolbar/scroll-right.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/toolbar/toolbar-default-bg.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tools/tool-sprite-tpl.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tools/tool-sprites-dark.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tools/tool-sprites-light.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tools/tool-sprites.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tools/tools-sprites-trans.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tree/arrows.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tree/drop-above.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tree/drop-add.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tree/drop-append.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tree/drop-below.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tree/drop-between.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tree/drop-no.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tree/drop-over.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tree/drop-under.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tree/drop-yes.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tree/elbow-end-minus-nl.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tree/elbow-end-minus.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tree/elbow-end-plus-nl.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tree/elbow-end-plus.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tree/elbow-end.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tree/elbow-line.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tree/elbow-minus-nl.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tree/elbow-minus.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tree/elbow-plus-nl.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tree/elbow-plus.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tree/elbow.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tree/folder-open.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tree/folder.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tree/leaf.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tree/loading.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/tree/s.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/util/splitter/mini-bottom.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/util/splitter/mini-left.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/util/splitter/mini-right.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/util/splitter/mini-top.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/window-header/window-header-default-bottom-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/window-header/window-header-default-bottom-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/window-header/window-header-default-left-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/window-header/window-header-default-left-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/window-header/window-header-default-right-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/window-header/window-header-default-right-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/window-header/window-header-default-top-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/window-header/window-header-default-top-sides.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/window/icon-error.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/window/icon-info.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/window/icon-question.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/window/icon-warning.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/window/window-default-corners.gif | 0
Asrc/frontend/resources/themes/images/partkeepr/window/window-default-sides.gif | 0
Asrc/frontend/resources/webcam.swf | 0
Asrc/frontend/rest.php | 76++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/rss.php | 15+++++++++++++++
Asrc/frontend/service.php | 55+++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/frontend/upload.php | 38++++++++++++++++++++++++++++++++++++++
938 files changed, 9345 insertions(+), 0 deletions(-)

diff --git a/src/frontend/.htaccess b/src/frontend/.htaccess @@ -0,0 +1,6 @@ +AcceptPathInfo On + + <Limit GET HEAD POST PUT DELETE OPTIONS> + Order Allow,Deny + Allow from all + </Limit> diff --git a/src/frontend/css/PartKeepr.css b/src/frontend/css/PartKeepr.css @@ -0,0 +1,119 @@ +.manufacturer-ic-logos .thumb{ + background: #ffffff; + padding: 3px; +} + +.manufacturer-ic-logos .thumb-wrap{ + display: inline-block; + margin: 4px; + margin-right: 0; + padding: 5px; +} + +.manufacturer-ic-logos .thumb-wrap span{ + display: block; + overflow: hidden; + text-align: center; +} + +.manufacturer-ic-logos .x-view-over{ + border:1px solid #dddddd; + background: #efefef url(../resources/images/over.gif) repeat-x left top; + padding: 4px; +} + +.manufacturer-ic-logos .x-item-selected{ + background: #eff5fb url(../resources/images/selected.gif) no-repeat right bottom; + border:1px solid #99bbe8; + padding: 4px; +} +.manufacturer-ic-logos .x-view-selected .thumb{ + background:transparent; +} + +.manufacturer-ic-logos .thumb-wrap span { + cursor: default; +} + +.partdisplay h1 { + font-size: 2em; +} + +div.partdisplay td { + padding: 2px; + vertical-align: top; +} + +div.partdisplay table { + width: 100%; +} +td.e { + background-color: #eeeeee; +} + +td.e2 { + background-color: #dddddd; +} + +td.o { + background-color: #cccccc; +} + +td.o2 { + background-color: #bbbbbb; +} + +.remoteimagefield { + border: 1px solid black; +} + +#loading { position: absolute; width: 180px; margin: -70px 0 0 -90px; height: 140px; top: 50%; left: 50%; } +#loading .logo { background: url(../resources/images/loading.gif) no-repeat; position: absolute; display: block; top: 25px; left: 22px; width: 120px; height: 120px; } + +.icon-footprint { + background-image: url(../resources/fugue-icons/icons/fingerprint.png) !important; +} + +.icon-system-monitor { + background-image: url(../resources/fugue-icons/icons/system-monitor.png) !important; +} + +.icon-chart-bar { + background-image: url(../resources/silkicons/chart_bar.png) !important; +} + +.icon-wooden-box { + background-image: url(../resources/fugue-icons/icons/wooden-box.png) !important; +} + +.icon-unit { + background-image: url(../resources/icons/unit.png) !important; +} + +.icon-building { + background-image: url(../resources/silkicons/building.png) !important; +} + +.icon-lorry { + background-image: url(../resources/silkicons/lorry.png) !important; +} + +.icon-user { + background-image: url(../resources/silkicons/user.png) !important; +} + +.icon-ruler { + background-image: url(../resources/fugue-icons/icons/ruler.png) !important; +} + +.icon-gear { + background-image: url(../resources/fugue-icons/icons/gear.png) !important; +} + +.icon-drive-upload { + background-image: url(../resources/fugue-icons/icons/drive-upload.png) !important; +} + +.icon-infocard { + background-image: url(../resources/fugue-icons/icons/infocard.png) !important; +}+ \ No newline at end of file diff --git a/src/frontend/css/partkeepr-theme.css b/src/frontend/css/partkeepr-theme.css @@ -0,0 +1 @@ +html,body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;padding:0}table{border-collapse:collapse;border-spacing:0}fieldset,img{border:0}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal}li{list-style:none}caption,th{text-align:left}h1,h2,h3,h4,h5,h6{font-size:100%}q:before,q:after{content:""}abbr,acronym{border:0;font-variant:normal}sup{vertical-align:text-top}sub{vertical-align:text-bottom}input,textarea,select{font-family:inherit;font-size:inherit;font-weight:inherit}*:focus{outline:none}.x-border-box .x-reset,.x-border-box .x-reset *{box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;-webkit-box-sizing:border-box}.x-body{color:#000;font-size:12px;font-family:tahoma,arial,verdana,sans-serif}.x-clear{overflow:hidden;clear:both;height:0;width:0;font-size:0;line-height:0}.x-layer{position:absolute;overflow:hidden;zoom:1}.x-shim{position:absolute;left:0;top:0;overflow:hidden;filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=0);opacity:0}.x-hide-display{display:none !important}.x-hide-visibility{visibility:hidden !important}.x-item-disabled{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=40);opacity:0.4}.x-ie6 .x-item-disabled{filter:none}.x-hidden,.x-hide-offsets{display:block !important;position:absolute!important;left:-10000px !important;top:-10000px !important}.x-hide-nosize{height:0!important;width:0!important}.x-masked-relative{position:relative}.x-ie6 .x-masked select,.x-ie6.x-body-masked select{visibility:hidden !important}.x-css-shadow{position:absolute;-moz-border-radius:5px 5px;-webkit-border-radius:5px 5px;-o-border-radius:5px 5px;-ms-border-radius:5px 5px;-khtml-border-radius:5px 5px;border-radius:5px 5px}.x-ie-shadow{background-color:#777;display:none;position:absolute;overflow:hidden;zoom:1}.x-frame-shadow{display:none;position:absolute;overflow:hidden}.x-frame-shadow *{overflow:hidden}.x-frame-shadow *{padding:0;border:0;margin:0;clear:none;zoom:1}.x-frame-shadow .xstc,.x-frame-shadow .xsbc{height:6px;float:left}.x-frame-shadow .xsc{width:100%}.x-frame-shadow .xsml{background:transparent repeat-y 0 0}.x-frame-shadow .xsmr{background:transparent repeat-y -6px 0}.x-frame-shadow .xstl{background:transparent no-repeat 0 0}.x-frame-shadow .xstc{background:transparent repeat-x 0 -30px}.x-frame-shadow .xstr{background:transparent repeat-x 0 -18px}.x-frame-shadow .xsbl{background:transparent no-repeat 0 -12px}.x-frame-shadow .xsbc{background:transparent repeat-x 0 -36px}.x-frame-shadow .xsbr{background:transparent repeat-x 0 -6px}.x-frame-shadow .xstl,.x-frame-shadow .xstc,.x-frame-shadow .xstr,.x-frame-shadow .xsbl,.x-frame-shadow .xsbc,.x-frame-shadow .xsbr{width:6px;height:6px;float:left;background-image:url('../resources/themes/images/partkeepr/shared/shadow.png')}.x-frame-shadow .xsml,.x-frame-shadow .xsmr{width:6px;float:left;height:100%;background-image:url('../resources/themes/images/partkeepr/shared/shadow-lr.png')}.x-frame-shadow .xsmc{float:left;height:100%;background-image:url('../resources/themes/images/partkeepr/shared/shadow-c.png')}.x-frame-shadow .xst,.x-frame-shadow .xsb{height:6px;overflow:hidden;width:100%}.x-box-tl{background:transparent no-repeat 0 0;zoom:1}.x-box-tc{height:8px;background:transparent repeat-x 0 0;overflow:hidden}.x-box-tr{background:transparent no-repeat right -8px}.x-box-ml{background:transparent repeat-y 0;padding-left:4px;overflow:hidden;zoom:1}.x-box-mc{background:repeat-x 0 -16px;padding:4px 10px}.x-box-mc h3{margin:0 0 4px 0;zoom:1}.x-box-mr{background:transparent repeat-y right;padding-right:4px;overflow:hidden}.x-box-bl{background:transparent no-repeat 0 -16px;zoom:1}.x-box-bc{background:transparent repeat-x 0 -8px;height:8px;overflow:hidden}.x-box-br{background:transparent no-repeat right -24px}.x-box-tl,.x-box-bl{padding-left:8px;overflow:hidden}.x-box-tr,.x-box-br{padding-right:8px;overflow:hidden}.x-box-tl{background-image:url('../resources/themes/images/partkeepr/box/corners.gif')}.x-box-tc{background-image:url('../resources/themes/images/partkeepr/box/tb.gif')}.x-box-tr{background-image:url('../resources/themes/images/partkeepr/box/corners.gif')}.x-box-ml{background-image:url('../resources/themes/images/partkeepr/box/l.gif')}.x-box-mc{background-color:#eee;background-image:url('../resources/themes/images/partkeepr/box/tb.gif');font-family:"Myriad Pro","Myriad Web","Tahoma","Helvetica","Arial",sans-serif;color:#393939;font-size:15px}.x-box-mc h3{font-size:18px;font-weight:bold}.x-box-mr{background-image:url('../resources/themes/images/partkeepr/box/r.gif')}.x-box-bl{background-image:url('../resources/themes/images/partkeepr/box/corners.gif')}.x-box-bc{background-image:url('../resources/themes/images/partkeepr/box/tb.gif')}.x-box-br{background-image:url('../resources/themes/images/partkeepr/box/corners.gif')}.x-box-blue .x-box-bl,.x-box-blue .x-box-br,.x-box-blue .x-box-tl,.x-box-blue .x-box-tr{background-image:url('../resources/themes/images/partkeepr/box/corners-blue.gif')}.x-box-blue .x-box-bc,.x-box-blue .x-box-mc,.x-box-blue .x-box-tc{background-image:url('../resources/themes/images/partkeepr/box/tb-blue.gif')}.x-box-blue .x-box-mc{background-color:#c3daf9}.x-box-blue .x-box-mc h3{color:#17385b}.x-box-blue .x-box-ml{background-image:url('../resources/themes/images/partkeepr/box/l-blue.gif')}.x-box-blue .x-box-mr{background-image:url('../resources/themes/images/partkeepr/box/r-blue.gif')}.x-focus-element{position:absolute;top:-10px;left:-10px;width:0px;height:0px}.x-focus-frame{position:absolute;left:0px;top:0px;z-index:100000000;width:0px;height:0px}.x-focus-frame-top,.x-focus-frame-bottom,.x-focus-frame-left,.x-focus-frame-right{position:absolute;top:0px;left:0px}.x-focus-frame-top,.x-focus-frame-bottom{border-top:solid 2px #15428b;height:2px}.x-focus-frame-left,.x-focus-frame-right{border-left:solid 2px #15428b;width:2px}.x-mask{z-index:100;position:absolute;top:0;left:0;filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=50);opacity:0.5;width:100%;height:100%;zoom:1;background:#ccc}.x-mask-msg{z-index:20001;position:absolute;top:0;left:0;padding:2px;border:1px solid;border-color:#aaa;background-image:none;background-color:#dbdbdb}.x-mask-msg div{padding:5px 10px 5px 25px;background-image:url('../resources/themes/images/partkeepr/grid/loading.gif');background-repeat:no-repeat;background-position:5px center;cursor:wait;border:1px solid #aeaeae;background-color:#eee;color:#222;font:normal 11px tahoma,arial,verdana,sans-serif}.x-boundlist{border-width:1px;border-style:solid;border-color:#c9a5a4;background:#e1e1e1}.x-boundlist .x-toolbar{border-width:1px 0 0 0}.x-boundlist-item{padding:2px;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:ignore;cursor:default;cursor:pointer;cursor:hand;position:relative;border-width:1px;border-style:dotted;border-color:#e1e1e1}.x-boundlist-selected{background:#1c6291;border-color:#206f9e}.x-boundlist-item-over{background:#2070a6;border-color:#247eb3;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #3a99d9), color-stop(100%, #1b5f8c));background-image:-webkit-linear-gradient(top, #3a99d9,#1b5f8c);background-image:-moz-linear-gradient(top, #3a99d9,#1b5f8c);background-image:-o-linear-gradient(top, #3a99d9,#1b5f8c);background-image:-ms-linear-gradient(top, #3a99d9,#1b5f8c);background-image:linear-gradient(top, #3a99d9,#1b5f8c);color:white}.x-boundlist-floating{border-top-width:0}.x-boundlist-above{border-top-width:1px;border-bottom-width:1px}.x-btn{display:inline-block;zoom:1;*display:inline;position:relative;cursor:pointer;cursor:hand;white-space:nowrap;vertical-align:middle;-moz-box-shadow:inset 0 1px 1px 0 #fff;-webkit-box-shadow:inset 0 1px 1px 0 #fff;-o-box-shadow:inset 0 1px 1px 0 #fff;box-shadow:inset 0 1px 1px 0 #fff;background-repeat:no-repeat}.x-btn *{cursor:pointer;cursor:hand}.x-btn em{background-repeat:no-repeat}.x-btn em a{text-decoration:none;display:inline-block;color:inherit}.x-btn button{margin:0;padding:0;border:0;width:auto;background:none;outline:0 none;overflow:hidden;vertical-align:bottom;-webkit-appearance:none}.x-btn button::-moz-focus-inner{border:0;padding:0}.x-btn .x-btn-inner{display:block;white-space:nowrap;text-align:center;background-color:transparent;background-repeat:no-repeat;background-position:left center}.x-btn-disabled{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);opacity:1}.x-btn-disabled span{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=50);opacity:0.5}.x-ie6 .x-btn-disabled span,.x-ie7 .x-btn-disabled span{filter:none}.x-ie7 .x-btn-disabled,.x-ie8 .x-btn-disabled{filter:none}.x-ie6 .x-btn-disabled .x-btn-icon,.x-ie7 .x-btn-disabled .x-btn-icon,.x-ie8 .x-btn-disabled .x-btn-icon{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=60);opacity:0.6}* html .x-ie .x-btn button{width:1px}.x-ie .x-btn button{overflow-x:visible;vertical-align:baseline}.x-strict .x-ie6 .x-btn .x-frame-mc,.x-strict .x-ie7 .x-btn .x-frame-mc{height:100%}.x-nbr .x-btn .x-frame-mc{vertical-align:middle;white-space:nowrap;text-align:center;cursor:pointer}.x-btn-icon-text-left .x-btn-icon{background-position:left center}.x-btn-icon-text-right .x-btn-icon{background-position:right center}.x-btn-icon-text-top .x-btn-icon{background-position:center top}.x-btn-icon-text-bottom .x-btn-icon{background-position:center bottom}.x-btn button,.x-btn a{position:relative}.x-btn button .x-btn-icon,.x-btn a .x-btn-icon{position:absolute;background-repeat:no-repeat}.x-btn-arrow-right{background:transparent no-repeat right center;padding-right:12px}.x-btn-arrow-right .x-btn-inner{padding-right:0 !important}.x-toolbar .x-btn-arrow-right{padding-right:12px}.x-btn-arrow-bottom{background:transparent no-repeat center bottom;padding-bottom:12px}.x-btn-arrow{background-image:url('../resources/themes/images/partkeepr/button/arrow.gif');display:block}.x-btn-split-right,.x-btn-over .x-btn-split-right{background:transparent no-repeat right center;background-image:url('../resources/themes/images/partkeepr/button/s-arrow.gif');padding-right:14px !important}.x-btn-split-bottom,.x-btn-over .x-btn-split-bottom{background:transparent no-repeat center bottom;background-image:url('../resources/themes/images/partkeepr/button/s-arrow-b.gif');padding-bottom:14px}.x-toolbar .x-btn-split-right{background-image:url('../resources/themes/images/partkeepr/button/s-arrow-noline.gif');padding-right:12px !important}.x-toolbar .x-btn-split-bottom{background-image:url('../resources/themes/images/partkeepr/button/s-arrow-b-noline.gif')}.x-btn-split{display:block}.x-item-disabled,.x-item-disabled *{cursor:default}.x-cycle-fixed-width .x-btn-inner{text-align:inherit}.x-btn-over .x-btn-split-right{background-image:url('../resources/themes/images/partkeepr/button/s-arrow-o.gif')}.x-btn-over .x-btn-split-bottom{background-image:url('../resources/themes/images/partkeepr/button/s-arrow-bo.gif')}.x-btn-default-small{border-color:#b9b9b9}.x-btn-default-small{-moz-border-radius:5px;-webkit-border-radius:5px;-o-border-radius:5px;-ms-border-radius:5px;-khtml-border-radius:5px;border-radius:5px;padding:4px 4px 4px 4px;border-width:1px;border-style:solid;background-image:none;background-color:#cbcbcb;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ededed), color-stop(100%, #c7c7c7));background-image:-webkit-linear-gradient(top, #ededed,#c7c7c7);background-image:-moz-linear-gradient(top, #ededed,#c7c7c7);background-image:-o-linear-gradient(top, #ededed,#c7c7c7);background-image:-ms-linear-gradient(top, #ededed,#c7c7c7);background-image:linear-gradient(top, #ededed,#c7c7c7)}.x-nlg .x-btn-default-small-mc{background-image:url('../resources/themes/images/partkeepr/btn/btn-default-small-bg.gif');background-color:#cbcbcb}.x-nbr .x-btn-default-small{padding:0 !important;border-width:0 !important;-moz-border-radius:0px;-webkit-border-radius:0px;-o-border-radius:0px;-ms-border-radius:0px;-khtml-border-radius:0px;border-radius:0px;background-color:transparent;background-position:1100505px 1000505px}.x-nbr .x-btn-default-small-tl,.x-nbr .x-btn-default-small-bl,.x-nbr .x-btn-default-small-tr,.x-nbr .x-btn-default-small-br,.x-nbr .x-btn-default-small-tc,.x-nbr .x-btn-default-small-bc,.x-nbr .x-btn-default-small-ml,.x-nbr .x-btn-default-small-mr{zoom:1;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-small-corners.gif')}.x-nbr .x-btn-default-small-ml,.x-nbr .x-btn-default-small-mr{zoom:1;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-small-sides.gif');background-position:0 0}.x-nbr .x-btn-default-small-mc{padding:0 0 0 0}.x-btn-default-small .x-btn-inner{font-size:11px;font-weight:normal;font-family:tahoma,arial,verdana,sans-serif;color:#333;background-repeat:no-repeat;padding:0 4px}.x-btn-default-small-icon button,.x-btn-default-small-icon .x-btn-inner,.x-btn-default-small-noicon button,.x-btn-default-small-noicon .x-btn-inner{height:16px;line-height:16px}.x-btn-default-small-icon button{padding:0;width:16px !important;height:16px}.x-btn-default-small-icon .x-btn-icon{width:16px;height:16px;top:0;left:0;bottom:0;right:0}.x-btn-default-small-icon-text-left button{height:16px}.x-btn-default-small-icon-text-left .x-btn-inner{height:16px;line-height:16px;padding-left:20px}.x-btn-default-small-icon-text-left .x-btn-icon{width:16px;height:auto;top:0;left:0;bottom:0;right:auto}.x-ie6 .x-btn-default-small-icon-text-left .x-btn-icon,.x-quirks .x-btn-default-small-icon-text-left .x-btn-icon{height:16px}.x-btn-default-small-icon-text-right button{height:16px}.x-btn-default-small-icon-text-right .x-btn-inner{height:16px;line-height:16px;padding-right:20px !important}.x-btn-default-small-icon-text-right .x-btn-icon{width:16px;height:auto;top:0;left:auto;bottom:0;right:0}.x-ie6 .x-btn-default-small-icon-text-right .x-btn-icon,.x-quirks .x-btn-default-small-icon-text-right .x-btn-icon{height:16px}.x-btn-default-small-icon-text-top .x-btn-inner{padding-top:20px}.x-btn-default-small-icon-text-top .x-btn-icon{width:auto;height:16px;top:0;left:0;bottom:auto;right:0}.x-ie6 .x-btn-default-small-icon-text-top .x-btn-icon,.x-quirks .x-btn-default-small-icon-text-top .x-btn-icon{width:16px}.x-btn-default-small-icon-text-bottom .x-btn-inner{padding-bottom:20px}.x-btn-default-small-icon-text-bottom .x-btn-icon{width:auto;height:16px;top:auto;left:0;bottom:0;right:0}.x-ie6 .x-btn-default-small-icon-text-bottom .x-btn-icon,.x-quirks .x-btn-default-small-icon-text-bottom .x-btn-icon{width:16px}.x-btn-default-small-over{border-color:#cbb8b8;background-image:none;background-color:#efd5d8;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #fafafa), color-stop(100%, #c7c7c7));background-image:-webkit-linear-gradient(top, #fafafa,#c7c7c7);background-image:-moz-linear-gradient(top, #fafafa,#c7c7c7);background-image:-o-linear-gradient(top, #fafafa,#c7c7c7);background-image:-ms-linear-gradient(top, #fafafa,#c7c7c7);background-image:linear-gradient(top, #fafafa,#c7c7c7)}.x-btn-default-small-focus{border-color:#cbb8b8;background-image:none;background-color:#efd5d8;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #fafafa), color-stop(100%, #c7c7c7));background-image:-webkit-linear-gradient(top, #fafafa,#c7c7c7);background-image:-moz-linear-gradient(top, #fafafa,#c7c7c7);background-image:-o-linear-gradient(top, #fafafa,#c7c7c7);background-image:-ms-linear-gradient(top, #fafafa,#c7c7c7);background-image:linear-gradient(top, #fafafa,#c7c7c7)}.x-btn-default-small-menu-active,.x-btn-default-small-pressed{-moz-box-shadow:inset 0 1px 1px 0 #ddd;-webkit-box-shadow:inset 0 1px 1px 0 #ddd;-o-box-shadow:inset 0 1px 1px 0 #ddd;box-shadow:inset 0 1px 1px 0 #ddd;border-color:#b5abab;background-image:none;background-color:#bebebe;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #c7c7c7), color-stop(100%, #cccccc));background-image:-webkit-linear-gradient(top, #c7c7c7,#cccccc);background-image:-moz-linear-gradient(top, #c7c7c7,#cccccc);background-image:-o-linear-gradient(top, #c7c7c7,#cccccc);background-image:-ms-linear-gradient(top, #c7c7c7,#cccccc);background-image:linear-gradient(top, #c7c7c7,#cccccc)}.x-btn-default-small-disabled{-moz-box-shadow:inset 0 0px 0px 0 #fff;-webkit-box-shadow:inset 0 0px 0px 0 #fff;-o-box-shadow:inset 0 0px 0px 0 #fff;box-shadow:inset 0 0px 0px 0 #fff;border-color:#d2d2d2;background-image:none;background-color:#e7e7e7;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #e7e7e7), color-stop(48%, #e1e1e1), color-stop(52%, #cacaca), color-stop(100%, #cfcfcf));background-image:-webkit-linear-gradient(top, #e7e7e7,#e1e1e1 48%,#cacaca 52%,#cfcfcf);background-image:-moz-linear-gradient(top, #e7e7e7,#e1e1e1 48%,#cacaca 52%,#cfcfcf);background-image:-o-linear-gradient(top, #e7e7e7,#e1e1e1 48%,#cacaca 52%,#cfcfcf);background-image:-ms-linear-gradient(top, #e7e7e7,#e1e1e1 48%,#cacaca 52%,#cfcfcf);background-image:linear-gradient(top, #e7e7e7,#e1e1e1 48%,#cacaca 52%,#cfcfcf)}.x-btn-default-small-disabled .x-btn-inner{color:#333 !important}.x-ie .x-btn-default-small-disabled .x-btn-inner{color:#595959 !important}.x-ie6 .x-btn-default-small-disabled .x-btn-inner{color:#8c8c8c !important}.x-nbr .x-btn-default-small-over .x-frame-tl,.x-nbr .x-btn-default-small-over .x-frame-bl,.x-nbr .x-btn-default-small-over .x-frame-tr,.x-nbr .x-btn-default-small-over .x-frame-br,.x-nbr .x-btn-default-small-over .x-frame-tc,.x-nbr .x-btn-default-small-over .x-frame-bc{background-image:url('../resources/themes/images/partkeepr/btn/btn-default-small-over-corners.gif')}.x-nbr .x-btn-default-small-over .x-frame-ml,.x-nbr .x-btn-default-small-over .x-frame-mr{background-image:url('../resources/themes/images/partkeepr/btn/btn-default-small-over-sides.gif')}.x-nbr .x-btn-default-small-over .x-frame-mc{background-color:#efd5d8;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-small-over-bg.gif')}.x-nbr .x-btn-default-small-focus .x-frame-tl,.x-nbr .x-btn-default-small-focus .x-frame-bl,.x-nbr .x-btn-default-small-focus .x-frame-tr,.x-nbr .x-btn-default-small-focus .x-frame-br,.x-nbr .x-btn-default-small-focus .x-frame-tc,.x-nbr .x-btn-default-small-focus .x-frame-bc{background-image:url('../resources/themes/images/partkeepr/btn/btn-default-small-focus-corners.gif')}.x-nbr .x-btn-default-small-focus .x-frame-ml,.x-nbr .x-btn-default-small-focus .x-frame-mr{background-image:url('../resources/themes/images/partkeepr/btn/btn-default-small-focus-sides.gif')}.x-nbr .x-btn-default-small-focus .x-frame-mc{background-color:#efd5d8;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-small-focus-bg.gif')}.x-nbr .x-btn-default-small-menu-active .x-frame-tl,.x-nbr .x-btn-default-small-menu-active .x-frame-bl,.x-nbr .x-btn-default-small-menu-active .x-frame-tr,.x-nbr .x-btn-default-small-menu-active .x-frame-br,.x-nbr .x-btn-default-small-menu-active .x-frame-tc,.x-nbr .x-btn-default-small-menu-active .x-frame-bc,.x-nbr .x-btn-default-small-pressed .x-frame-tl,.x-nbr .x-btn-default-small-pressed .x-frame-bl,.x-nbr .x-btn-default-small-pressed .x-frame-tr,.x-nbr .x-btn-default-small-pressed .x-frame-br,.x-nbr .x-btn-default-small-pressed .x-frame-tc,.x-nbr .x-btn-default-small-pressed .x-frame-bc{background-image:url('../resources/themes/images/partkeepr/btn/btn-default-small-pressed-corners.gif')}.x-nbr .x-btn-default-small-menu-active .x-frame-ml,.x-nbr .x-btn-default-small-menu-active .x-frame-mr,.x-nbr .x-btn-default-small-pressed .x-frame-ml,.x-nbr .x-btn-default-small-pressed .x-frame-mr{background-image:url('../resources/themes/images/partkeepr/btn/btn-default-small-pressed-sides.gif')}.x-nbr .x-btn-default-small-menu-active .x-frame-mc,.x-nbr .x-btn-default-small-pressed .x-frame-mc{background-color:#bebebe;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-small-pressed-bg.gif')}.x-nbr .x-btn-default-small-disabled .x-frame-tl,.x-nbr .x-btn-default-small-disabled .x-frame-bl,.x-nbr .x-btn-default-small-disabled .x-frame-tr,.x-nbr .x-btn-default-small-disabled .x-frame-br,.x-nbr .x-btn-default-small-disabled .x-frame-tc,.x-nbr .x-btn-default-small-disabled .x-frame-bc{background-image:url('../resources/themes/images/partkeepr/btn/btn-default-small-disabled-corners.gif')}.x-nbr .x-btn-default-small-disabled .x-frame-ml,.x-nbr .x-btn-default-small-disabled .x-frame-mr{background-image:url('../resources/themes/images/partkeepr/btn/btn-default-small-disabled-sides.gif')}.x-nbr .x-btn-default-small-disabled .x-frame-mc{background-color:#e7e7e7;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-small-disabled-bg.gif')}.x-nlg .x-btn-default-small{background-repeat:repeat-x;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-small-bg.gif')}.x-nlg .x-btn-default-small-over{background-repeat:repeat-x;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-small-over-bg.gif')}.x-nlg .x-btn-default-small-focus{background-repeat:repeat-x;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-small-focus-bg.gif')}.x-nlg .x-btn-default-small-menu-active,.x-nlg .x-btn-default-small-pressed{background-repeat:repeat-x;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-small-pressed-bg.gif')}.x-nlg .x-btn-default-small-disabled{background-repeat:repeat-x;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-small-disabled-bg.gif')}.x-btn-default-medium{border-color:#b9b9b9}.x-btn-default-medium{-moz-border-radius:3px;-webkit-border-radius:3px;-o-border-radius:3px;-ms-border-radius:3px;-khtml-border-radius:3px;border-radius:3px;padding:3px 3px 3px 3px;border-width:1px;border-style:solid;background-image:none;background-color:#cbcbcb;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ededed), color-stop(100%, #c7c7c7));background-image:-webkit-linear-gradient(top, #ededed,#c7c7c7);background-image:-moz-linear-gradient(top, #ededed,#c7c7c7);background-image:-o-linear-gradient(top, #ededed,#c7c7c7);background-image:-ms-linear-gradient(top, #ededed,#c7c7c7);background-image:linear-gradient(top, #ededed,#c7c7c7)}.x-nlg .x-btn-default-medium-mc{background-image:url('../resources/themes/images/partkeepr/btn/btn-default-medium-bg.gif');background-color:#cbcbcb}.x-nbr .x-btn-default-medium{padding:0 !important;border-width:0 !important;-moz-border-radius:0px;-webkit-border-radius:0px;-o-border-radius:0px;-ms-border-radius:0px;-khtml-border-radius:0px;border-radius:0px;background-color:transparent;background-position:1100303px 1000303px}.x-nbr .x-btn-default-medium-tl,.x-nbr .x-btn-default-medium-bl,.x-nbr .x-btn-default-medium-tr,.x-nbr .x-btn-default-medium-br,.x-nbr .x-btn-default-medium-tc,.x-nbr .x-btn-default-medium-bc,.x-nbr .x-btn-default-medium-ml,.x-nbr .x-btn-default-medium-mr{zoom:1;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-medium-corners.gif')}.x-nbr .x-btn-default-medium-ml,.x-nbr .x-btn-default-medium-mr{zoom:1;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-medium-sides.gif');background-position:0 0}.x-nbr .x-btn-default-medium-mc{padding:0px 0px 0px 0px}.x-btn-default-medium .x-btn-inner{font-size:11px;font-weight:normal;font-family:tahoma,arial,verdana,sans-serif;color:#333;background-repeat:no-repeat;padding:0 3px}.x-btn-default-medium-icon button,.x-btn-default-medium-icon .x-btn-inner,.x-btn-default-medium-noicon button,.x-btn-default-medium-noicon .x-btn-inner{height:24px;line-height:24px}.x-btn-default-medium-icon button{padding:0;width:24px !important;height:24px}.x-btn-default-medium-icon .x-btn-icon{width:24px;height:24px;top:0;left:0;bottom:0;right:0}.x-btn-default-medium-icon-text-left button{height:24px}.x-btn-default-medium-icon-text-left .x-btn-inner{height:24px;line-height:24px;padding-left:28px}.x-btn-default-medium-icon-text-left .x-btn-icon{width:24px;height:auto;top:0;left:0;bottom:0;right:auto}.x-ie6 .x-btn-default-medium-icon-text-left .x-btn-icon,.x-quirks .x-btn-default-medium-icon-text-left .x-btn-icon{height:24px}.x-btn-default-medium-icon-text-right button{height:24px}.x-btn-default-medium-icon-text-right .x-btn-inner{height:24px;line-height:24px;padding-right:28px !important}.x-btn-default-medium-icon-text-right .x-btn-icon{width:24px;height:auto;top:0;left:auto;bottom:0;right:0}.x-ie6 .x-btn-default-medium-icon-text-right .x-btn-icon,.x-quirks .x-btn-default-medium-icon-text-right .x-btn-icon{height:24px}.x-btn-default-medium-icon-text-top .x-btn-inner{padding-top:28px}.x-btn-default-medium-icon-text-top .x-btn-icon{width:auto;height:24px;top:0;left:0;bottom:auto;right:0}.x-ie6 .x-btn-default-medium-icon-text-top .x-btn-icon,.x-quirks .x-btn-default-medium-icon-text-top .x-btn-icon{width:24px}.x-btn-default-medium-icon-text-bottom .x-btn-inner{padding-bottom:28px}.x-btn-default-medium-icon-text-bottom .x-btn-icon{width:auto;height:24px;top:auto;left:0;bottom:0;right:0}.x-ie6 .x-btn-default-medium-icon-text-bottom .x-btn-icon,.x-quirks .x-btn-default-medium-icon-text-bottom .x-btn-icon{width:24px}.x-btn-default-medium-over{border-color:#cbb8b8;background-image:none;background-color:#efd5d8;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #fafafa), color-stop(100%, #c7c7c7));background-image:-webkit-linear-gradient(top, #fafafa,#c7c7c7);background-image:-moz-linear-gradient(top, #fafafa,#c7c7c7);background-image:-o-linear-gradient(top, #fafafa,#c7c7c7);background-image:-ms-linear-gradient(top, #fafafa,#c7c7c7);background-image:linear-gradient(top, #fafafa,#c7c7c7)}.x-btn-default-medium-focus{border-color:#cbb8b8;background-image:none;background-color:#efd5d8;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #fafafa), color-stop(100%, #c7c7c7));background-image:-webkit-linear-gradient(top, #fafafa,#c7c7c7);background-image:-moz-linear-gradient(top, #fafafa,#c7c7c7);background-image:-o-linear-gradient(top, #fafafa,#c7c7c7);background-image:-ms-linear-gradient(top, #fafafa,#c7c7c7);background-image:linear-gradient(top, #fafafa,#c7c7c7)}.x-btn-default-medium-menu-active,.x-btn-default-medium-pressed{-moz-box-shadow:inset 0 1px 1px 0 #ddd;-webkit-box-shadow:inset 0 1px 1px 0 #ddd;-o-box-shadow:inset 0 1px 1px 0 #ddd;box-shadow:inset 0 1px 1px 0 #ddd;border-color:#b5abab;background-image:none;background-color:#bebebe;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #c7c7c7), color-stop(100%, #cccccc));background-image:-webkit-linear-gradient(top, #c7c7c7,#cccccc);background-image:-moz-linear-gradient(top, #c7c7c7,#cccccc);background-image:-o-linear-gradient(top, #c7c7c7,#cccccc);background-image:-ms-linear-gradient(top, #c7c7c7,#cccccc);background-image:linear-gradient(top, #c7c7c7,#cccccc)}.x-btn-default-medium-disabled{-moz-box-shadow:inset 0 0px 0px 0 #fff;-webkit-box-shadow:inset 0 0px 0px 0 #fff;-o-box-shadow:inset 0 0px 0px 0 #fff;box-shadow:inset 0 0px 0px 0 #fff;border-color:#d2d2d2;background-image:none;background-color:#e7e7e7;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #e7e7e7), color-stop(48%, #e1e1e1), color-stop(52%, #cacaca), color-stop(100%, #cfcfcf));background-image:-webkit-linear-gradient(top, #e7e7e7,#e1e1e1 48%,#cacaca 52%,#cfcfcf);background-image:-moz-linear-gradient(top, #e7e7e7,#e1e1e1 48%,#cacaca 52%,#cfcfcf);background-image:-o-linear-gradient(top, #e7e7e7,#e1e1e1 48%,#cacaca 52%,#cfcfcf);background-image:-ms-linear-gradient(top, #e7e7e7,#e1e1e1 48%,#cacaca 52%,#cfcfcf);background-image:linear-gradient(top, #e7e7e7,#e1e1e1 48%,#cacaca 52%,#cfcfcf)}.x-btn-default-medium-disabled .x-btn-inner{color:#333 !important}.x-ie .x-btn-default-medium-disabled .x-btn-inner{color:#595959 !important}.x-ie6 .x-btn-default-medium-disabled .x-btn-inner{color:#8c8c8c !important}.x-nbr .x-btn-default-medium-over .x-frame-tl,.x-nbr .x-btn-default-medium-over .x-frame-bl,.x-nbr .x-btn-default-medium-over .x-frame-tr,.x-nbr .x-btn-default-medium-over .x-frame-br,.x-nbr .x-btn-default-medium-over .x-frame-tc,.x-nbr .x-btn-default-medium-over .x-frame-bc{background-image:url('../resources/themes/images/partkeepr/btn/btn-default-medium-over-corners.gif')}.x-nbr .x-btn-default-medium-over .x-frame-ml,.x-nbr .x-btn-default-medium-over .x-frame-mr{background-image:url('../resources/themes/images/partkeepr/btn/btn-default-medium-over-sides.gif')}.x-nbr .x-btn-default-medium-over .x-frame-mc{background-color:#efd5d8;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-medium-over-bg.gif')}.x-nbr .x-btn-default-medium-focus .x-frame-tl,.x-nbr .x-btn-default-medium-focus .x-frame-bl,.x-nbr .x-btn-default-medium-focus .x-frame-tr,.x-nbr .x-btn-default-medium-focus .x-frame-br,.x-nbr .x-btn-default-medium-focus .x-frame-tc,.x-nbr .x-btn-default-medium-focus .x-frame-bc{background-image:url('../resources/themes/images/partkeepr/btn/btn-default-medium-focus-corners.gif')}.x-nbr .x-btn-default-medium-focus .x-frame-ml,.x-nbr .x-btn-default-medium-focus .x-frame-mr{background-image:url('../resources/themes/images/partkeepr/btn/btn-default-medium-focus-sides.gif')}.x-nbr .x-btn-default-medium-focus .x-frame-mc{background-color:#efd5d8;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-medium-focus-bg.gif')}.x-nbr .x-btn-default-medium-menu-active .x-frame-tl,.x-nbr .x-btn-default-medium-menu-active .x-frame-bl,.x-nbr .x-btn-default-medium-menu-active .x-frame-tr,.x-nbr .x-btn-default-medium-menu-active .x-frame-br,.x-nbr .x-btn-default-medium-menu-active .x-frame-tc,.x-nbr .x-btn-default-medium-menu-active .x-frame-bc,.x-nbr .x-btn-default-medium-pressed .x-frame-tl,.x-nbr .x-btn-default-medium-pressed .x-frame-bl,.x-nbr .x-btn-default-medium-pressed .x-frame-tr,.x-nbr .x-btn-default-medium-pressed .x-frame-br,.x-nbr .x-btn-default-medium-pressed .x-frame-tc,.x-nbr .x-btn-default-medium-pressed .x-frame-bc{background-image:url('../resources/themes/images/partkeepr/btn/btn-default-medium-pressed-corners.gif')}.x-nbr .x-btn-default-medium-menu-active .x-frame-ml,.x-nbr .x-btn-default-medium-menu-active .x-frame-mr,.x-nbr .x-btn-default-medium-pressed .x-frame-ml,.x-nbr .x-btn-default-medium-pressed .x-frame-mr{background-image:url('../resources/themes/images/partkeepr/btn/btn-default-medium-pressed-sides.gif')}.x-nbr .x-btn-default-medium-menu-active .x-frame-mc,.x-nbr .x-btn-default-medium-pressed .x-frame-mc{background-color:#bebebe;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-medium-pressed-bg.gif')}.x-nbr .x-btn-default-medium-disabled .x-frame-tl,.x-nbr .x-btn-default-medium-disabled .x-frame-bl,.x-nbr .x-btn-default-medium-disabled .x-frame-tr,.x-nbr .x-btn-default-medium-disabled .x-frame-br,.x-nbr .x-btn-default-medium-disabled .x-frame-tc,.x-nbr .x-btn-default-medium-disabled .x-frame-bc{background-image:url('../resources/themes/images/partkeepr/btn/btn-default-medium-disabled-corners.gif')}.x-nbr .x-btn-default-medium-disabled .x-frame-ml,.x-nbr .x-btn-default-medium-disabled .x-frame-mr{background-image:url('../resources/themes/images/partkeepr/btn/btn-default-medium-disabled-sides.gif')}.x-nbr .x-btn-default-medium-disabled .x-frame-mc{background-color:#e7e7e7;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-medium-disabled-bg.gif')}.x-nlg .x-btn-default-medium{background-repeat:repeat-x;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-medium-bg.gif')}.x-nlg .x-btn-default-medium-over{background-repeat:repeat-x;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-medium-over-bg.gif')}.x-nlg .x-btn-default-medium-focus{background-repeat:repeat-x;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-medium-focus-bg.gif')}.x-nlg .x-btn-default-medium-menu-active,.x-nlg .x-btn-default-medium-pressed{background-repeat:repeat-x;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-medium-pressed-bg.gif')}.x-nlg .x-btn-default-medium-disabled{background-repeat:repeat-x;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-medium-disabled-bg.gif')}.x-btn-default-large{border-color:#b9b9b9}.x-btn-default-large{-moz-border-radius:3px;-webkit-border-radius:3px;-o-border-radius:3px;-ms-border-radius:3px;-khtml-border-radius:3px;border-radius:3px;padding:3px 3px 3px 3px;border-width:1px;border-style:solid;background-image:none;background-color:#cbcbcb;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ededed), color-stop(100%, #c7c7c7));background-image:-webkit-linear-gradient(top, #ededed,#c7c7c7);background-image:-moz-linear-gradient(top, #ededed,#c7c7c7);background-image:-o-linear-gradient(top, #ededed,#c7c7c7);background-image:-ms-linear-gradient(top, #ededed,#c7c7c7);background-image:linear-gradient(top, #ededed,#c7c7c7)}.x-nlg .x-btn-default-large-mc{background-image:url('../resources/themes/images/partkeepr/btn/btn-default-large-bg.gif');background-color:#cbcbcb}.x-nbr .x-btn-default-large{padding:0 !important;border-width:0 !important;-moz-border-radius:0px;-webkit-border-radius:0px;-o-border-radius:0px;-ms-border-radius:0px;-khtml-border-radius:0px;border-radius:0px;background-color:transparent;background-position:1100303px 1000303px}.x-nbr .x-btn-default-large-tl,.x-nbr .x-btn-default-large-bl,.x-nbr .x-btn-default-large-tr,.x-nbr .x-btn-default-large-br,.x-nbr .x-btn-default-large-tc,.x-nbr .x-btn-default-large-bc,.x-nbr .x-btn-default-large-ml,.x-nbr .x-btn-default-large-mr{zoom:1;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-large-corners.gif')}.x-nbr .x-btn-default-large-ml,.x-nbr .x-btn-default-large-mr{zoom:1;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-large-sides.gif');background-position:0 0}.x-nbr .x-btn-default-large-mc{padding:0px 0px 0px 0px}.x-btn-default-large .x-btn-inner{font-size:11px;font-weight:normal;font-family:tahoma,arial,verdana,sans-serif;color:#333;background-repeat:no-repeat;padding:0 3px}.x-btn-default-large-icon button,.x-btn-default-large-icon .x-btn-inner,.x-btn-default-large-noicon button,.x-btn-default-large-noicon .x-btn-inner{height:32px;line-height:32px}.x-btn-default-large-icon button{padding:0;width:32px !important;height:32px}.x-btn-default-large-icon .x-btn-icon{width:32px;height:32px;top:0;left:0;bottom:0;right:0}.x-btn-default-large-icon-text-left button{height:32px}.x-btn-default-large-icon-text-left .x-btn-inner{height:32px;line-height:32px;padding-left:36px}.x-btn-default-large-icon-text-left .x-btn-icon{width:32px;height:auto;top:0;left:0;bottom:0;right:auto}.x-ie6 .x-btn-default-large-icon-text-left .x-btn-icon,.x-quirks .x-btn-default-large-icon-text-left .x-btn-icon{height:32px}.x-btn-default-large-icon-text-right button{height:32px}.x-btn-default-large-icon-text-right .x-btn-inner{height:32px;line-height:32px;padding-right:36px !important}.x-btn-default-large-icon-text-right .x-btn-icon{width:32px;height:auto;top:0;left:auto;bottom:0;right:0}.x-ie6 .x-btn-default-large-icon-text-right .x-btn-icon,.x-quirks .x-btn-default-large-icon-text-right .x-btn-icon{height:32px}.x-btn-default-large-icon-text-top .x-btn-inner{padding-top:36px}.x-btn-default-large-icon-text-top .x-btn-icon{width:auto;height:32px;top:0;left:0;bottom:auto;right:0}.x-ie6 .x-btn-default-large-icon-text-top .x-btn-icon,.x-quirks .x-btn-default-large-icon-text-top .x-btn-icon{width:32px}.x-btn-default-large-icon-text-bottom .x-btn-inner{padding-bottom:36px}.x-btn-default-large-icon-text-bottom .x-btn-icon{width:auto;height:32px;top:auto;left:0;bottom:0;right:0}.x-ie6 .x-btn-default-large-icon-text-bottom .x-btn-icon,.x-quirks .x-btn-default-large-icon-text-bottom .x-btn-icon{width:32px}.x-btn-default-large-over{border-color:#cbb8b8;background-image:none;background-color:#efd5d8;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #fafafa), color-stop(100%, #c7c7c7));background-image:-webkit-linear-gradient(top, #fafafa,#c7c7c7);background-image:-moz-linear-gradient(top, #fafafa,#c7c7c7);background-image:-o-linear-gradient(top, #fafafa,#c7c7c7);background-image:-ms-linear-gradient(top, #fafafa,#c7c7c7);background-image:linear-gradient(top, #fafafa,#c7c7c7)}.x-btn-default-large-focus{border-color:#cbb8b8;background-image:none;background-color:#efd5d8;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #fafafa), color-stop(100%, #c7c7c7));background-image:-webkit-linear-gradient(top, #fafafa,#c7c7c7);background-image:-moz-linear-gradient(top, #fafafa,#c7c7c7);background-image:-o-linear-gradient(top, #fafafa,#c7c7c7);background-image:-ms-linear-gradient(top, #fafafa,#c7c7c7);background-image:linear-gradient(top, #fafafa,#c7c7c7)}.x-btn-default-large-menu-active,.x-btn-default-large-pressed{-moz-box-shadow:inset 0 1px 1px 0 #ddd;-webkit-box-shadow:inset 0 1px 1px 0 #ddd;-o-box-shadow:inset 0 1px 1px 0 #ddd;box-shadow:inset 0 1px 1px 0 #ddd;border-color:#b5abab;background-image:none;background-color:#bebebe;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #c7c7c7), color-stop(100%, #cccccc));background-image:-webkit-linear-gradient(top, #c7c7c7,#cccccc);background-image:-moz-linear-gradient(top, #c7c7c7,#cccccc);background-image:-o-linear-gradient(top, #c7c7c7,#cccccc);background-image:-ms-linear-gradient(top, #c7c7c7,#cccccc);background-image:linear-gradient(top, #c7c7c7,#cccccc)}.x-btn-default-large-disabled{-moz-box-shadow:inset 0 0px 0px 0 #fff;-webkit-box-shadow:inset 0 0px 0px 0 #fff;-o-box-shadow:inset 0 0px 0px 0 #fff;box-shadow:inset 0 0px 0px 0 #fff;border-color:#d2d2d2;background-image:none;background-color:#e7e7e7;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #e7e7e7), color-stop(48%, #e1e1e1), color-stop(52%, #cacaca), color-stop(100%, #cfcfcf));background-image:-webkit-linear-gradient(top, #e7e7e7,#e1e1e1 48%,#cacaca 52%,#cfcfcf);background-image:-moz-linear-gradient(top, #e7e7e7,#e1e1e1 48%,#cacaca 52%,#cfcfcf);background-image:-o-linear-gradient(top, #e7e7e7,#e1e1e1 48%,#cacaca 52%,#cfcfcf);background-image:-ms-linear-gradient(top, #e7e7e7,#e1e1e1 48%,#cacaca 52%,#cfcfcf);background-image:linear-gradient(top, #e7e7e7,#e1e1e1 48%,#cacaca 52%,#cfcfcf)}.x-btn-default-large-disabled .x-btn-inner{color:#333 !important}.x-ie .x-btn-default-large-disabled .x-btn-inner{color:#595959 !important}.x-ie6 .x-btn-default-large-disabled .x-btn-inner{color:#8c8c8c !important}.x-nbr .x-btn-default-large-over .x-frame-tl,.x-nbr .x-btn-default-large-over .x-frame-bl,.x-nbr .x-btn-default-large-over .x-frame-tr,.x-nbr .x-btn-default-large-over .x-frame-br,.x-nbr .x-btn-default-large-over .x-frame-tc,.x-nbr .x-btn-default-large-over .x-frame-bc{background-image:url('../resources/themes/images/partkeepr/btn/btn-default-large-over-corners.gif')}.x-nbr .x-btn-default-large-over .x-frame-ml,.x-nbr .x-btn-default-large-over .x-frame-mr{background-image:url('../resources/themes/images/partkeepr/btn/btn-default-large-over-sides.gif')}.x-nbr .x-btn-default-large-over .x-frame-mc{background-color:#efd5d8;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-large-over-bg.gif')}.x-nbr .x-btn-default-large-focus .x-frame-tl,.x-nbr .x-btn-default-large-focus .x-frame-bl,.x-nbr .x-btn-default-large-focus .x-frame-tr,.x-nbr .x-btn-default-large-focus .x-frame-br,.x-nbr .x-btn-default-large-focus .x-frame-tc,.x-nbr .x-btn-default-large-focus .x-frame-bc{background-image:url('../resources/themes/images/partkeepr/btn/btn-default-large-focus-corners.gif')}.x-nbr .x-btn-default-large-focus .x-frame-ml,.x-nbr .x-btn-default-large-focus .x-frame-mr{background-image:url('../resources/themes/images/partkeepr/btn/btn-default-large-focus-sides.gif')}.x-nbr .x-btn-default-large-focus .x-frame-mc{background-color:#efd5d8;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-large-focus-bg.gif')}.x-nbr .x-btn-default-large-menu-active .x-frame-tl,.x-nbr .x-btn-default-large-menu-active .x-frame-bl,.x-nbr .x-btn-default-large-menu-active .x-frame-tr,.x-nbr .x-btn-default-large-menu-active .x-frame-br,.x-nbr .x-btn-default-large-menu-active .x-frame-tc,.x-nbr .x-btn-default-large-menu-active .x-frame-bc,.x-nbr .x-btn-default-large-pressed .x-frame-tl,.x-nbr .x-btn-default-large-pressed .x-frame-bl,.x-nbr .x-btn-default-large-pressed .x-frame-tr,.x-nbr .x-btn-default-large-pressed .x-frame-br,.x-nbr .x-btn-default-large-pressed .x-frame-tc,.x-nbr .x-btn-default-large-pressed .x-frame-bc{background-image:url('../resources/themes/images/partkeepr/btn/btn-default-large-pressed-corners.gif')}.x-nbr .x-btn-default-large-menu-active .x-frame-ml,.x-nbr .x-btn-default-large-menu-active .x-frame-mr,.x-nbr .x-btn-default-large-pressed .x-frame-ml,.x-nbr .x-btn-default-large-pressed .x-frame-mr{background-image:url('../resources/themes/images/partkeepr/btn/btn-default-large-pressed-sides.gif')}.x-nbr .x-btn-default-large-menu-active .x-frame-mc,.x-nbr .x-btn-default-large-pressed .x-frame-mc{background-color:#bebebe;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-large-pressed-bg.gif')}.x-nbr .x-btn-default-large-disabled .x-frame-tl,.x-nbr .x-btn-default-large-disabled .x-frame-bl,.x-nbr .x-btn-default-large-disabled .x-frame-tr,.x-nbr .x-btn-default-large-disabled .x-frame-br,.x-nbr .x-btn-default-large-disabled .x-frame-tc,.x-nbr .x-btn-default-large-disabled .x-frame-bc{background-image:url('../resources/themes/images/partkeepr/btn/btn-default-large-disabled-corners.gif')}.x-nbr .x-btn-default-large-disabled .x-frame-ml,.x-nbr .x-btn-default-large-disabled .x-frame-mr{background-image:url('../resources/themes/images/partkeepr/btn/btn-default-large-disabled-sides.gif')}.x-nbr .x-btn-default-large-disabled .x-frame-mc{background-color:#e7e7e7;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-large-disabled-bg.gif')}.x-nlg .x-btn-default-large{background-repeat:repeat-x;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-large-bg.gif')}.x-nlg .x-btn-default-large-over{background-repeat:repeat-x;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-large-over-bg.gif')}.x-nlg .x-btn-default-large-focus{background-repeat:repeat-x;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-large-focus-bg.gif')}.x-nlg .x-btn-default-large-menu-active,.x-nlg .x-btn-default-large-pressed{background-repeat:repeat-x;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-large-pressed-bg.gif')}.x-nlg .x-btn-default-large-disabled{background-repeat:repeat-x;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-large-disabled-bg.gif')}.x-btn-default-toolbar-small{border-color:#b9b9b9}.x-btn-default-toolbar-small{-moz-border-radius:5px;-webkit-border-radius:5px;-o-border-radius:5px;-ms-border-radius:5px;-khtml-border-radius:5px;border-radius:5px;padding:4px 4px 4px 4px;border-width:1px;border-style:solid;background-image:none;background-color:#c7c7c7;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ededed), color-stop(100%, #c7c7c7));background-image:-webkit-linear-gradient(top, #ededed,#c7c7c7);background-image:-moz-linear-gradient(top, #ededed,#c7c7c7);background-image:-o-linear-gradient(top, #ededed,#c7c7c7);background-image:-ms-linear-gradient(top, #ededed,#c7c7c7);background-image:linear-gradient(top, #ededed,#c7c7c7)}.x-nlg .x-btn-default-toolbar-small-mc{background-image:url('../resources/themes/images/partkeepr/btn/btn-default-toolbar-small-bg.gif');background-color:#c7c7c7}.x-nbr .x-btn-default-toolbar-small{padding:0 !important;border-width:0 !important;-moz-border-radius:0px;-webkit-border-radius:0px;-o-border-radius:0px;-ms-border-radius:0px;-khtml-border-radius:0px;border-radius:0px;background-color:transparent;background-position:1100505px 1000505px}.x-nbr .x-btn-default-toolbar-small-tl,.x-nbr .x-btn-default-toolbar-small-bl,.x-nbr .x-btn-default-toolbar-small-tr,.x-nbr .x-btn-default-toolbar-small-br,.x-nbr .x-btn-default-toolbar-small-tc,.x-nbr .x-btn-default-toolbar-small-bc,.x-nbr .x-btn-default-toolbar-small-ml,.x-nbr .x-btn-default-toolbar-small-mr{zoom:1;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-toolbar-small-corners.gif')}.x-nbr .x-btn-default-toolbar-small-ml,.x-nbr .x-btn-default-toolbar-small-mr{zoom:1;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-toolbar-small-sides.gif');background-position:0 0}.x-nbr .x-btn-default-toolbar-small-mc{padding:0 0 0 0}.x-btn-default-toolbar-small .x-btn-inner{font-size:11px;font-weight:normal;font-family:tahoma,arial,verdana,sans-serif;color:#333;background-repeat:no-repeat;padding:0 4px}.x-btn-default-toolbar-small-icon button,.x-btn-default-toolbar-small-icon .x-btn-inner,.x-btn-default-toolbar-small-noicon button,.x-btn-default-toolbar-small-noicon .x-btn-inner{height:16px;line-height:16px}.x-btn-default-toolbar-small-icon button{padding:0;width:16px !important;height:16px}.x-btn-default-toolbar-small-icon .x-btn-icon{width:16px;height:16px;top:0;left:0;bottom:0;right:0}.x-btn-default-toolbar-small-icon-text-left button{height:16px}.x-btn-default-toolbar-small-icon-text-left .x-btn-inner{height:16px;line-height:16px;padding-left:20px}.x-btn-default-toolbar-small-icon-text-left .x-btn-icon{width:16px;height:auto;top:0;left:0;bottom:0;right:auto}.x-ie6 .x-btn-default-toolbar-small-icon-text-left .x-btn-icon,.x-quirks .x-btn-default-toolbar-small-icon-text-left .x-btn-icon{height:16px}.x-btn-default-toolbar-small-icon-text-right button{height:16px}.x-btn-default-toolbar-small-icon-text-right .x-btn-inner{height:16px;line-height:16px;padding-right:20px !important}.x-btn-default-toolbar-small-icon-text-right .x-btn-icon{width:16px;height:auto;top:0;left:auto;bottom:0;right:0}.x-ie6 .x-btn-default-toolbar-small-icon-text-right .x-btn-icon,.x-quirks .x-btn-default-toolbar-small-icon-text-right .x-btn-icon{height:16px}.x-btn-default-toolbar-small-icon-text-top .x-btn-inner{padding-top:20px}.x-btn-default-toolbar-small-icon-text-top .x-btn-icon{width:auto;height:16px;top:0;left:0;bottom:auto;right:0}.x-ie6 .x-btn-default-toolbar-small-icon-text-top .x-btn-icon,.x-quirks .x-btn-default-toolbar-small-icon-text-top .x-btn-icon{width:16px}.x-btn-default-toolbar-small-icon-text-bottom .x-btn-inner{padding-bottom:20px}.x-btn-default-toolbar-small-icon-text-bottom .x-btn-icon{width:auto;height:16px;top:auto;left:0;bottom:0;right:0}.x-ie6 .x-btn-default-toolbar-small-icon-text-bottom .x-btn-icon,.x-quirks .x-btn-default-toolbar-small-icon-text-bottom .x-btn-icon{width:16px}.x-btn-default-toolbar-small-over{border-color:#999;background-image:none;background-color:#eccfd1;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #fafafa), color-stop(100%, #c7c7c7));background-image:-webkit-linear-gradient(top, #fafafa,#c7c7c7);background-image:-moz-linear-gradient(top, #fafafa,#c7c7c7);background-image:-o-linear-gradient(top, #fafafa,#c7c7c7);background-image:-ms-linear-gradient(top, #fafafa,#c7c7c7);background-image:linear-gradient(top, #fafafa,#c7c7c7)}.x-btn-default-toolbar-small-focus{border-color:#999;background-image:none;background-color:#eccfd1;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #fafafa), color-stop(100%, #c7c7c7));background-image:-webkit-linear-gradient(top, #fafafa,#c7c7c7);background-image:-moz-linear-gradient(top, #fafafa,#c7c7c7);background-image:-o-linear-gradient(top, #fafafa,#c7c7c7);background-image:-ms-linear-gradient(top, #fafafa,#c7c7c7);background-image:linear-gradient(top, #fafafa,#c7c7c7)}.x-btn-default-toolbar-small-menu-active,.x-btn-default-toolbar-small-pressed{-moz-box-shadow:inset 0 1px 1px 0 #ddd;-webkit-box-shadow:inset 0 1px 1px 0 #ddd;-o-box-shadow:inset 0 1px 1px 0 #ddd;box-shadow:inset 0 1px 1px 0 #ddd;border-color:#8f8f8f;background-image:none;background-color:#c1c1c1;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #c7c7c7), color-stop(100%, #cccccc));background-image:-webkit-linear-gradient(top, #c7c7c7,#cccccc);background-image:-moz-linear-gradient(top, #c7c7c7,#cccccc);background-image:-o-linear-gradient(top, #c7c7c7,#cccccc);background-image:-ms-linear-gradient(top, #c7c7c7,#cccccc);background-image:linear-gradient(top, #c7c7c7,#cccccc)}.x-btn-default-toolbar-small-disabled{-moz-box-shadow:inset 0 0px 0px 0 #fff;-webkit-box-shadow:inset 0 0px 0px 0 #fff;-o-box-shadow:inset 0 0px 0px 0 #fff;box-shadow:inset 0 0px 0px 0 #fff;border-color:transparent;background-image:none;background-color:transparent}.x-btn-default-toolbar-small-disabled .x-btn-inner{color:#333 !important}.x-ie .x-btn-default-toolbar-small-disabled .x-btn-inner{color:#595959 !important}.x-ie6 .x-btn-default-toolbar-small-disabled .x-btn-inner{color:#8c8c8c !important}.x-nbr .x-btn-default-toolbar-small-over .x-frame-tl,.x-nbr .x-btn-default-toolbar-small-over .x-frame-bl,.x-nbr .x-btn-default-toolbar-small-over .x-frame-tr,.x-nbr .x-btn-default-toolbar-small-over .x-frame-br,.x-nbr .x-btn-default-toolbar-small-over .x-frame-tc,.x-nbr .x-btn-default-toolbar-small-over .x-frame-bc{background-image:url('../resources/themes/images/partkeepr/btn/btn-default-toolbar-small-over-corners.gif')}.x-nbr .x-btn-default-toolbar-small-over .x-frame-ml,.x-nbr .x-btn-default-toolbar-small-over .x-frame-mr{background-image:url('../resources/themes/images/partkeepr/btn/btn-default-toolbar-small-over-sides.gif')}.x-nbr .x-btn-default-toolbar-small-over .x-frame-mc{background-color:#eccfd1;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-toolbar-small-over-bg.gif')}.x-nbr .x-btn-default-toolbar-small-focus .x-frame-tl,.x-nbr .x-btn-default-toolbar-small-focus .x-frame-bl,.x-nbr .x-btn-default-toolbar-small-focus .x-frame-tr,.x-nbr .x-btn-default-toolbar-small-focus .x-frame-br,.x-nbr .x-btn-default-toolbar-small-focus .x-frame-tc,.x-nbr .x-btn-default-toolbar-small-focus .x-frame-bc{background-image:url('../resources/themes/images/partkeepr/btn/btn-default-toolbar-small-focus-corners.gif')}.x-nbr .x-btn-default-toolbar-small-focus .x-frame-ml,.x-nbr .x-btn-default-toolbar-small-focus .x-frame-mr{background-image:url('../resources/themes/images/partkeepr/btn/btn-default-toolbar-small-focus-sides.gif')}.x-nbr .x-btn-default-toolbar-small-focus .x-frame-mc{background-color:#eccfd1;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-toolbar-small-focus-bg.gif')}.x-nbr .x-btn-default-toolbar-small-menu-active .x-frame-tl,.x-nbr .x-btn-default-toolbar-small-menu-active .x-frame-bl,.x-nbr .x-btn-default-toolbar-small-menu-active .x-frame-tr,.x-nbr .x-btn-default-toolbar-small-menu-active .x-frame-br,.x-nbr .x-btn-default-toolbar-small-menu-active .x-frame-tc,.x-nbr .x-btn-default-toolbar-small-menu-active .x-frame-bc,.x-nbr .x-btn-default-toolbar-small-pressed .x-frame-tl,.x-nbr .x-btn-default-toolbar-small-pressed .x-frame-bl,.x-nbr .x-btn-default-toolbar-small-pressed .x-frame-tr,.x-nbr .x-btn-default-toolbar-small-pressed .x-frame-br,.x-nbr .x-btn-default-toolbar-small-pressed .x-frame-tc,.x-nbr .x-btn-default-toolbar-small-pressed .x-frame-bc{background-image:url('../resources/themes/images/partkeepr/btn/btn-default-toolbar-small-pressed-corners.gif')}.x-nbr .x-btn-default-toolbar-small-menu-active .x-frame-ml,.x-nbr .x-btn-default-toolbar-small-menu-active .x-frame-mr,.x-nbr .x-btn-default-toolbar-small-pressed .x-frame-ml,.x-nbr .x-btn-default-toolbar-small-pressed .x-frame-mr{background-image:url('../resources/themes/images/partkeepr/btn/btn-default-toolbar-small-pressed-sides.gif')}.x-nbr .x-btn-default-toolbar-small-menu-active .x-frame-mc,.x-nbr .x-btn-default-toolbar-small-pressed .x-frame-mc{background-color:#c1c1c1;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-toolbar-small-pressed-bg.gif')}.x-nbr .x-btn-default-toolbar-small-disabled .x-frame-tl,.x-nbr .x-btn-default-toolbar-small-disabled .x-frame-bl,.x-nbr .x-btn-default-toolbar-small-disabled .x-frame-tr,.x-nbr .x-btn-default-toolbar-small-disabled .x-frame-br,.x-nbr .x-btn-default-toolbar-small-disabled .x-frame-tc,.x-nbr .x-btn-default-toolbar-small-disabled .x-frame-bc{background-image:url('../resources/themes/images/partkeepr/btn/btn-default-toolbar-small-disabled-corners.gif')}.x-nbr .x-btn-default-toolbar-small-disabled .x-frame-ml,.x-nbr .x-btn-default-toolbar-small-disabled .x-frame-mr{background-image:url('../resources/themes/images/partkeepr/btn/btn-default-toolbar-small-disabled-sides.gif')}.x-nbr .x-btn-default-toolbar-small-disabled .x-frame-mc{background-color:transparent}.x-nlg .x-btn-default-toolbar-small{background-repeat:repeat-x;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-toolbar-small-bg.gif')}.x-nlg .x-btn-default-toolbar-small-over{background-repeat:repeat-x;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-toolbar-small-over-bg.gif')}.x-nlg .x-btn-default-toolbar-small-focus{background-repeat:repeat-x;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-toolbar-small-focus-bg.gif')}.x-nlg .x-btn-default-toolbar-small-menu-active,.x-nlg .x-btn-default-toolbar-small-pressed{background-repeat:repeat-x;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-toolbar-small-pressed-bg.gif')}.x-btn-default-toolbar-medium{border-color:#b9b9b9}.x-btn-default-toolbar-medium{-moz-border-radius:3px;-webkit-border-radius:3px;-o-border-radius:3px;-ms-border-radius:3px;-khtml-border-radius:3px;border-radius:3px;padding:3px 3px 3px 3px;border-width:1px;border-style:solid;background-image:none;background-color:#c7c7c7;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ededed), color-stop(100%, #c7c7c7));background-image:-webkit-linear-gradient(top, #ededed,#c7c7c7);background-image:-moz-linear-gradient(top, #ededed,#c7c7c7);background-image:-o-linear-gradient(top, #ededed,#c7c7c7);background-image:-ms-linear-gradient(top, #ededed,#c7c7c7);background-image:linear-gradient(top, #ededed,#c7c7c7)}.x-nlg .x-btn-default-toolbar-medium-mc{background-image:url('../resources/themes/images/partkeepr/btn/btn-default-toolbar-medium-bg.gif');background-color:#c7c7c7}.x-nbr .x-btn-default-toolbar-medium{padding:0 !important;border-width:0 !important;-moz-border-radius:0px;-webkit-border-radius:0px;-o-border-radius:0px;-ms-border-radius:0px;-khtml-border-radius:0px;border-radius:0px;background-color:transparent;background-position:1100303px 1000303px}.x-nbr .x-btn-default-toolbar-medium-tl,.x-nbr .x-btn-default-toolbar-medium-bl,.x-nbr .x-btn-default-toolbar-medium-tr,.x-nbr .x-btn-default-toolbar-medium-br,.x-nbr .x-btn-default-toolbar-medium-tc,.x-nbr .x-btn-default-toolbar-medium-bc,.x-nbr .x-btn-default-toolbar-medium-ml,.x-nbr .x-btn-default-toolbar-medium-mr{zoom:1;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-toolbar-medium-corners.gif')}.x-nbr .x-btn-default-toolbar-medium-ml,.x-nbr .x-btn-default-toolbar-medium-mr{zoom:1;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-toolbar-medium-sides.gif');background-position:0 0}.x-nbr .x-btn-default-toolbar-medium-mc{padding:0px 0px 0px 0px}.x-btn-default-toolbar-medium .x-btn-inner{font-size:11px;font-weight:normal;font-family:tahoma,arial,verdana,sans-serif;color:#333;background-repeat:no-repeat;padding:0 3px}.x-btn-default-toolbar-medium-icon button,.x-btn-default-toolbar-medium-icon .x-btn-inner,.x-btn-default-toolbar-medium-noicon button,.x-btn-default-toolbar-medium-noicon .x-btn-inner{height:24px;line-height:24px}.x-btn-default-toolbar-medium-icon button{padding:0;width:24px !important;height:24px}.x-btn-default-toolbar-medium-icon .x-btn-icon{width:24px;height:24px;top:0;left:0;bottom:0;right:0}.x-btn-default-toolbar-medium-icon-text-left button{height:24px}.x-btn-default-toolbar-medium-icon-text-left .x-btn-inner{height:24px;line-height:24px;padding-left:28px}.x-btn-default-toolbar-medium-icon-text-left .x-btn-icon{width:24px;height:auto;top:0;left:0;bottom:0;right:auto}.x-ie6 .x-btn-default-toolbar-medium-icon-text-left .x-btn-icon,.x-quirks .x-btn-default-toolbar-medium-icon-text-left .x-btn-icon{height:24px}.x-btn-default-toolbar-medium-icon-text-right button{height:24px}.x-btn-default-toolbar-medium-icon-text-right .x-btn-inner{height:24px;line-height:24px;padding-right:28px !important}.x-btn-default-toolbar-medium-icon-text-right .x-btn-icon{width:24px;height:auto;top:0;left:auto;bottom:0;right:0}.x-ie6 .x-btn-default-toolbar-medium-icon-text-right .x-btn-icon,.x-quirks .x-btn-default-toolbar-medium-icon-text-right .x-btn-icon{height:24px}.x-btn-default-toolbar-medium-icon-text-top .x-btn-inner{padding-top:28px}.x-btn-default-toolbar-medium-icon-text-top .x-btn-icon{width:auto;height:24px;top:0;left:0;bottom:auto;right:0}.x-ie6 .x-btn-default-toolbar-medium-icon-text-top .x-btn-icon,.x-quirks .x-btn-default-toolbar-medium-icon-text-top .x-btn-icon{width:24px}.x-btn-default-toolbar-medium-icon-text-bottom .x-btn-inner{padding-bottom:28px}.x-btn-default-toolbar-medium-icon-text-bottom .x-btn-icon{width:auto;height:24px;top:auto;left:0;bottom:0;right:0}.x-ie6 .x-btn-default-toolbar-medium-icon-text-bottom .x-btn-icon,.x-quirks .x-btn-default-toolbar-medium-icon-text-bottom .x-btn-icon{width:24px}.x-btn-default-toolbar-medium-over{border-color:#999;background-image:none;background-color:#eccfd1;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #fafafa), color-stop(100%, #c7c7c7));background-image:-webkit-linear-gradient(top, #fafafa,#c7c7c7);background-image:-moz-linear-gradient(top, #fafafa,#c7c7c7);background-image:-o-linear-gradient(top, #fafafa,#c7c7c7);background-image:-ms-linear-gradient(top, #fafafa,#c7c7c7);background-image:linear-gradient(top, #fafafa,#c7c7c7)}.x-btn-default-toolbar-medium-focus{border-color:#999;background-image:none;background-color:#eccfd1;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #fafafa), color-stop(100%, #c7c7c7));background-image:-webkit-linear-gradient(top, #fafafa,#c7c7c7);background-image:-moz-linear-gradient(top, #fafafa,#c7c7c7);background-image:-o-linear-gradient(top, #fafafa,#c7c7c7);background-image:-ms-linear-gradient(top, #fafafa,#c7c7c7);background-image:linear-gradient(top, #fafafa,#c7c7c7)}.x-btn-default-toolbar-medium-menu-active,.x-btn-default-toolbar-medium-pressed{-moz-box-shadow:inset 0 1px 1px 0 #ddd;-webkit-box-shadow:inset 0 1px 1px 0 #ddd;-o-box-shadow:inset 0 1px 1px 0 #ddd;box-shadow:inset 0 1px 1px 0 #ddd;border-color:#8f8f8f;background-image:none;background-color:#c1c1c1;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #c7c7c7), color-stop(100%, #cccccc));background-image:-webkit-linear-gradient(top, #c7c7c7,#cccccc);background-image:-moz-linear-gradient(top, #c7c7c7,#cccccc);background-image:-o-linear-gradient(top, #c7c7c7,#cccccc);background-image:-ms-linear-gradient(top, #c7c7c7,#cccccc);background-image:linear-gradient(top, #c7c7c7,#cccccc)}.x-btn-default-toolbar-medium-disabled{-moz-box-shadow:inset 0 0px 0px 0 #fff;-webkit-box-shadow:inset 0 0px 0px 0 #fff;-o-box-shadow:inset 0 0px 0px 0 #fff;box-shadow:inset 0 0px 0px 0 #fff;border-color:transparent;background-image:none;background-color:transparent}.x-btn-default-toolbar-medium-disabled .x-btn-inner{color:#333 !important}.x-ie .x-btn-default-toolbar-medium-disabled .x-btn-inner{color:#595959 !important}.x-ie6 .x-btn-default-toolbar-medium-disabled .x-btn-inner{color:#8c8c8c !important}.x-nbr .x-btn-default-toolbar-medium-over .x-frame-tl,.x-nbr .x-btn-default-toolbar-medium-over .x-frame-bl,.x-nbr .x-btn-default-toolbar-medium-over .x-frame-tr,.x-nbr .x-btn-default-toolbar-medium-over .x-frame-br,.x-nbr .x-btn-default-toolbar-medium-over .x-frame-tc,.x-nbr .x-btn-default-toolbar-medium-over .x-frame-bc{background-image:url('../resources/themes/images/partkeepr/btn/btn-default-toolbar-medium-over-corners.gif')}.x-nbr .x-btn-default-toolbar-medium-over .x-frame-ml,.x-nbr .x-btn-default-toolbar-medium-over .x-frame-mr{background-image:url('../resources/themes/images/partkeepr/btn/btn-default-toolbar-medium-over-sides.gif')}.x-nbr .x-btn-default-toolbar-medium-over .x-frame-mc{background-color:#eccfd1;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-toolbar-medium-over-bg.gif')}.x-nbr .x-btn-default-toolbar-medium-focus .x-frame-tl,.x-nbr .x-btn-default-toolbar-medium-focus .x-frame-bl,.x-nbr .x-btn-default-toolbar-medium-focus .x-frame-tr,.x-nbr .x-btn-default-toolbar-medium-focus .x-frame-br,.x-nbr .x-btn-default-toolbar-medium-focus .x-frame-tc,.x-nbr .x-btn-default-toolbar-medium-focus .x-frame-bc{background-image:url('../resources/themes/images/partkeepr/btn/btn-default-toolbar-medium-focus-corners.gif')}.x-nbr .x-btn-default-toolbar-medium-focus .x-frame-ml,.x-nbr .x-btn-default-toolbar-medium-focus .x-frame-mr{background-image:url('../resources/themes/images/partkeepr/btn/btn-default-toolbar-medium-focus-sides.gif')}.x-nbr .x-btn-default-toolbar-medium-focus .x-frame-mc{background-color:#eccfd1;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-toolbar-medium-focus-bg.gif')}.x-nbr .x-btn-default-toolbar-medium-menu-active .x-frame-tl,.x-nbr .x-btn-default-toolbar-medium-menu-active .x-frame-bl,.x-nbr .x-btn-default-toolbar-medium-menu-active .x-frame-tr,.x-nbr .x-btn-default-toolbar-medium-menu-active .x-frame-br,.x-nbr .x-btn-default-toolbar-medium-menu-active .x-frame-tc,.x-nbr .x-btn-default-toolbar-medium-menu-active .x-frame-bc,.x-nbr .x-btn-default-toolbar-medium-pressed .x-frame-tl,.x-nbr .x-btn-default-toolbar-medium-pressed .x-frame-bl,.x-nbr .x-btn-default-toolbar-medium-pressed .x-frame-tr,.x-nbr .x-btn-default-toolbar-medium-pressed .x-frame-br,.x-nbr .x-btn-default-toolbar-medium-pressed .x-frame-tc,.x-nbr .x-btn-default-toolbar-medium-pressed .x-frame-bc{background-image:url('../resources/themes/images/partkeepr/btn/btn-default-toolbar-medium-pressed-corners.gif')}.x-nbr .x-btn-default-toolbar-medium-menu-active .x-frame-ml,.x-nbr .x-btn-default-toolbar-medium-menu-active .x-frame-mr,.x-nbr .x-btn-default-toolbar-medium-pressed .x-frame-ml,.x-nbr .x-btn-default-toolbar-medium-pressed .x-frame-mr{background-image:url('../resources/themes/images/partkeepr/btn/btn-default-toolbar-medium-pressed-sides.gif')}.x-nbr .x-btn-default-toolbar-medium-menu-active .x-frame-mc,.x-nbr .x-btn-default-toolbar-medium-pressed .x-frame-mc{background-color:#c1c1c1;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-toolbar-medium-pressed-bg.gif')}.x-nbr .x-btn-default-toolbar-medium-disabled .x-frame-tl,.x-nbr .x-btn-default-toolbar-medium-disabled .x-frame-bl,.x-nbr .x-btn-default-toolbar-medium-disabled .x-frame-tr,.x-nbr .x-btn-default-toolbar-medium-disabled .x-frame-br,.x-nbr .x-btn-default-toolbar-medium-disabled .x-frame-tc,.x-nbr .x-btn-default-toolbar-medium-disabled .x-frame-bc{background-image:url('../resources/themes/images/partkeepr/btn/btn-default-toolbar-medium-disabled-corners.gif')}.x-nbr .x-btn-default-toolbar-medium-disabled .x-frame-ml,.x-nbr .x-btn-default-toolbar-medium-disabled .x-frame-mr{background-image:url('../resources/themes/images/partkeepr/btn/btn-default-toolbar-medium-disabled-sides.gif')}.x-nbr .x-btn-default-toolbar-medium-disabled .x-frame-mc{background-color:transparent}.x-nlg .x-btn-default-toolbar-medium{background-repeat:repeat-x;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-toolbar-medium-bg.gif')}.x-nlg .x-btn-default-toolbar-medium-over{background-repeat:repeat-x;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-toolbar-medium-over-bg.gif')}.x-nlg .x-btn-default-toolbar-medium-focus{background-repeat:repeat-x;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-toolbar-medium-focus-bg.gif')}.x-nlg .x-btn-default-toolbar-medium-menu-active,.x-nlg .x-btn-default-toolbar-medium-pressed{background-repeat:repeat-x;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-toolbar-medium-pressed-bg.gif')}.x-btn-default-toolbar-large{border-color:#b9b9b9}.x-btn-default-toolbar-large{-moz-border-radius:3px;-webkit-border-radius:3px;-o-border-radius:3px;-ms-border-radius:3px;-khtml-border-radius:3px;border-radius:3px;padding:3px 3px 3px 3px;border-width:1px;border-style:solid;background-image:none;background-color:#c7c7c7;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ededed), color-stop(100%, #c7c7c7));background-image:-webkit-linear-gradient(top, #ededed,#c7c7c7);background-image:-moz-linear-gradient(top, #ededed,#c7c7c7);background-image:-o-linear-gradient(top, #ededed,#c7c7c7);background-image:-ms-linear-gradient(top, #ededed,#c7c7c7);background-image:linear-gradient(top, #ededed,#c7c7c7)}.x-nlg .x-btn-default-toolbar-large-mc{background-image:url('../resources/themes/images/partkeepr/btn/btn-default-toolbar-large-bg.gif');background-color:#c7c7c7}.x-nbr .x-btn-default-toolbar-large{padding:0 !important;border-width:0 !important;-moz-border-radius:0px;-webkit-border-radius:0px;-o-border-radius:0px;-ms-border-radius:0px;-khtml-border-radius:0px;border-radius:0px;background-color:transparent;background-position:1100303px 1000303px}.x-nbr .x-btn-default-toolbar-large-tl,.x-nbr .x-btn-default-toolbar-large-bl,.x-nbr .x-btn-default-toolbar-large-tr,.x-nbr .x-btn-default-toolbar-large-br,.x-nbr .x-btn-default-toolbar-large-tc,.x-nbr .x-btn-default-toolbar-large-bc,.x-nbr .x-btn-default-toolbar-large-ml,.x-nbr .x-btn-default-toolbar-large-mr{zoom:1;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-toolbar-large-corners.gif')}.x-nbr .x-btn-default-toolbar-large-ml,.x-nbr .x-btn-default-toolbar-large-mr{zoom:1;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-toolbar-large-sides.gif');background-position:0 0}.x-nbr .x-btn-default-toolbar-large-mc{padding:0px 0px 0px 0px}.x-btn-default-toolbar-large .x-btn-inner{font-size:11px;font-weight:normal;font-family:tahoma,arial,verdana,sans-serif;color:#333;background-repeat:no-repeat;padding:0 3px}.x-btn-default-toolbar-large-icon button,.x-btn-default-toolbar-large-icon .x-btn-inner,.x-btn-default-toolbar-large-noicon button,.x-btn-default-toolbar-large-noicon .x-btn-inner{height:32px;line-height:32px}.x-btn-default-toolbar-large-icon button{padding:0;width:32px !important;height:32px}.x-btn-default-toolbar-large-icon .x-btn-icon{width:32px;height:32px;top:0;left:0;bottom:0;right:0}.x-btn-default-toolbar-large-icon-text-left button{height:32px}.x-btn-default-toolbar-large-icon-text-left .x-btn-inner{height:32px;line-height:32px;padding-left:36px}.x-btn-default-toolbar-large-icon-text-left .x-btn-icon{width:32px;height:auto;top:0;left:0;bottom:0;right:auto}.x-ie6 .x-btn-default-toolbar-large-icon-text-left .x-btn-icon,.x-quirks .x-btn-default-toolbar-large-icon-text-left .x-btn-icon{height:32px}.x-btn-default-toolbar-large-icon-text-right button{height:32px}.x-btn-default-toolbar-large-icon-text-right .x-btn-inner{height:32px;line-height:32px;padding-right:36px !important}.x-btn-default-toolbar-large-icon-text-right .x-btn-icon{width:32px;height:auto;top:0;left:auto;bottom:0;right:0}.x-ie6 .x-btn-default-toolbar-large-icon-text-right .x-btn-icon,.x-quirks .x-btn-default-toolbar-large-icon-text-right .x-btn-icon{height:32px}.x-btn-default-toolbar-large-icon-text-top .x-btn-inner{padding-top:36px}.x-btn-default-toolbar-large-icon-text-top .x-btn-icon{width:auto;height:32px;top:0;left:0;bottom:auto;right:0}.x-ie6 .x-btn-default-toolbar-large-icon-text-top .x-btn-icon,.x-quirks .x-btn-default-toolbar-large-icon-text-top .x-btn-icon{width:32px}.x-btn-default-toolbar-large-icon-text-bottom .x-btn-inner{padding-bottom:36px}.x-btn-default-toolbar-large-icon-text-bottom .x-btn-icon{width:auto;height:32px;top:auto;left:0;bottom:0;right:0}.x-ie6 .x-btn-default-toolbar-large-icon-text-bottom .x-btn-icon,.x-quirks .x-btn-default-toolbar-large-icon-text-bottom .x-btn-icon{width:32px}.x-btn-default-toolbar-large-over{border-color:#999;background-image:none;background-color:#eccfd1;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #fafafa), color-stop(100%, #c7c7c7));background-image:-webkit-linear-gradient(top, #fafafa,#c7c7c7);background-image:-moz-linear-gradient(top, #fafafa,#c7c7c7);background-image:-o-linear-gradient(top, #fafafa,#c7c7c7);background-image:-ms-linear-gradient(top, #fafafa,#c7c7c7);background-image:linear-gradient(top, #fafafa,#c7c7c7)}.x-btn-default-toolbar-large-focus{border-color:#999;background-image:none;background-color:#eccfd1;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #fafafa), color-stop(100%, #c7c7c7));background-image:-webkit-linear-gradient(top, #fafafa,#c7c7c7);background-image:-moz-linear-gradient(top, #fafafa,#c7c7c7);background-image:-o-linear-gradient(top, #fafafa,#c7c7c7);background-image:-ms-linear-gradient(top, #fafafa,#c7c7c7);background-image:linear-gradient(top, #fafafa,#c7c7c7)}.x-btn-default-toolbar-large-menu-active,.x-btn-default-toolbar-large-pressed{-moz-box-shadow:inset 0 1px 1px 0 #ddd;-webkit-box-shadow:inset 0 1px 1px 0 #ddd;-o-box-shadow:inset 0 1px 1px 0 #ddd;box-shadow:inset 0 1px 1px 0 #ddd;border-color:#8f8f8f;background-image:none;background-color:#c1c1c1;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #c7c7c7), color-stop(100%, #cccccc));background-image:-webkit-linear-gradient(top, #c7c7c7,#cccccc);background-image:-moz-linear-gradient(top, #c7c7c7,#cccccc);background-image:-o-linear-gradient(top, #c7c7c7,#cccccc);background-image:-ms-linear-gradient(top, #c7c7c7,#cccccc);background-image:linear-gradient(top, #c7c7c7,#cccccc)}.x-btn-default-toolbar-large-disabled{-moz-box-shadow:inset 0 0px 0px 0 #fff;-webkit-box-shadow:inset 0 0px 0px 0 #fff;-o-box-shadow:inset 0 0px 0px 0 #fff;box-shadow:inset 0 0px 0px 0 #fff;border-color:transparent;background-image:none;background-color:transparent}.x-btn-default-toolbar-large-disabled .x-btn-inner{color:#333 !important}.x-ie .x-btn-default-toolbar-large-disabled .x-btn-inner{color:#595959 !important}.x-ie6 .x-btn-default-toolbar-large-disabled .x-btn-inner{color:#8c8c8c !important}.x-nbr .x-btn-default-toolbar-large-over .x-frame-tl,.x-nbr .x-btn-default-toolbar-large-over .x-frame-bl,.x-nbr .x-btn-default-toolbar-large-over .x-frame-tr,.x-nbr .x-btn-default-toolbar-large-over .x-frame-br,.x-nbr .x-btn-default-toolbar-large-over .x-frame-tc,.x-nbr .x-btn-default-toolbar-large-over .x-frame-bc{background-image:url('../resources/themes/images/partkeepr/btn/btn-default-toolbar-large-over-corners.gif')}.x-nbr .x-btn-default-toolbar-large-over .x-frame-ml,.x-nbr .x-btn-default-toolbar-large-over .x-frame-mr{background-image:url('../resources/themes/images/partkeepr/btn/btn-default-toolbar-large-over-sides.gif')}.x-nbr .x-btn-default-toolbar-large-over .x-frame-mc{background-color:#eccfd1;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-toolbar-large-over-bg.gif')}.x-nbr .x-btn-default-toolbar-large-focus .x-frame-tl,.x-nbr .x-btn-default-toolbar-large-focus .x-frame-bl,.x-nbr .x-btn-default-toolbar-large-focus .x-frame-tr,.x-nbr .x-btn-default-toolbar-large-focus .x-frame-br,.x-nbr .x-btn-default-toolbar-large-focus .x-frame-tc,.x-nbr .x-btn-default-toolbar-large-focus .x-frame-bc{background-image:url('../resources/themes/images/partkeepr/btn/btn-default-toolbar-large-focus-corners.gif')}.x-nbr .x-btn-default-toolbar-large-focus .x-frame-ml,.x-nbr .x-btn-default-toolbar-large-focus .x-frame-mr{background-image:url('../resources/themes/images/partkeepr/btn/btn-default-toolbar-large-focus-sides.gif')}.x-nbr .x-btn-default-toolbar-large-focus .x-frame-mc{background-color:#eccfd1;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-toolbar-large-focus-bg.gif')}.x-nbr .x-btn-default-toolbar-large-menu-active .x-frame-tl,.x-nbr .x-btn-default-toolbar-large-menu-active .x-frame-bl,.x-nbr .x-btn-default-toolbar-large-menu-active .x-frame-tr,.x-nbr .x-btn-default-toolbar-large-menu-active .x-frame-br,.x-nbr .x-btn-default-toolbar-large-menu-active .x-frame-tc,.x-nbr .x-btn-default-toolbar-large-menu-active .x-frame-bc,.x-nbr .x-btn-default-toolbar-large-pressed .x-frame-tl,.x-nbr .x-btn-default-toolbar-large-pressed .x-frame-bl,.x-nbr .x-btn-default-toolbar-large-pressed .x-frame-tr,.x-nbr .x-btn-default-toolbar-large-pressed .x-frame-br,.x-nbr .x-btn-default-toolbar-large-pressed .x-frame-tc,.x-nbr .x-btn-default-toolbar-large-pressed .x-frame-bc{background-image:url('../resources/themes/images/partkeepr/btn/btn-default-toolbar-large-pressed-corners.gif')}.x-nbr .x-btn-default-toolbar-large-menu-active .x-frame-ml,.x-nbr .x-btn-default-toolbar-large-menu-active .x-frame-mr,.x-nbr .x-btn-default-toolbar-large-pressed .x-frame-ml,.x-nbr .x-btn-default-toolbar-large-pressed .x-frame-mr{background-image:url('../resources/themes/images/partkeepr/btn/btn-default-toolbar-large-pressed-sides.gif')}.x-nbr .x-btn-default-toolbar-large-menu-active .x-frame-mc,.x-nbr .x-btn-default-toolbar-large-pressed .x-frame-mc{background-color:#c1c1c1;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-toolbar-large-pressed-bg.gif')}.x-nbr .x-btn-default-toolbar-large-disabled .x-frame-tl,.x-nbr .x-btn-default-toolbar-large-disabled .x-frame-bl,.x-nbr .x-btn-default-toolbar-large-disabled .x-frame-tr,.x-nbr .x-btn-default-toolbar-large-disabled .x-frame-br,.x-nbr .x-btn-default-toolbar-large-disabled .x-frame-tc,.x-nbr .x-btn-default-toolbar-large-disabled .x-frame-bc{background-image:url('../resources/themes/images/partkeepr/btn/btn-default-toolbar-large-disabled-corners.gif')}.x-nbr .x-btn-default-toolbar-large-disabled .x-frame-ml,.x-nbr .x-btn-default-toolbar-large-disabled .x-frame-mr{background-image:url('../resources/themes/images/partkeepr/btn/btn-default-toolbar-large-disabled-sides.gif')}.x-nbr .x-btn-default-toolbar-large-disabled .x-frame-mc{background-color:transparent}.x-nlg .x-btn-default-toolbar-large{background-repeat:repeat-x;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-toolbar-large-bg.gif')}.x-nlg .x-btn-default-toolbar-large-over{background-repeat:repeat-x;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-toolbar-large-over-bg.gif')}.x-nlg .x-btn-default-toolbar-large-focus{background-repeat:repeat-x;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-toolbar-large-focus-bg.gif')}.x-nlg .x-btn-default-toolbar-large-menu-active,.x-nlg .x-btn-default-toolbar-large-pressed{background-repeat:repeat-x;background-image:url('../resources/themes/images/partkeepr/btn/btn-default-toolbar-large-pressed-bg.gif')}.x-btn-default-toolbar-small-disabled,.x-btn-default-toolbar-medium-disabled,.x-btn-default-toolbar-large-disabled{border-color:transparent;background-image:none;background:transparent}.x-btn-group{position:relative;overflow:hidden}.x-btn-group-body{position:relative;zoom:1;padding:0 1px}.x-btn-group-body .x-table-layout-cell{vertical-align:top}.x-btn-group-header-text{white-space:nowrap}.x-btn-group-default-framed{-moz-border-radius:2px;-webkit-border-radius:2px;-o-border-radius:2px;-ms-border-radius:2px;-khtml-border-radius:2px;border-radius:2px;padding:1px 1px 1px 1px;border-width:1px;border-style:solid;background-color:#d0def0}.x-nlg .x-btn-group-default-framed-mc{background-color:#d0def0}.x-nbr .x-btn-group-default-framed{padding:0 !important;border-width:0 !important;-moz-border-radius:0px;-webkit-border-radius:0px;-o-border-radius:0px;-ms-border-radius:0px;-khtml-border-radius:0px;border-radius:0px;background-color:transparent;background-position:1000202px 1000202px}.x-nbr .x-btn-group-default-framed-tl,.x-nbr .x-btn-group-default-framed-bl,.x-nbr .x-btn-group-default-framed-tr,.x-nbr .x-btn-group-default-framed-br,.x-nbr .x-btn-group-default-framed-tc,.x-nbr .x-btn-group-default-framed-bc,.x-nbr .x-btn-group-default-framed-ml,.x-nbr .x-btn-group-default-framed-mr{zoom:1;background-image:url('../resources/themes/images/partkeepr/btn-group/btn-group-default-framed-corners.gif')}.x-nbr .x-btn-group-default-framed-ml,.x-nbr .x-btn-group-default-framed-mr{zoom:1;background-image:url('../resources/themes/images/partkeepr/btn-group/btn-group-default-framed-sides.gif');background-position:0 0;background-repeat:repeat-y}.x-nbr .x-btn-group-default-framed-mc{padding:0 0 0 0}.x-btn-group-default-framed{border-color:#b7c8d7;-moz-box-shadow:#e3ebf5 0 1px 0px 0 inset,#e3ebf5 0 -1px 0px 0 inset,#e3ebf5 -1px 0 0px 0 inset,#e3ebf5 1px 0 0px 0 inset;-webkit-box-shadow:#e3ebf5 0 1px 0px 0 inset,#e3ebf5 0 -1px 0px 0 inset,#e3ebf5 -1px 0 0px 0 inset,#e3ebf5 1px 0 0px 0 inset;-o-box-shadow:#e3ebf5 0 1px 0px 0 inset,#e3ebf5 0 -1px 0px 0 inset,#e3ebf5 -1px 0 0px 0 inset,#e3ebf5 1px 0 0px 0 inset;box-shadow:#e3ebf5 0 1px 0px 0 inset,#e3ebf5 0 -1px 0px 0 inset,#e3ebf5 -1px 0 0px 0 inset,#e3ebf5 1px 0 0px 0 inset}.x-btn-group-header-default-framed{margin:2px 2px 0 2px}.x-btn-group-header-body-default-framed{padding:1px 0;background:#c2d8f0;-moz-border-radius-topleft:2px;-webkit-border-top-left-radius:2px;-o-border-top-left-radius:2px;-ms-border-top-left-radius:2px;-khtml-border-top-left-radius:2px;border-top-left-radius:2px;-moz-border-radius-topright:2px;-webkit-border-top-right-radius:2px;-o-border-top-right-radius:2px;-ms-border-top-right-radius:2px;-khtml-border-top-right-radius:2px;border-top-right-radius:2px}.x-btn-group-header-text-default-framed{font:normal 11px tahoma,arial,verdana,sans-serif;color:#3e6aaa}.x-datepicker{border:1px solid #363232;background-color:#fff;position:relative}.x-datepicker a{-moz-outline:0 none;outline:0 none;color:#4c3635;text-decoration:none;border-width:0}.x-datepicker-inner,.x-datepicker-inner td,.x-datepicker-inner th{border-collapse:separate}.x-datepicker-header{position:relative;height:26px;background-image:none;background-color:#404040;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #484747), color-stop(100%, #363636));background-image:-webkit-linear-gradient(top, #484747,#363636);background-image:-moz-linear-gradient(top, #484747,#363636);background-image:-o-linear-gradient(top, #484747,#363636);background-image:-ms-linear-gradient(top, #484747,#363636);background-image:linear-gradient(top, #484747,#363636)}.x-datepicker-prev,.x-datepicker-next{position:absolute;top:5px;width:18px}.x-datepicker-prev a,.x-datepicker-next a{display:block;width:16px;height:16px;background-position:top;background-repeat:no-repeat;cursor:pointer;text-decoration:none !important;filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=70);opacity:0.7}.x-datepicker-prev a:hover,.x-datepicker-next a:hover{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);opacity:1}.x-datepicker-next{right:5px}.x-datepicker-next a{background-image:url('../resources/themes/images/partkeepr/shared/right-btn.gif')}.x-datepicker-prev{left:5px}.x-datepicker-prev a{background-image:url('../resources/themes/images/partkeepr/shared/left-btn.gif')}.x-item-disabled .x-datepicker-prev a:hover,.x-item-disabled .x-datepicker-next a:hover{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=60);opacity:0.6}.x-datepicker-month{padding-top:3px}.x-datepicker-month .x-btn,.x-datepicker-month button,.x-datepicker-month .x-btn-tc,.x-datepicker-month .x-btn-tl,.x-datepicker-month .x-btn-tr,.x-datepicker-month .x-btn-mc,.x-datepicker-month .x-btn-ml,.x-datepicker-month .x-btn-mr,.x-datepicker-month .x-btn-bc,.x-datepicker-month .x-btn-bl,.x-datepicker-month .x-btn-br{background:transparent !important;border-width:0 !important}.x-datepicker-month span{color:#fff !important}.x-datepicker-month .x-btn-split-right{background:no-repeat right center !important;background-image:url('../resources/themes/images/partkeepr/button/s-arrow-light.gif');padding-right:12px}.x-datepicker-next{text-align:right}.x-datepicker-month{text-align:center}.x-datepicker-month button{color:#fff !important}table.x-datepicker-inner{width:100%;table-layout:fixed}table.x-datepicker-inner th{width:25px;height:19px;padding:0;color:#fff;font:normal 10px tahoma,arial,verdana,sans-serif;text-align:right;border-bottom:1px solid #d1b7b7;border-collapse:separate;background-image:none;background-color:#e5d6d6;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #2aaad3), color-stop(100%, #2067a3));background-image:-webkit-linear-gradient(top, #2aaad3,#2067a3);background-image:-moz-linear-gradient(top, #2aaad3,#2067a3);background-image:-o-linear-gradient(top, #2aaad3,#2067a3);background-image:-ms-linear-gradient(top, #2aaad3,#2067a3);background-image:linear-gradient(top, #2aaad3,#2067a3);cursor:default}table.x-datepicker-inner th span{display:block;padding-right:7px}table.x-datepicker-inner tr{height:20px}table.x-datepicker-inner td{border:1px solid;height:17px;border-color:#fff;text-align:right;padding:0}table.x-datepicker-inner a{padding-right:4px;display:block;zoom:1;font:normal 11px tahoma,arial,verdana,sans-serif;color:#000;text-decoration:none;text-align:right}table.x-datepicker-inner .x-datepicker-active{cursor:pointer;color:black}table.x-datepicker-inner .x-datepicker-selected a{background:repeat-x left top;background-color:#2aaad3;border:1px solid #2067a3;color:white}table.x-datepicker-inner .x-datepicker-selected span{font-weight:bold}table.x-datepicker-inner .x-datepicker-today a{border:1px solid;border-color:darkred}table.x-datepicker-inner .x-datepicker-prevday a,table.x-datepicker-inner .x-datepicker-nextday a{text-decoration:none !important;color:#aaa}table.x-datepicker-inner a:hover,table.x-datepicker-inner .x-datepicker-disabled a:hover{text-decoration:none !important;color:white;background-color:#2aaad3}table.x-datepicker-inner .x-datepicker-disabled a{cursor:default;background-color:#eee;color:#bbb}.x-datepicker-footer,.x-monthpicker-buttons{position:relative;border-top:1px solid #d1b7b7;background-image:none;background-color:#e5d6d6;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #dadada), color-stop(49%, #d1d1d1), color-stop(51%, #cbcbcb), color-stop(100%, #cdcdcd));background-image:-webkit-linear-gradient(top, #dadada,#d1d1d1 49%,#cbcbcb 51%,#cdcdcd);background-image:-moz-linear-gradient(top, #dadada,#d1d1d1 49%,#cbcbcb 51%,#cdcdcd);background-image:-o-linear-gradient(top, #dadada,#d1d1d1 49%,#cbcbcb 51%,#cdcdcd);background-image:-ms-linear-gradient(top, #dadada,#d1d1d1 49%,#cbcbcb 51%,#cdcdcd);background-image:linear-gradient(top, #dadada,#d1d1d1 49%,#cbcbcb 51%,#cdcdcd);text-align:center}.x-datepicker-footer .x-btn,.x-monthpicker-buttons .x-btn{position:relative;margin:4px}.x-item-disabled .x-datepicker-inner a:hover{background:none}.x-datepicker .x-monthpicker{position:absolute;left:0;top:0}.x-monthpicker{border:1px solid #363232;background-color:#fff}.x-monthpicker-months,.x-monthpicker-years{float:left;height:167px;width:88px}.x-monthpicker-item{float:left;margin:4px 0 5px 0;font:normal 11px tahoma,arial,verdana,sans-serif;text-align:center;vertical-align:middle;height:18px;width:43px;border:0 none}.x-monthpicker-item a{display:block;margin:0 5px 0 5px;text-decoration:none;color:#4c3635;border:1px solid #fff;line-height:17px}.x-monthpicker-item a:hover{background-color:#2aaad3}.x-monthpicker-item a.x-monthpicker-selected{background-color:#e5d6d6;border:1px solid #2067a3}.x-monthpicker-months{border-right:1px solid #363232;width:87px}.x-monthpicker-years .x-monthpicker-item{width:44px}.x-monthpicker-yearnav{height:28px}.x-monthpicker-yearnav button{background-image:url('../resources/themes/images/partkeepr/tools/tool-sprites.gif');height:15px;width:15px;padding:0;margin:6px 12px 5px 15px;border:none;outline:0 none}.x-monthpicker-yearnav button::-moz-focus-inner{border:0;padding:0}.x-monthpicker-yearnav-next{background-position:0 -120px}.x-monthpicker-yearnav-next-over{cursor:pointer;cursor:hand;background-position:-15px -120px}.x-monthpicker-yearnav-prev{background-position:0 -105px}.x-monthpicker-yearnav-prev-over{cursor:pointer;cursor:hand;background-position:-15px -105px}.x-monthpicker-small .x-monthpicker-item{margin:2px 0 2px 0}.x-monthpicker-small .x-monthpicker-yearnav{height:23px}.x-monthpicker-small .x-monthpicker-months,.x-monthpicker-small .x-monthpicker-years{height:136px}.x-quirks .x-ie7 .x-monthpicker-buttons .x-btn,.x-quirks .x-ie8 .x-monthpicker-buttons .x-btn{margin-top:2px}.x-quirks .x-monthpicker-small .x-monthpicker-yearnav button{margin-top:3px;margin-bottom:3px}.x-ie6 .x-monthpicker-small .x-monthpicker-yearnav button{margin-top:3px;margin-bottom:3px}.x-nlg .x-datepicker-header{background-image:url('../resources/themes/images/partkeepr/datepicker/datepicker-header-bg.gif');background-repeat:repeat-x;background-position:top left}.x-nlg .x-datepicker-footer,.x-nlg .x-monthpicker-buttons{background-image:url('../resources/themes/images/partkeepr/datepicker/datepicker-footer-bg.gif');background-repeat:repeat-x;background-position:top left}.x-color-picker{width:144px;height:90px;cursor:pointer}.x-color-picker a{border:1px solid #fff;float:left;padding:2px;text-decoration:none;-moz-outline:0 none;outline:0 none;cursor:pointer}.x-color-picker a:hover,.x-color-picker a.x-color-picker-selected{border-color:#8bb8f3;background-color:#deecfd}.x-color-picker em{display:block;border:1px solid #aca899}.x-color-picker em span{cursor:pointer;display:block;height:10px;width:10px;line-height:10px}.x-menu-body{-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:ignore;cursor:default;background:#f0f0f0 !important;padding:2px}.x-menu-icon-separator{position:absolute;top:0px;left:27px;z-index:0;border-left:solid 1px #e0e0e0;background-color:#fff;width:2px;height:100%;overflow:hidden}.x-menu-plain .x-menu-icon-separator{display:none}.x-menu-focus{display:block;position:absolute;top:-10px;left:-10px;width:0px;height:0px}.x-menu-item{white-space:nowrap;overflow:hidden;z-index:1}.x-menu-item-cmp{margin-bottom:1px}.x-menu-item-link{display:block;padding:0px 2px;margin:1px;text-decoration:none !important;line-height:16px;cursor:default}.x-opera .x-menu-item-link{position:relative}.x-menu-item-icon{width:16px;height:16px;margin:4px 11px 0px 2px;background:no-repeat center center}.x-menu-item-text{position:relative;font-size:11px;color:#222;top:-4px}.x-menu-item-checked .x-menu-item-icon{background-image:url('../resources/themes/images/partkeepr/menu/checked.gif')}.x-menu-item-checked .x-menu-group-icon{background-image:url('../resources/themes/images/partkeepr/menu/group-checked.gif')}.x-menu-item-unchecked .x-menu-item-icon{background-image:url('../resources/themes/images/partkeepr/menu/unchecked.gif')}.x-menu-item-unchecked .x-menu-group-icon{background-image:none}.x-menu-item-separator{height:2px;border-top:solid 1px #e0e0e0;background-color:#fff;margin:2px 0px;overflow:hidden}.x-menu-item-arrow{position:absolute;width:12px;height:9px;top:9px;right:0px;background:url('../resources/themes/images/partkeepr/menu/menu-parent.gif') no-repeat center center}.x-menu-item-indent{margin-left:31px}.x-menu-item-active{cursor:pointer}.x-menu-item-active .x-menu-item-link{background-image:none;background-color:#eff1f3;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #eff1f3), color-stop(100%, #b0bcc5));background-image:-webkit-linear-gradient(top, #eff1f3,#b0bcc5);background-image:-moz-linear-gradient(top, #eff1f3,#b0bcc5);background-image:-o-linear-gradient(top, #eff1f3,#b0bcc5);background-image:-ms-linear-gradient(top, #eff1f3,#b0bcc5);background-image:linear-gradient(top, #eff1f3,#b0bcc5);margin:0px;border:1px solid #a9cbf5;cursor:pointer;-moz-border-radius:3px;-webkit-border-radius:3px;-o-border-radius:3px;-ms-border-radius:3px;-khtml-border-radius:3px;border-radius:3px}.x-menu-item-disabled{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=50);opacity:0.5}.x-ie .x-menu-item-link{line-height:17px;padding-bottom:1px}.x-ie .x-menu-item-disabled .x-menu-item-icon{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=50);opacity:0.5}.x-ie .x-menu-item-disabled .x-menu-item-text{background-color:#f0f0f0}.x-strict .x-ie .x-menu-icon-separator{width:1px}.x-strict .x-ie .x-menu-item-separator{height:1px}.x-ie6 .x-menu-item-link,.x-ie7 .x-menu-item-link,.x-quirks .x-ie8 .x-menu-item-link{padding-bottom:2px}.x-nlg .x-menu-item-active .x-menu-item-link{background:#eff1f3 url('../resources/themes/images/partkeepr/menu/menu-item-active-bg.gif') repeat-x left top}.x-menu-date-item{border-color:#99BBE8}.x-panel .x-grid-body{background:#fff;border-color:#aaa;border-style:solid;border-width:1px;border-top-color:#c5c5c5}.x-panel .x-grid-header-ct-hidden{border-top-width:0 !important}.x-grid-header-hidden .x-grid-body{border-top-color:#aaa !important}.x-grid-view{overflow:hidden;position:relative}.x-grid-table{table-layout:fixed;border-collapse:separate}.x-grid-row .x-grid-table{border-collapse:collapse}.x-grid-locked .x-grid-inner-locked{border-width:0 1px 0 0 !important;border-style:solid}.x-grid-header-ct{cursor:default;zoom:1;padding:0;border:1px solid #aaa;background-image:none;background-color:#c5c5c5;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #f9f9f9), color-stop(100%, #e3e4e6));background-image:-webkit-linear-gradient(top, #f9f9f9,#e3e4e6);background-image:-moz-linear-gradient(top, #f9f9f9,#e3e4e6);background-image:-o-linear-gradient(top, #f9f9f9,#e3e4e6);background-image:-ms-linear-gradient(top, #f9f9f9,#e3e4e6);background-image:linear-gradient(top, #f9f9f9,#e3e4e6)}.x-border-box .x-ie9 .x-grid-header-ct{padding-left:1px}.x-ie6 .x-grid-header-ct,.x-ie7 .x-grid-header-ct{padding-left:1px}.x-column-header{padding:0;position:absolute;overflow:hidden;border-right:1px solid #b9b9b9;border-left:0 none;border-top:0 none;border-bottom:0 none;text-shadow:0 1px 0 rgba(255,255,255,0.3);font:normal 11px/15px tahoma,arial,verdana,sans-serif;color:null;font:normal 11px tahoma,arial,verdana,sans-serif;background-image:none;background-color:#c5c5c5;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #f9f9f9), color-stop(100%, #e3e4e6));background-image:-webkit-linear-gradient(top, #f9f9f9,#e3e4e6);background-image:-moz-linear-gradient(top, #f9f9f9,#e3e4e6);background-image:-o-linear-gradient(top, #f9f9f9,#e3e4e6);background-image:-ms-linear-gradient(top, #f9f9f9,#e3e4e6);background-image:linear-gradient(top, #f9f9f9,#e3e4e6)}.x-group-header{padding:0;border-left-width:0}.x-group-sub-header{background:transparent;border-top:1px solid #c5c5c5;border-left-width:0}.x-column-header-inner{zoom:1;position:relative;white-space:nowrap;line-height:22px;padding:0px 6px}.x-column-header-inner .x-column-header-text{white-space:nowrap}.x-column-header-over,.x-column-header-sort-ASC,.x-column-header-sort-DESC{border-left-color:#b9b9b9;border-right-color:#b9b9b9;text-shadow:0 1px 0 rgba(255,255,255,0.3);background-image:none;background-color:#2373af;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #eff1f3), color-stop(100%, #b0bcc5));background-image:-webkit-linear-gradient(top, #eff1f3,#b0bcc5);background-image:-moz-linear-gradient(top, #eff1f3,#b0bcc5);background-image:-o-linear-gradient(top, #eff1f3,#b0bcc5);background-image:-ms-linear-gradient(top, #eff1f3,#b0bcc5);background-image:linear-gradient(top, #eff1f3,#b0bcc5)}.x-nlg .x-grid-header-ct,.x-nlg .x-column-header{background:repeat-x 0 top;background-image:url('../resources/themes/images/partkeepr/grid/column-header-bg.gif')}.x-nlg .x-column-header-over,.x-nlg .x-column-header-sort-ASC,.x-nlg .x-column-header-sort-DESC{background:#ebf3fd repeat-x 0 top;background-image:url('../resources/themes/images/partkeepr/grid/column-header-over-bg.gif')}.x-column-header-trigger{display:none;height:100%;width:17px;background:no-repeat left center;background-image:none;background-color:#2373af;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #eff1f3), color-stop(100%, #b0bcc5));background-image:-webkit-linear-gradient(top, #eff1f3,#b0bcc5);background-image:-moz-linear-gradient(top, #eff1f3,#b0bcc5);background-image:-o-linear-gradient(top, #eff1f3,#b0bcc5);background-image:-ms-linear-gradient(top, #eff1f3,#b0bcc5);background-image:linear-gradient(top, #eff1f3,#b0bcc5);background-image:url('../resources/themes/images/partkeepr/grid/grid3-hd-btn.gif');position:absolute;right:0;top:0;z-index:2;cursor:pointer}.x-column-header-over .x-column-header-trigger,.x-column-header-open .x-column-header-trigger{display:block}.x-column-header-align-right{text-align:right}.x-column-header-align-right .x-column-header-text{padding-right:0.5ex;margin-right:6px}.x-column-header-align-center{text-align:center}.x-column-header-align-left{text-align:left}.x-column-header-sort-ASC .x-column-header-text{padding-right:16px;background:no-repeat right 2px;background-image:url('../resources/themes/images/partkeepr/grid/sort_asc.png')}.x-column-header-sort-DESC .x-column-header-text{padding-right:16px;background:no-repeat right 2px;background-image:url('../resources/themes/images/partkeepr/grid/sort_desc.png')}.x-grid-row{line-height:13px;vertical-align:top;padding:0 1px;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:ignore}.x-grid-row .x-grid-cell{color:null;font:normal 11px tahoma,arial,verdana,sans-serif;border-color:#ededed;border-style:solid;border-width:1px 0;border-top-color:#fafafa}.x-grid-rowwrap-div{border-width:1px 0;border-color:#ededed;border-style:solid;border-top-color:#fafafa;overflow:hidden}.x-grid-row-alt .x-grid-cell,.x-grid-row-alt .x-grid-rowwrap-div{background-color:#fff}.x-grid-row-over .x-grid-cell,.x-grid-row-over .x-grid-rowwrap-div{border-color:#ddd;background-image:none;background-color:#ececec;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ececec), color-stop(100%, #d5d5d5));background-image:-webkit-linear-gradient(top, #ececec,#d5d5d5);background-image:-moz-linear-gradient(top, #ececec,#d5d5d5);background-image:-o-linear-gradient(top, #ececec,#d5d5d5);background-image:-ms-linear-gradient(top, #ececec,#d5d5d5);background-image:linear-gradient(top, #ececec,#d5d5d5);background-color:#ececec}.x-grid-row-focused .x-grid-cell,.x-grid-row-focused .x-grid-rowwrap-div{border-color:#ddd;background-color:#efefef}.x-grid-row-selected .x-grid-cell,.x-grid-row-selected .x-grid-rowwrap-div{border-style:dotted;border-color:#bbb3b2;color:white;background-color:#2aaad3 !important;background-image:none;background-color:#2aaad3;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #2aaad3), color-stop(100%, #2067a3));background-image:-webkit-linear-gradient(top, #2aaad3,#2067a3);background-image:-moz-linear-gradient(top, #2aaad3,#2067a3);background-image:-o-linear-gradient(top, #2aaad3,#2067a3);background-image:-ms-linear-gradient(top, #2aaad3,#2067a3);background-image:linear-gradient(top, #2aaad3,#2067a3)}.x-grid-rowwrap-div .x-grid-cell,.x-grid-rowwrap-div .x-grid-cell-inner{border-width:0;background:transparent}.x-grid-row-body-hidden{display:none}.x-grid-rowbody{font:normal 11px/13px tahoma,arial,verdana,sans-serif;padding:4px}.x-grid-rowbody p{margin:5px 5px 10px 5px}.x-grid-cell{overflow:hidden;font:normal 13px tahoma,arial,verdana,sans-serif;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:ignore}.x-grid-cell-inner{overflow:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis;padding:3px 6px;white-space:nowrap}.x-action-col-cell .x-grid-cell-inner{padding:1px 2px 0 2px}.x-ie6 .x-action-col-cell .x-grid-cell-inner,.x-ie7 .x-action-col-cell .x-grid-cell-inner,.x-quirks .x-ie9 .x-action-col-cell .x-grid-cell-inner,.x-quirks .x-ie8 .x-action-col-cell .x-grid-cell-inner,.x-strict .x-ie8 .x-action-col-cell .x-grid-cell-inner{padding:2px 2px 1px 2px}.x-grid-row .x-grid-cell-special{padding:0;border-right:1px solid #c1c1c1;background-image:none;background-color:#f6f6f6;background-image:-webkit-gradient(linear, 0% 50%, 100% 50%, color-stop(0%, #f6f6f6), color-stop(100%, #e9e9e9));background-image:-webkit-linear-gradient(left, #f6f6f6,#e9e9e9);background-image:-moz-linear-gradient(left, #f6f6f6,#e9e9e9);background-image:-o-linear-gradient(left, #f6f6f6,#e9e9e9);background-image:-ms-linear-gradient(left, #f6f6f6,#e9e9e9);background-image:linear-gradient(left, #f6f6f6,#e9e9e9)}.x-ie6 .x-grid-header-row,.x-ie7 .x-grid-header-row,.x-quirks .x-ie8 .x-grid-header-row,.x-strict .x-ie8 .x-grid-header-row{position:absolute}.x-grid-row-selected .x-grid-cell-special{border-right:1px solid #d0b1b1;background-image:none;background-color:#2aaad3;background-image:-webkit-gradient(linear, 0% 50%, 100% 50%, color-stop(0%, #2aaad3), color-stop(100%, #2699be));background-image:-webkit-linear-gradient(left, #2aaad3,#2699be);background-image:-moz-linear-gradient(left, #2aaad3,#2699be);background-image:-o-linear-gradient(left, #2aaad3,#2699be);background-image:-ms-linear-gradient(left, #2aaad3,#2699be);background-image:linear-gradient(left, #2aaad3,#2699be)}.x-grid-dirty-cell{background-image:url('../resources/themes/images/partkeepr/grid/dirty.gif');background-position:0 0;background-repeat:no-repeat}.x-grid-cell-selected{background-color:#B8CFEE !important}.x-nlg .x-grid-cell-special{background-repeat:repeat-y;background-position:top right}.x-nlg .x-grid-row .x-grid-cell-special,.x-nlg .x-grid-row-over .x-grid-cell-special{background-image:url('../resources/themes/images/partkeepr/grid/cell-special-bg.gif')}.x-nlg .x-grid-row-focused .x-grid-cell-special,.x-nlg .x-grid-row-selected .x-grid-cell-special{background-image:url('../resources/themes/images/partkeepr/grid/cell-special-selected-bg.gif')}.x-panel-with-col-lines .x-grid-row .x-grid-cell{padding-right:0;border-right:1px solid #c1c1c1}.x-ie .x-grid-cell-special{border-right-width:0 !important}.x-property-grid .x-grid-row .x-grid-cell-inner{padding:3px 6px 5px}.x-property-grid .x-grid-row .x-grid-property-name .x-grid-cell-inner,.x-property-grid .x-grid-row-over .x-grid-property-name .x-grid-cell-inner{padding-left:12px;background-image:url('../resources/themes/images/partkeepr/grid/property-cell-bg.gif');background-repeat:no-repeat;background-position:-16px 1px}.x-quirks .x-ie .x-grid-row .x-grid-property-name .x-grid-cell-inner{background-position:-16px 2px}.x-unselectable{-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:ignore}.x-grid-row-body-hidden{display:none}.x-grid-group-collapsed{display:none}.x-grid-view .x-grid-td-expander{vertical-align:top}.x-grid-td-expander{background:repeat-y right transparent}.x-grid-view .x-grid-td-expander .x-grid-cell-inner{padding:0 !important}.x-grid-row-expander{background-image:url('../resources/themes/images/partkeepr/grid/group-collapse.gif');background-color:transparent;width:9px;height:13px;margin-left:3px;background-repeat:no-repeat;background-position:0 -2px}.x-grid-row-collapsed .x-grid-row-expander{background-image:url('../resources/themes/images/partkeepr/grid/group-expand.gif')}.x-grid-resize-marker{position:absolute;z-index:5;top:0;width:1px;background-color:#0f0f0f}.col-move-top,.col-move-bottom{width:9px;height:9px;position:absolute;top:0;line-height:0;font-size:0;overflow:hidden;z-index:20000;background:no-repeat left top transparent}.col-move-top{background-image:url('../resources/themes/images/partkeepr/grid/col-move-top.gif')}.col-move-bottom{background-image:url('../resources/themes/images/partkeepr/grid/col-move-bottom.gif')}.x-tbar-page-number{width:30px}.x-grid-group,.x-grid-group-body,.x-grid-group-hd{zoom:1}.x-grid-group-hd{padding-top:6px}.x-grid-group-hd .x-grid-cell-inner{padding:10px 4px 4px 4px;background:#fff;border-width:0 0 2px 0;border-style:solid;border-color:#b7abab;cursor:pointer}.x-grid-group-title{background:transparent no-repeat 0 -1px;background-image:url('../resources/themes/images/partkeepr/grid/group-collapse.gif');color:#5c5c5c;font:bold 11px tahoma,arial,verdana,sans-serif;padding:0 0 0 14px}.x-grid-group-hd-collapsed .x-grid-group-title{background-image:url('../resources/themes/images/partkeepr/grid/group-expand.gif')}.x-grid-group-collapsed .x-grid-group-body{display:none}.x-grid-group-collapsed .x-grid-group-title{background-image:url('../resources/themes/images/partkeepr/grid/group-expand.gif')}.x-group-by-icon{background-image:url('../resources/themes/images/partkeepr/grid/group-by.gif')}.x-show-groups-icon{background-image:url('../resources/themes/images/partkeepr/grid/group-by.gif')}.x-column-header-checkbox .x-column-header-inner{padding:1px}.x-grid-cell-special .x-grid-cell-inner{padding:4px}.x-grid-row-checker,.x-column-header-checkbox .x-column-header-text{height:14px;width:14px;background-image:url('../resources/themes/images/partkeepr/grid/unchecked.gif');background-position:-1px -1px;background-repeat:no-repeat;background-color:transparent}.x-column-header-checkbox .x-column-header-text{display:block;margin-top:4px;margin-left:4px}.x-quirks .x-ie .x-column-header-checkbox .x-column-header-inner,.x-ie6 .x-column-header-checkbox .x-column-header-inner{line-height:18px}.x-ie6 .x-column-header-checkbox .x-column-header-text,.x-ie7 .x-column-header-checkbox .x-column-header-text,.x-ie9 .x-column-header-checkbox .x-column-header-text{margin-left:3px}.x-grid-hd-checker-on .x-column-header-text{background-image:url('../resources/themes/images/partkeepr/grid/checked.gif')}.x-grid-row-checker{margin-left:1px;background-position:50% -2px}.x-grid-row-selected .x-grid-row-checker,.x-grid-row-checked .x-grid-row-checker{background-image:url('../resources/themes/images/partkeepr/grid/checked.gif')}.x-tbar-page-first{background-image:url('../resources/themes/images/partkeepr/grid/page-first.gif') !important}.x-tbar-loading{background-image:url('../resources/themes/images/partkeepr/grid/refresh.gif') !important}.x-tbar-page-last{background-image:url('../resources/themes/images/partkeepr/grid/page-last.gif') !important}.x-tbar-page-next{background-image:url('../resources/themes/images/partkeepr/grid/page-next.gif') !important}.x-tbar-page-prev{background-image:url('../resources/themes/images/partkeepr/grid/page-prev.gif') !important}.x-item-disabled .x-tbar-loading{background-image:url('../resources/themes/images/partkeepr/grid/refresh-disabled.gif') !important}.x-item-disabled .x-tbar-page-first{background-image:url('../resources/themes/images/partkeepr/grid/page-first-disabled.gif') !important}.x-item-disabled .x-tbar-page-last{background-image:url('../resources/themes/images/partkeepr/grid/page-last-disabled.gif') !important}.x-item-disabled .x-tbar-page-next{background-image:url('../resources/themes/images/partkeepr/grid/page-next-disabled.gif') !important}.x-item-disabled .x-tbar-page-prev{background-image:url('../resources/themes/images/partkeepr/grid/page-prev-disabled.gif') !important}.xg-hmenu-sort-asc .x-menu-item-icon{background-image:url('../resources/themes/images/partkeepr/grid/hmenu-asc.gif')}.xg-hmenu-sort-desc .x-menu-item-icon{background-image:url('../resources/themes/images/partkeepr/grid/hmenu-desc.gif')}.xg-hmenu-lock .x-menu-item-icon{background-image:url('../resources/themes/images/partkeepr/grid/hmenu-lock.gif')}.xg-hmenu-unlock .x-menu-item-icon{background-image:url('../resources/themes/images/partkeepr/grid/hmenu-unlock.gif')}.x-group-by-icon{background-image:url('../resources/themes/images/partkeepr/grid/group-by.gif')}.x-cols-icon .x-menu-item-icon{background-image:url('../resources/themes/images/partkeepr/grid/columns.gif')}.x-show-groups-icon{background-image:url('../resources/themes/images/partkeepr/grid/group-by.gif')}.x-grid-drop-indicator{position:absolute;height:1px;line-height:0px;background-color:#77BC71;overflow:visible}.x-grid-drop-indicator .x-grid-drop-indicator-left{position:absolute;top:-8px;left:-12px;background-image:url('../resources/themes/images/partkeepr/grid/dd-insert-arrow-right.png');height:16px;width:16px}.x-grid-drop-indicator .x-grid-drop-indicator-right{position:absolute;top:-8px;right:-11px;background-image:url('../resources/themes/images/partkeepr/grid/dd-insert-arrow-left.png');height:16px;width:16px}.x-ie6 .x-grid-drop-indicator-left{background-image:url('../resources/themes/images/partkeepr/grid/dd-insert-arrow-right.gif')}.x-ie6 .x-grid-drop-indicator-right{background-image:url('../resources/themes/images/partkeepr/grid/dd-insert-arrow-left.gif')}.x-grid-row-editor{position:absolute !important;z-index:1;zoom:1;overflow:visible !important}.x-grid-row-editor .x-form-field{font:normal 11px tahoma,arial,verdana,sans-serif !important}.x-grid-row-editor .x-form-display-field{font:normal 11px tahoma,arial,verdana,sans-serif !important;padding-top:0}.x-grid-row-editor .x-panel-body{background-color:#e6e0e0;border-top:1px solid #aaa !important;border-bottom:1px solid #aaa !important}.x-grid-row-editor .x-form-text{padding-left:2px}.x-grid-editor .x-form-cb-wrap{text-align:center}.x-grid-row-editor-buttons{background-color:#e6e0e0;position:absolute;bottom:-31px;padding:4px;width:200px;height:32px}.x-strict .x-grid-row-editor-buttons{width:192px;height:24px}.x-grid-row-editor-buttons-ml,.x-grid-row-editor-buttons-mr,.x-grid-row-editor-buttons-bl,.x-grid-row-editor-buttons-br,.x-grid-row-editor-buttons-bc{position:absolute;overflow:hidden}.x-grid-row-editor-buttons-bl,.x-grid-row-editor-buttons-br{width:4px;height:4px;bottom:0px;background-image:url('../resources/themes/images/partkeepr/panel/panel-default-framed-corners.gif')}.x-grid-row-editor-buttons-bl{left:0px;background-position:0px -16px}.x-grid-row-editor-buttons-br{right:0px;background-position:0px -20px}.x-grid-row-editor-buttons-bc{position:absolute;left:4px;bottom:0px;width:192px;height:1px;background-color:#aaa}.x-grid-row-editor-buttons-ml,.x-grid-row-editor-buttons-mr{height:27px;width:1px;top:1px;background-color:#aaa}.x-grid-row-editor-buttons-ml{left:0px}.x-grid-row-editor-buttons-mr{background-position:0px -20px;right:0px}.x-grid-row-editor-errors ul{margin-left:5px}.x-grid-row-editor-errors li{list-style:disc;margin-left:15px}.x-webkit *:focus{outline:none !important}.x-form-item{display:block;zoom:1;position:relative;margin-bottom:5px}.x-form-item-label{float:left;padding:3px 0 0;z-index:2;position:relative;font-size:12px;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:ignore;cursor:default}.x-form-item-label-top{float:none;clear:none;padding:0;display:block}.x-form-item-label-right{float:left;text-align:right}.x-form-item-body{position:relative;float:left}.x-form-invalid-under{padding:2px 2px 2px 18px;clear:left;color:#c0272b;font:normal 11px tahoma,arial,verdana,sans-serif;line-height:16px;background:url('../resources/themes/images/partkeepr/form/exclamation.gif') no-repeat 0 2px}.x-form-invalid-icon{width:18px;height:18px;overflow:hidden;text-indent:-9999px;position:absolute;left:0;top:0;background:url('../resources/themes/images/partkeepr/form/exclamation.gif') no-repeat 2px 3px}.x-form-invalid-icon ul{display:none}.x-form-field,.x-form-display-field{float:left;margin:0 0 0 0;font:normal 12px tahoma,arial,verdana,sans-serif;color:#000}.x-form-text,textarea.x-form-field{padding:1px 3px;background:repeat-x 0 0;border:1px solid;background-color:#fff;background-image:url('../resources/themes/images/partkeepr/form/text-bg.gif');border-color:#b5b8c8}.x-form-text{height:18px;line-height:18px;vertical-align:middle;border-radius:5px}.x-ie6 .x-form-text,.x-ie7 .x-form-text,.x-ie8 .x-form-text{line-height:15px}.x-border-box .x-form-text{height:22px}textarea.x-form-field{color:#000;overflow:auto;height:auto;line-height:normal;background:repeat-x 0 0;background-color:#fff;background-image:url('../resources/themes/images/partkeepr/form/text-bg.gif');resize:none}.x-border-box textarea.x-form-field{height:auto}.x-safari.x-mac textarea.x-form-field{margin-bottom:-2px}.x-form-focus,textarea.x-form-focus{border-color:#9c9c9c}.x-form-invalid-field,textarea.x-form-invalid-field{background-color:#fff;background-image:url('../resources/themes/images/partkeepr/grid/invalid_line.gif');background-repeat:repeat-x;background-position:bottom;border-color:#c30}.x-form-item{font:normal 12px tahoma,arial,verdana,sans-serif}.x-form-empty-field,textarea.x-form-empty-field{color:gray}.x-webkit .x-form-empty-field{line-height:15px}.x-form-display-field{padding-top:3px}.x-ie .x-form-file{height:23px;line-height:18px;vertical-align:middle}.x-field-default-toolbar .x-form-text{height:18px}.x-border-box .x-field-default-toolbar .x-form-text{height:22px}.x-field-default-toolbar .x-form-item-label-left{padding-left:4px}.x-fieldset{border:1px solid #a0a0a0;border-radius:4px;box-shadow:0px 0px 2px #fff,inset 0px 0px 2px #fff;padding:10px;margin-bottom:10px;display:block}.x-ie .x-fieldset{padding-top:0;padding-bottom:10px}.x-fieldset-header{font:11px bold tahoma,arial,verdana,sans-serif;color:#4c3635;padding:0 3px;line-height:16px}.x-fieldset-header .x-fieldset-header-text{float:left}.x-fieldset-header .x-form-item,.x-fieldset-header .x-tool{float:left;margin:0 3px 0 0}.x-fieldset-header .x-form-cb-wrap{padding:0}.x-webkit .x-fieldset-header{padding-top:1px}.x-quirks .x-ie .x-fieldset-header,.x-ie6 .x-fieldset-header,.x-ie7 .x-fieldset-header,.x-ie8 .x-fieldset-header{padding:0}.x-ie .x-fieldset-header{margin-bottom:10px}.x-ie9 .x-fieldset-header{padding-top:1px}.x-fieldset-collapsed .x-fieldset-body{display:none}.x-fieldset-collapsed{padding-bottom:0 !important;border-width:1px 1px 0 1px !important;border-left-color:transparent !important;border-right-color:transparent !important}.x-ie6 .x-fieldset-collapsed{border-width:1px 0 0 0 !important;padding-bottom:0 !important;margin-left:1px;margin-right:1px}.x-ie .x-fieldset-bwrap{zoom:1}.x-ie .x-fieldset-noborder legend{position:relative;margin-bottom:23px}.x-ie .x-fieldset-noborder legend span{position:absolute;left:16px}.x-fieldset{overflow:hidden}.x-fieldset-bwrap{overflow:hidden;zoom:1}.x-fieldset-body{overflow:hidden}.x-form-file-wrap .x-form-text{color:#777}.x-form-file-wrap .x-form-file-btn{overflow:hidden;float:left}.x-form-file-wrap .x-form-file-input{position:absolute;top:-4px;right:-2px;height:30px;filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=0);opacity:0;font-size:100px}.x-form-cb-wrap{padding-top:3px}.x-form-checkbox,.x-form-radio{float:none;vertical-align:-1px;width:13px;height:13px;background:url('../resources/themes/images/partkeepr/form/checkbox.png') no-repeat;overflow:hidden;padding:0;border:0}.x-form-checkbox::-moz-focus-inner,.x-form-radio::-moz-focus-inner{padding:0;border:0}.x-nbr.x-ie .x-form-checkbox,.x-nbr.x-ie .x-form-radio{font-size:0}.x-form-cb-checked .x-form-checkbox,.x-form-cb-checked .x-form-radio{background-position:0 -13px}.x-form-cb-focus{background-position:-13px 0}.x-form-cb-checked .x-form-cb-focus{background-position:-13px -13px}.x-form-radio{background-image:url('../resources/themes/images/partkeepr/form/radio.png')}.x-form-cb-label-before{margin-right:4px}.x-form-cb-label-after{margin-left:4px}.x-form-checkboxgroup-body{padding:3px 4px}.x-form-invalid .x-form-checkboxgroup-body{border:1px solid #c30;background:#fff url('../resources/themes/images/partkeepr/grid/invalid_line.gif') repeat-x bottom;padding:2px 3px}.x-check-group-alt{background:#d0d0d0;border-top:1px dotted #afafaf;border-bottom:1px dotted #afafaf}.x-form-check-group-label{color:#333;border-bottom:1px solid #333;margin:0 30px 5px 0;padding:2px}.x-form-trigger-wrap{float:left}.x-form-trigger{background-image:url('../resources/themes/images/partkeepr/form/trigger.png');background-position:0 0;width:17px;height:22px;float:left;position:relative;border:0;cursor:pointer;cursor:hand}.x-field-default-toolbar .x-form-trigger{height:21px}.x-border-box .x-field-default-toolbar .x-form-trigger{height:22px}.x-form-trigger-over{background-position:-17px 0;border-bottom-color:#9c9c9c}.x-form-trigger-wrap-focus .x-form-trigger{background-position:-51px 0;border-bottom-color:#9c9c9c}.x-form-trigger-wrap-focus .x-form-trigger-over{background-position:-68px 0;border-bottom-color:null}.x-form-trigger-click,.x-form-trigger-wrap-focus .x-form-trigger-click{background-position:-34px 0;border-bottom-color:null}.x-form-trigger-icon{height:16px;background-repeat:no-repeat;background-position:7px 6px}.x-pickerfield-open .x-form-field{-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;-o-border-bottom-left-radius:0;-ms-border-bottom-left-radius:0;-khtml-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;-o-border-bottom-right-radius:0;-ms-border-bottom-right-radius:0;-khtml-border-bottom-right-radius:0;border-bottom-right-radius:0}.x-pickerfield-open-above .x-form-field{-moz-border-radius-bottomleft:3px;-webkit-border-bottom-left-radius:3px;-o-border-bottom-left-radius:3px;-ms-border-bottom-left-radius:3px;-khtml-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;-o-border-top-left-radius:0;-ms-border-top-left-radius:0;-khtml-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;-o-border-top-right-radius:0;-ms-border-top-right-radius:0;-khtml-border-top-right-radius:0;border-top-right-radius:0}.x-form-arrow-trigger .x-form-trigger-icon{background-image:url('../resources/themes/images/partkeepr/boundlist/trigger-arrow.png')}.x-form-date-trigger{background-image:url('../resources/themes/images/partkeepr/form/date-trigger.png')}.x-form-trigger-wrap{height:22px;position:absolute;right:2px}.x-form-trigger-wrap .x-form-spinner-up,.x-form-trigger-wrap .x-form-spinner-down{background-image:url('../resources/themes/images/partkeepr/form/spinner.png');width:17px;height:11px;font-size:0}.x-form-trigger-wrap .x-form-spinner-down{background-position:0 -11px}.x-form-trigger-wrap-focus .x-form-spinner-down{background-position:-51px -11px}.x-form-trigger-wrap .x-form-spinner-down-over{background-position:-17px -11px}.x-form-trigger-wrap-focus .x-form-spinner-down-over{background-position:-68px -11px}.x-form-trigger-wrap .x-form-spinner-down-click{background-position:-34px -11px}.x-field-default-toolbar .x-form-trigger-wrap .x-form-spinner-up,.x-field-default-toolbar .x-form-trigger-wrap .x-form-spinner-down{background-image:url('../resources/themes/images/partkeepr/form/spinner-small.gif');height:11px}.x-field-default-toolbar .x-form-trigger-wrap .x-form-spinner-down{background-position:0 -11px}.x-field-default-toolbar .x-form-trigger-wrap-focus .x-form-spinner-down{background-position:-51px -11px}.x-field-default-toolbar .x-form-trigger-wrap .x-form-spinner-down-over{background-position:-17px -11px}.x-field-default-toolbar .x-form-trigger-wrap-focus .x-form-spinner-down-over{background-position:-68px -11px}.x-field-default-toolbar .x-form-trigger-wrap .x-form-spinner-down-click{background-position:-34px -11px}.x-trigger-noedit{cursor:pointer;cursor:hand}.x-form-clear-trigger{background-image:url('../resources/themes/images/partkeepr/form/clear-trigger.png')}.x-form-search-trigger{background-image:url('../resources/themes/images/partkeepr/form/search-trigger.png')}.x-html-editor-wrap{border:1px solid #b5b8c8}.x-html-editor-wrap .x-toolbar{border-top-width:0;border-left-width:0;border-right-width:0}.x-html-editor-wrap textarea{background-color:#fff}.x-html-editor-tb .x-btn-text{background:transparent url('../resources/themes/images/partkeepr/editor/tb-sprite.gif') no-repeat}.x-html-editor-tb .x-edit-bold,.x-menu-item img.x-edit-bold{background-position:0 0;background-image:url('../resources/themes/images/partkeepr/editor/tb-sprite.gif')}.x-html-editor-tb .x-edit-italic,.x-menu-item img.x-edit-italic{background-position:-16px 0;background-image:url('../resources/themes/images/partkeepr/editor/tb-sprite.gif')}.x-html-editor-tb .x-edit-underline,.x-menu-item img.x-edit-underline{background-position:-32px 0;background-image:url('../resources/themes/images/partkeepr/editor/tb-sprite.gif')}.x-html-editor-tb .x-edit-forecolor,.x-menu-item img.x-edit-forecolor{background-position:-160px 0;background-image:url('../resources/themes/images/partkeepr/editor/tb-sprite.gif')}.x-html-editor-tb .x-edit-backcolor,.x-menu-item img.x-edit-backcolor{background-position:-176px 0;background-image:url('../resources/themes/images/partkeepr/editor/tb-sprite.gif')}.x-html-editor-tb .x-edit-justifyleft,.x-menu-item img.x-edit-justifyleft{background-position:-112px 0;background-image:url('../resources/themes/images/partkeepr/editor/tb-sprite.gif')}.x-html-editor-tb .x-edit-justifycenter,.x-menu-item img.x-edit-justifycenter{background-position:-128px 0;background-image:url('../resources/themes/images/partkeepr/editor/tb-sprite.gif')}.x-html-editor-tb .x-edit-justifyright,.x-menu-item img.x-edit-justifyright{background-position:-144px 0;background-image:url('../resources/themes/images/partkeepr/editor/tb-sprite.gif')}.x-html-editor-tb .x-edit-insertorderedlist,.x-menu-item img.x-edit-insertorderedlist{background-position:-80px 0;background-image:url('../resources/themes/images/partkeepr/editor/tb-sprite.gif')}.x-html-editor-tb .x-edit-insertunorderedlist,.x-menu-item img.x-edit-insertunorderedlist{background-position:-96px 0;background-image:url('../resources/themes/images/partkeepr/editor/tb-sprite.gif')}.x-html-editor-tb .x-edit-increasefontsize,.x-menu-item img.x-edit-increasefontsize{background-position:-48px 0;background-image:url('../resources/themes/images/partkeepr/editor/tb-sprite.gif')}.x-html-editor-tb .x-edit-decreasefontsize,.x-menu-item img.x-edit-decreasefontsize{background-position:-64px 0;background-image:url('../resources/themes/images/partkeepr/editor/tb-sprite.gif')}.x-html-editor-tb .x-edit-sourceedit,.x-menu-item img.x-edit-sourceedit{background-position:-192px 0;background-image:url('../resources/themes/images/partkeepr/editor/tb-sprite.gif')}.x-html-editor-tb .x-edit-createlink,.x-menu-item img.x-edit-createlink{background-position:-208px 0;background-image:url('../resources/themes/images/partkeepr/editor/tb-sprite.gif')}.x-html-editor-tip .x-tip-bd .x-tip-bd-inner{padding:5px;padding-bottom:1px}.x-html-editor-tb .x-toolbar{position:static !important}.x-html-editor-tb .x-font-select{font-size:11px}.x-html-editor-wrap textarea{border:0;padding:3px 2px;overflow:auto}.x-panel,.x-plain{overflow:hidden;position:relative}.x-ie .x-panel-header,.x-ie .x-panel-header-tl,.x-ie .x-panel-header-tc,.x-ie .x-panel-header-tr,.x-ie .x-panel-header-ml,.x-ie .x-panel-header-mc,.x-ie .x-panel-header-mr,.x-ie .x-panel-header-bl,.x-ie .x-panel-header-bc,.x-ie .x-panel-header-br{zoom:1}.x-ie8 td.x-frame-mc{vertical-align:top}.x-panel-header{padding:5px 4px 4px 5px}.x-panel-header-icon,.x-window-header-icon{width:16px;height:16px;background-repeat:no-repeat;background-position:0 0;vertical-align:middle;margin-right:4px;margin-top:-1px;margin-bottom:-1px}.x-panel-header-draggable,.x-panel-header-draggable .x-panel-header-text,.x-window-header-draggable,.x-window-header-draggable .x-window-header-text{cursor:move}.x-panel-ghost,.x-window-ghost{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=65);opacity:0.65;cursor:move}.x-panel-header-horizontal .x-panel-header-body,.x-panel-header-horizontal .x-window-header-body,.x-panel-header-horizontal .x-btn-group-header-body,.x-window-header-horizontal .x-panel-header-body,.x-window-header-horizontal .x-window-header-body,.x-window-header-horizontal .x-btn-group-header-body,.x-btn-group-header-horizontal .x-panel-header-body,.x-btn-group-header-horizontal .x-window-header-body,.x-btn-group-header-horizontal .x-btn-group-header-body{width:100%}.x-panel-header-vertical .x-panel-header-body,.x-panel-header-vertical .x-window-header-body,.x-panel-header-vertical .x-btn-group-header-body,.x-window-header-vertical .x-panel-header-body,.x-window-header-vertical .x-window-header-body,.x-window-header-vertical .x-btn-group-header-body,.x-btn-group-header-vertical .x-panel-header-body,.x-btn-group-header-vertical .x-window-header-body,.x-btn-group-header-vertical .x-btn-group-header-body{height:100%}.x-panel-header-vertical,.x-panel-header-vertical .x-panel-header-body,.x-btn-group-header-vertical,.x-btn-group-header-vertical .x-btn-group-header-body,.x-window-header-vertical,.x-window-header-vertical .x-window-header-body{display:-moz-inline-stack;display:inline-block}.x-panel-header-text{-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:ignore;cursor:default;white-space:nowrap}.x-panel-header-left .x-vml-base,.x-panel-header-right .x-vml-base{left:-3px !important}.x-panel-body{overflow:hidden;position:relative;font-size:12px}.x-panel-header-vertical .x-surface{margin-top:2px}.x-panel-header-plain-vertical .x-surface{margin-top:0}.x-panel-collapsed .x-panel-header-collapsed-border-top{border-bottom-width:1px !important}.x-panel-collapsed .x-panel-header-collapsed-border-right{border-left-width:1px !important}.x-panel-collapsed .x-panel-header-collapsed-border-bottom{border-top-width:1px !important}.x-panel-collapsed .x-panel-header-collapsed-border-left{border-right-width:1px !important}.x-nlg .x-panel-header-vertical .x-frame-mc{background-repeat:repeat-y}.x-panel-default{border-color:#aaa}.x-panel-header-default{font-size:11px;line-height:15px;border-color:#aaa;border-width:1px;border-style:solid;background-image:none;background-color:#d3cccc;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #535353), color-stop(100%, #363636));background-image:-webkit-linear-gradient(top, #535353,#363636);background-image:-moz-linear-gradient(top, #535353,#363636);background-image:-o-linear-gradient(top, #535353,#363636);background-image:-ms-linear-gradient(top, #535353,#363636);background-image:linear-gradient(top, #535353,#363636);-moz-box-shadow:0;-webkit-box-shadow:0;-o-box-shadow:0;box-shadow:0}.x-nlg .x-panel-header-default-top{background-image:url('../resources/themes/images/partkeepr/panel-header/panel-header-default-top-bg.gif')}.x-nlg .x-panel-header-default-bottom{background-image:url('../resources/themes/images/partkeepr/panel-header/panel-header-default-bottom-bg.gif')}.x-nlg .x-panel-header-default-left{background-image:url('../resources/themes/images/partkeepr/panel-header/panel-header-default-left-bg.gif')}.x-nlg .x-panel-header-default-right{background-image:url('../resources/themes/images/partkeepr/panel-header/panel-header-default-right-bg.gif')}.x-panel-header-text-default{color:#eee;font-size:11px;font-weight:bold;font-family:tahoma,arial,verdana,sans-serif}.x-panel-body-default{background:#fff;border-color:#aaa;color:#000;border-width:1px;border-style:solid}.x-panel-collapsed .x-window-header-default,.x-panel-collapsed .x-panel-header-default{border-color:#aaa}.x-panel-header-default-vertical{border-color:#aaa}.x-panel-header-default-left,.x-panel-header-default-right{background-image:none;background-color:#d3cccc;background-image:-webkit-gradient(linear, 100% 50%, 0% 50%, color-stop(0%, #535353), color-stop(100%, #363636));background-image:-webkit-linear-gradient(right, #535353,#363636);background-image:-moz-linear-gradient(right, #535353,#363636);background-image:-o-linear-gradient(right, #535353,#363636);background-image:-ms-linear-gradient(right, #535353,#363636);background-image:linear-gradient(right, #535353,#363636)}.x-panel-collapsed .x-panel-header-default-top{-moz-border-radius-bottomleft:null;-webkit-border-bottom-left-radius:null;-o-border-bottom-left-radius:null;-ms-border-bottom-left-radius:null;-khtml-border-bottom-left-radius:null;border-bottom-left-radius:null;-moz-border-radius-bottomright:null;-webkit-border-bottom-right-radius:null;-o-border-bottom-right-radius:null;-ms-border-bottom-right-radius:null;-khtml-border-bottom-right-radius:null;border-bottom-right-radius:null}.x-panel-collapsed .x-panel-header-default-right{-moz-border-radius-topleft:null;-webkit-border-top-left-radius:null;-o-border-top-left-radius:null;-ms-border-top-left-radius:null;-khtml-border-top-left-radius:null;border-top-left-radius:null;-moz-border-radius-bottomleft:null;-webkit-border-bottom-left-radius:null;-o-border-bottom-left-radius:null;-ms-border-bottom-left-radius:null;-khtml-border-bottom-left-radius:null;border-bottom-left-radius:null}.x-panel-collapsed .x-panel-header-default-bottom{-moz-border-radius-topleft:null;-webkit-border-top-left-radius:null;-o-border-top-left-radius:null;-ms-border-top-left-radius:null;-khtml-border-top-left-radius:null;border-top-left-radius:null;-moz-border-radius-topright:null;-webkit-border-top-right-radius:null;-o-border-top-right-radius:null;-ms-border-top-right-radius:null;-khtml-border-top-right-radius:null;border-top-right-radius:null}.x-panel-collapsed .x-panel-header-default-left{-moz-border-radius-topright:null;-webkit-border-top-right-radius:null;-o-border-top-right-radius:null;-ms-border-top-right-radius:null;-khtml-border-top-right-radius:null;border-top-right-radius:null;-moz-border-radius-bottomright:null;-webkit-border-bottom-right-radius:null;-o-border-bottom-right-radius:null;-ms-border-bottom-right-radius:null;-khtml-border-bottom-right-radius:null;border-bottom-right-radius:null}.x-nlg .x-panel-header-default-right{background-position:top right}.x-panel-header-default-top{-moz-box-shadow:#eae8e8 0 1px 0px 0 inset;-webkit-box-shadow:#eae8e8 0 1px 0px 0 inset;-o-box-shadow:#eae8e8 0 1px 0px 0 inset;box-shadow:#eae8e8 0 1px 0px 0 inset}.x-panel-header-default-right{-moz-box-shadow:0,#eae8e8 -1px 0 0px 0 inset;-webkit-box-shadow:0,#eae8e8 -1px 0 0px 0 inset;-o-box-shadow:0,#eae8e8 -1px 0 0px 0 inset;box-shadow:0,#eae8e8 -1px 0 0px 0 inset}.x-panel-header-default-bottom{-moz-box-shadow:0,#eae8e8 0 -1px 0px 0 inset;-webkit-box-shadow:0,#eae8e8 0 -1px 0px 0 inset;-o-box-shadow:0,#eae8e8 0 -1px 0px 0 inset;box-shadow:0,#eae8e8 0 -1px 0px 0 inset}.x-panel-header-default-left{-moz-box-shadow:0,#eae8e8 1px 0 0px 0 inset;-webkit-box-shadow:0,#eae8e8 1px 0 0px 0 inset;-o-box-shadow:0,#eae8e8 1px 0 0px 0 inset;box-shadow:0,#eae8e8 1px 0 0px 0 inset}.x-nlg .x-panel-header-default-bottom{background-position:bottom left}.x-panel-header-default-right-tc,.x-panel-header-default-right-mc,.x-panel-header-default-right-bc{background-position:right 0}.x-panel-header-default-bottom-tc,.x-panel-header-default-bottom-mc,.x-panel-header-default-bottom-bc{background-position:0 bottom}.x-panel-default-framed{border-color:#aaa}.x-panel-header-default-framed{font-size:11px;line-height:15px;border-color:#aaa;border-width:1px;border-style:solid;background-image:none;background-color:#d3cccc;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #535353), color-stop(100%, #363636));background-image:-webkit-linear-gradient(top, #535353,#363636);background-image:-moz-linear-gradient(top, #535353,#363636);background-image:-o-linear-gradient(top, #535353,#363636);background-image:-ms-linear-gradient(top, #535353,#363636);background-image:linear-gradient(top, #535353,#363636);-moz-box-shadow:0;-webkit-box-shadow:0;-o-box-shadow:0;box-shadow:0}.x-nlg .x-panel-header-default-framed-top{background-image:url('../resources/themes/images/partkeepr/panel-header/panel-header-default-framed-top-bg.gif')}.x-nlg .x-panel-header-default-framed-bottom{background-image:url('../resources/themes/images/partkeepr/panel-header/panel-header-default-framed-bottom-bg.gif')}.x-nlg .x-panel-header-default-framed-left{background-image:url('../resources/themes/images/partkeepr/panel-header/panel-header-default-framed-left-bg.gif')}.x-nlg .x-panel-header-default-framed-right{background-image:url('../resources/themes/images/partkeepr/panel-header/panel-header-default-framed-right-bg.gif')}.x-panel-header-text-default-framed{color:#eee;font-size:11px;font-weight:bold;font-family:tahoma,arial,verdana,sans-serif}.x-panel-body-default-framed{background:#dbdbdb;border-color:#aaa;color:#000;border-width:0;border-style:solid}.x-panel-collapsed .x-window-header-default-framed,.x-panel-collapsed .x-panel-header-default-framed{border-color:#aaa}.x-panel-header-default-framed-vertical{border-color:#aaa}.x-panel-header-default-framed-left,.x-panel-header-default-framed-right{background-image:none;background-color:#d3cccc;background-image:-webkit-gradient(linear, 100% 50%, 0% 50%, color-stop(0%, #535353), color-stop(100%, #363636));background-image:-webkit-linear-gradient(right, #535353,#363636);background-image:-moz-linear-gradient(right, #535353,#363636);background-image:-o-linear-gradient(right, #535353,#363636);background-image:-ms-linear-gradient(right, #535353,#363636);background-image:linear-gradient(right, #535353,#363636)}.x-panel-default-framed{-moz-border-radius:4px;-webkit-border-radius:4px;-o-border-radius:4px;-ms-border-radius:4px;-khtml-border-radius:4px;border-radius:4px;padding:4px 4px 4px 4px;border-width:1px;border-style:solid;background-color:#dbdbdb}.x-nlg .x-panel-default-framed-mc{background-color:#dbdbdb}.x-nbr .x-panel-default-framed{padding:0 !important;border-width:0 !important;-moz-border-radius:0px;-webkit-border-radius:0px;-o-border-radius:0px;-ms-border-radius:0px;-khtml-border-radius:0px;border-radius:0px;background-color:transparent;background-position:1000404px 1000404px}.x-nbr .x-panel-default-framed-tl,.x-nbr .x-panel-default-framed-bl,.x-nbr .x-panel-default-framed-tr,.x-nbr .x-panel-default-framed-br,.x-nbr .x-panel-default-framed-tc,.x-nbr .x-panel-default-framed-bc,.x-nbr .x-panel-default-framed-ml,.x-nbr .x-panel-default-framed-mr{zoom:1;background-image:url('../resources/themes/images/partkeepr/panel/panel-default-framed-corners.gif')}.x-nbr .x-panel-default-framed-ml,.x-nbr .x-panel-default-framed-mr{zoom:1;background-image:url('../resources/themes/images/partkeepr/panel/panel-default-framed-sides.gif');background-position:0 0;background-repeat:repeat-y}.x-nbr .x-panel-default-framed-mc{padding:0px 0px 0px 0px}.x-panel-header-default-framed-top{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;-o-border-top-left-radius:4px;-ms-border-top-left-radius:4px;-khtml-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;-o-border-top-right-radius:4px;-ms-border-top-right-radius:4px;-khtml-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;-o-border-bottom-right-radius:0;-ms-border-bottom-right-radius:0;-khtml-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;-o-border-bottom-left-radius:0;-ms-border-bottom-left-radius:0;-khtml-border-bottom-left-radius:0;border-bottom-left-radius:0;padding:4px 5px 4px 5px;border-width:1px;border-style:solid;background-image:none;background-color:#d3cccc;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #535353), color-stop(100%, #363636));background-image:-webkit-linear-gradient(top, #535353,#363636);background-image:-moz-linear-gradient(top, #535353,#363636);background-image:-o-linear-gradient(top, #535353,#363636);background-image:-ms-linear-gradient(top, #535353,#363636);background-image:linear-gradient(top, #535353,#363636)}.x-nlg .x-panel-header-default-framed-top-mc{background-image:url('../resources/themes/images/partkeepr/panel-header/panel-header-default-framed-top-bg.gif');background-color:#d3cccc}.x-nbr .x-panel-header-default-framed-top{padding:0 !important;border-width:0 !important;-moz-border-radius:0px;-webkit-border-radius:0px;-o-border-radius:0px;-ms-border-radius:0px;-khtml-border-radius:0px;border-radius:0px;background-color:transparent;background-position:1000404px 1000000px}.x-nbr .x-panel-header-default-framed-top-tl,.x-nbr .x-panel-header-default-framed-top-bl,.x-nbr .x-panel-header-default-framed-top-tr,.x-nbr .x-panel-header-default-framed-top-br,.x-nbr .x-panel-header-default-framed-top-tc,.x-nbr .x-panel-header-default-framed-top-bc,.x-nbr .x-panel-header-default-framed-top-ml,.x-nbr .x-panel-header-default-framed-top-mr{zoom:1;background-image:url('../resources/themes/images/partkeepr/panel-header/panel-header-default-framed-top-corners.gif')}.x-nbr .x-panel-header-default-framed-top-ml,.x-nbr .x-panel-header-default-framed-top-mr{zoom:1;background-image:url('../resources/themes/images/partkeepr/panel-header/panel-header-default-framed-top-sides.gif');background-position:0 0}.x-nbr .x-panel-header-default-framed-top-mc{padding:0px 1px 4px 1px}.x-panel-header-default-framed-right{-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;-o-border-top-left-radius:0;-ms-border-top-left-radius:0;-khtml-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;-o-border-top-right-radius:4px;-ms-border-top-right-radius:4px;-khtml-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;-o-border-bottom-right-radius:4px;-ms-border-bottom-right-radius:4px;-khtml-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;-o-border-bottom-left-radius:0;-ms-border-bottom-left-radius:0;-khtml-border-bottom-left-radius:0;border-bottom-left-radius:0;padding:4px 5px 4px 5px;border-width:1px;border-style:solid;background-image:none;background-color:#d3cccc;background-image:-webkit-gradient(linear, 100% 50%, 0% 50%, color-stop(0%, #535353), color-stop(100%, #363636));background-image:-webkit-linear-gradient(right, #535353,#363636);background-image:-moz-linear-gradient(right, #535353,#363636);background-image:-o-linear-gradient(right, #535353,#363636);background-image:-ms-linear-gradient(right, #535353,#363636);background-image:linear-gradient(right, #535353,#363636)}.x-nlg .x-panel-header-default-framed-right-mc{background-image:url('../resources/themes/images/partkeepr/panel-header/panel-header-default-framed-right-bg.gif');background-color:#d3cccc}.x-nbr .x-panel-header-default-framed-right{padding:0 !important;border-width:0 !important;-moz-border-radius:0px;-webkit-border-radius:0px;-o-border-radius:0px;-ms-border-radius:0px;-khtml-border-radius:0px;border-radius:0px;background-color:transparent;background-position:1000004px 1100400px}.x-nbr .x-panel-header-default-framed-right-tl,.x-nbr .x-panel-header-default-framed-right-bl,.x-nbr .x-panel-header-default-framed-right-tr,.x-nbr .x-panel-header-default-framed-right-br,.x-nbr .x-panel-header-default-framed-right-tc,.x-nbr .x-panel-header-default-framed-right-bc,.x-nbr .x-panel-header-default-framed-right-ml,.x-nbr .x-panel-header-default-framed-right-mr{zoom:1;background-image:url('../resources/themes/images/partkeepr/panel-header/panel-header-default-framed-right-corners.gif')}.x-nbr .x-panel-header-default-framed-right-tc,.x-nbr .x-panel-header-default-framed-right-bc{zoom:1;background-image:url('../resources/themes/images/partkeepr/panel-header/panel-header-default-framed-right-sides.gif');background-position:0 0;background-repeat:repeat-x}.x-nbr .x-panel-header-default-framed-right-mc{padding:0px 1px 0px 5px}.x-panel-header-default-framed-bottom{-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;-o-border-top-left-radius:0;-ms-border-top-left-radius:0;-khtml-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;-o-border-top-right-radius:0;-ms-border-top-right-radius:0;-khtml-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;-o-border-bottom-right-radius:4px;-ms-border-bottom-right-radius:4px;-khtml-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;-o-border-bottom-left-radius:4px;-ms-border-bottom-left-radius:4px;-khtml-border-bottom-left-radius:4px;border-bottom-left-radius:4px;padding:4px 5px 4px 5px;border-width:1px;border-style:solid;background-image:none;background-color:#d3cccc;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #535353), color-stop(100%, #363636));background-image:-webkit-linear-gradient(top, #535353,#363636);background-image:-moz-linear-gradient(top, #535353,#363636);background-image:-o-linear-gradient(top, #535353,#363636);background-image:-ms-linear-gradient(top, #535353,#363636);background-image:linear-gradient(top, #535353,#363636)}.x-nlg .x-panel-header-default-framed-bottom-mc{background-image:url('../resources/themes/images/partkeepr/panel-header/panel-header-default-framed-bottom-bg.gif');background-color:#d3cccc}.x-nbr .x-panel-header-default-framed-bottom{padding:0 !important;border-width:0 !important;-moz-border-radius:0px;-webkit-border-radius:0px;-o-border-radius:0px;-ms-border-radius:0px;-khtml-border-radius:0px;border-radius:0px;background-color:transparent;background-position:1000000px 1000404px}.x-nbr .x-panel-header-default-framed-bottom-tl,.x-nbr .x-panel-header-default-framed-bottom-bl,.x-nbr .x-panel-header-default-framed-bottom-tr,.x-nbr .x-panel-header-default-framed-bottom-br,.x-nbr .x-panel-header-default-framed-bottom-tc,.x-nbr .x-panel-header-default-framed-bottom-bc,.x-nbr .x-panel-header-default-framed-bottom-ml,.x-nbr .x-panel-header-default-framed-bottom-mr{zoom:1;background-image:url('../resources/themes/images/partkeepr/panel-header/panel-header-default-framed-bottom-corners.gif')}.x-nbr .x-panel-header-default-framed-bottom-ml,.x-nbr .x-panel-header-default-framed-bottom-mr{zoom:1;background-image:url('../resources/themes/images/partkeepr/panel-header/panel-header-default-framed-bottom-sides.gif');background-position:0 0}.x-nbr .x-panel-header-default-framed-bottom-mc{padding:4px 1px 0px 1px}.x-panel-header-default-framed-left{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;-o-border-top-left-radius:4px;-ms-border-top-left-radius:4px;-khtml-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;-o-border-top-right-radius:0;-ms-border-top-right-radius:0;-khtml-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;-o-border-bottom-right-radius:0;-ms-border-bottom-right-radius:0;-khtml-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;-o-border-bottom-left-radius:4px;-ms-border-bottom-left-radius:4px;-khtml-border-bottom-left-radius:4px;border-bottom-left-radius:4px;padding:4px 5px 4px 5px;border-width:1px;border-style:solid;background-image:none;background-color:#d3cccc;background-image:-webkit-gradient(linear, 100% 50%, 0% 50%, color-stop(0%, #535353), color-stop(100%, #363636));background-image:-webkit-linear-gradient(right, #535353,#363636);background-image:-moz-linear-gradient(right, #535353,#363636);background-image:-o-linear-gradient(right, #535353,#363636);background-image:-ms-linear-gradient(right, #535353,#363636);background-image:linear-gradient(right, #535353,#363636)}.x-nlg .x-panel-header-default-framed-left-mc{background-image:url('../resources/themes/images/partkeepr/panel-header/panel-header-default-framed-left-bg.gif');background-color:#d3cccc}.x-nbr .x-panel-header-default-framed-left{padding:0 !important;border-width:0 !important;-moz-border-radius:0px;-webkit-border-radius:0px;-o-border-radius:0px;-ms-border-radius:0px;-khtml-border-radius:0px;border-radius:0px;background-color:transparent;background-position:1000400px 1100004px}.x-nbr .x-panel-header-default-framed-left-tl,.x-nbr .x-panel-header-default-framed-left-bl,.x-nbr .x-panel-header-default-framed-left-tr,.x-nbr .x-panel-header-default-framed-left-br,.x-nbr .x-panel-header-default-framed-left-tc,.x-nbr .x-panel-header-default-framed-left-bc,.x-nbr .x-panel-header-default-framed-left-ml,.x-nbr .x-panel-header-default-framed-left-mr{zoom:1;background-image:url('../resources/themes/images/partkeepr/panel-header/panel-header-default-framed-left-corners.gif')}.x-nbr .x-panel-header-default-framed-left-tc,.x-nbr .x-panel-header-default-framed-left-bc{zoom:1;background-image:url('../resources/themes/images/partkeepr/panel-header/panel-header-default-framed-left-sides.gif');background-position:0 0;background-repeat:repeat-x}.x-nbr .x-panel-header-default-framed-left-mc{padding:0px 5px 0px 1px}.x-panel-header-default-framed-top{-moz-box-shadow:#eae8e8 0 1px 0px 0 inset,#eae8e8 -1px 0 0px 0 inset,#eae8e8 1px 0 0px 0 inset;-webkit-box-shadow:#eae8e8 0 1px 0px 0 inset,#eae8e8 -1px 0 0px 0 inset,#eae8e8 1px 0 0px 0 inset;-o-box-shadow:#eae8e8 0 1px 0px 0 inset,#eae8e8 -1px 0 0px 0 inset,#eae8e8 1px 0 0px 0 inset;box-shadow:#eae8e8 0 1px 0px 0 inset,#eae8e8 -1px 0 0px 0 inset,#eae8e8 1px 0 0px 0 inset}.x-panel-header-default-framed-right{-moz-box-shadow:#eae8e8 0 1px 0px 0 inset,#eae8e8 0 -1px 0px 0 inset,#eae8e8 -1px 0 0px 0 inset;-webkit-box-shadow:#eae8e8 0 1px 0px 0 inset,#eae8e8 0 -1px 0px 0 inset,#eae8e8 -1px 0 0px 0 inset;-o-box-shadow:#eae8e8 0 1px 0px 0 inset,#eae8e8 0 -1px 0px 0 inset,#eae8e8 -1px 0 0px 0 inset;box-shadow:#eae8e8 0 1px 0px 0 inset,#eae8e8 0 -1px 0px 0 inset,#eae8e8 -1px 0 0px 0 inset}.x-panel-header-default-framed-bottom{-moz-box-shadow:0,#eae8e8 0 -1px 0px 0 inset,#eae8e8 -1px 0 0px 0 inset,#eae8e8 1px 0 0px 0 inset;-webkit-box-shadow:0,#eae8e8 0 -1px 0px 0 inset,#eae8e8 -1px 0 0px 0 inset,#eae8e8 1px 0 0px 0 inset;-o-box-shadow:0,#eae8e8 0 -1px 0px 0 inset,#eae8e8 -1px 0 0px 0 inset,#eae8e8 1px 0 0px 0 inset;box-shadow:0,#eae8e8 0 -1px 0px 0 inset,#eae8e8 -1px 0 0px 0 inset,#eae8e8 1px 0 0px 0 inset}.x-panel-header-default-framed-left{-moz-box-shadow:#eae8e8 0 1px 0px 0 inset,#eae8e8 0 -1px 0px 0 inset,#eae8e8 1px 0 0px 0 inset;-webkit-box-shadow:#eae8e8 0 1px 0px 0 inset,#eae8e8 0 -1px 0px 0 inset,#eae8e8 1px 0 0px 0 inset;-o-box-shadow:#eae8e8 0 1px 0px 0 inset,#eae8e8 0 -1px 0px 0 inset,#eae8e8 1px 0 0px 0 inset;box-shadow:#eae8e8 0 1px 0px 0 inset,#eae8e8 0 -1px 0px 0 inset,#eae8e8 1px 0 0px 0 inset}.x-nlg .x-panel-header-default-framed-bottom{background-position:bottom left}.x-panel .x-panel-header-default-framed-top{border-bottom-width:1px !important}.x-panel .x-panel-header-default-framed-right{border-left-width:1px !important}.x-panel .x-panel-header-default-framed-bottom{border-top-width:1px !important}.x-panel .x-panel-header-default-framed-left{border-right-width:1px !important}.x-panel-header-default-framed-collapsed{-moz-border-radius:4px;-webkit-border-radius:4px;-o-border-radius:4px;-ms-border-radius:4px;-khtml-border-radius:4px;border-radius:4px}.x-panel-header-default-framed-collapsed-top{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;-o-border-top-left-radius:4px;-ms-border-top-left-radius:4px;-khtml-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;-o-border-top-right-radius:4px;-ms-border-top-right-radius:4px;-khtml-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;-o-border-bottom-right-radius:4px;-ms-border-bottom-right-radius:4px;-khtml-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;-o-border-bottom-left-radius:4px;-ms-border-bottom-left-radius:4px;-khtml-border-bottom-left-radius:4px;border-bottom-left-radius:4px;padding:4px 5px 4px 5px;border-width:1px;border-style:solid;background-image:none;background-color:#d3cccc;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #535353), color-stop(100%, #363636));background-image:-webkit-linear-gradient(top, #535353,#363636);background-image:-moz-linear-gradient(top, #535353,#363636);background-image:-o-linear-gradient(top, #535353,#363636);background-image:-ms-linear-gradient(top, #535353,#363636);background-image:linear-gradient(top, #535353,#363636)}.x-nlg .x-panel-header-default-framed-collapsed-top-mc{background-image:url('../resources/themes/images/partkeepr/panel-header/panel-header-default-framed-collapsed-top-bg.gif');background-color:#d3cccc}.x-nbr .x-panel-header-default-framed-collapsed-top{padding:0 !important;border-width:0 !important;-moz-border-radius:0px;-webkit-border-radius:0px;-o-border-radius:0px;-ms-border-radius:0px;-khtml-border-radius:0px;border-radius:0px;background-color:transparent;background-position:1000404px 1000404px}.x-nbr .x-panel-header-default-framed-collapsed-top-tl,.x-nbr .x-panel-header-default-framed-collapsed-top-bl,.x-nbr .x-panel-header-default-framed-collapsed-top-tr,.x-nbr .x-panel-header-default-framed-collapsed-top-br,.x-nbr .x-panel-header-default-framed-collapsed-top-tc,.x-nbr .x-panel-header-default-framed-collapsed-top-bc,.x-nbr .x-panel-header-default-framed-collapsed-top-ml,.x-nbr .x-panel-header-default-framed-collapsed-top-mr{zoom:1;background-image:url('../resources/themes/images/partkeepr/panel-header/panel-header-default-framed-collapsed-top-corners.gif')}.x-nbr .x-panel-header-default-framed-collapsed-top-ml,.x-nbr .x-panel-header-default-framed-collapsed-top-mr{zoom:1;background-image:url('../resources/themes/images/partkeepr/panel-header/panel-header-default-framed-collapsed-top-sides.gif');background-position:0 0}.x-nbr .x-panel-header-default-framed-collapsed-top-mc{padding:0px 1px 0px 1px}.x-panel-header-default-framed-collapsed-right{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;-o-border-top-left-radius:4px;-ms-border-top-left-radius:4px;-khtml-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;-o-border-top-right-radius:4px;-ms-border-top-right-radius:4px;-khtml-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;-o-border-bottom-right-radius:4px;-ms-border-bottom-right-radius:4px;-khtml-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;-o-border-bottom-left-radius:4px;-ms-border-bottom-left-radius:4px;-khtml-border-bottom-left-radius:4px;border-bottom-left-radius:4px;padding:4px 5px 4px 5px;border-width:1px;border-style:solid;background-image:none;background-color:#d3cccc;background-image:-webkit-gradient(linear, 100% 50%, 0% 50%, color-stop(0%, #535353), color-stop(100%, #363636));background-image:-webkit-linear-gradient(right, #535353,#363636);background-image:-moz-linear-gradient(right, #535353,#363636);background-image:-o-linear-gradient(right, #535353,#363636);background-image:-ms-linear-gradient(right, #535353,#363636);background-image:linear-gradient(right, #535353,#363636)}.x-nlg .x-panel-header-default-framed-collapsed-right-mc{background-image:url('../resources/themes/images/partkeepr/panel-header/panel-header-default-framed-collapsed-right-bg.gif');background-color:#d3cccc}.x-nbr .x-panel-header-default-framed-collapsed-right{padding:0 !important;border-width:0 !important;-moz-border-radius:0px;-webkit-border-radius:0px;-o-border-radius:0px;-ms-border-radius:0px;-khtml-border-radius:0px;border-radius:0px;background-color:transparent;background-position:1000404px 1100404px}.x-nbr .x-panel-header-default-framed-collapsed-right-tl,.x-nbr .x-panel-header-default-framed-collapsed-right-bl,.x-nbr .x-panel-header-default-framed-collapsed-right-tr,.x-nbr .x-panel-header-default-framed-collapsed-right-br,.x-nbr .x-panel-header-default-framed-collapsed-right-tc,.x-nbr .x-panel-header-default-framed-collapsed-right-bc,.x-nbr .x-panel-header-default-framed-collapsed-right-ml,.x-nbr .x-panel-header-default-framed-collapsed-right-mr{zoom:1;background-image:url('../resources/themes/images/partkeepr/panel-header/panel-header-default-framed-collapsed-right-corners.gif')}.x-nbr .x-panel-header-default-framed-collapsed-right-tc,.x-nbr .x-panel-header-default-framed-collapsed-right-bc{zoom:1;background-image:url('../resources/themes/images/partkeepr/panel-header/panel-header-default-framed-collapsed-right-sides.gif');background-position:0 0;background-repeat:repeat-x}.x-nbr .x-panel-header-default-framed-collapsed-right-mc{padding:0px 1px 0px 1px}.x-panel-header-default-framed-collapsed-bottom{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;-o-border-top-left-radius:4px;-ms-border-top-left-radius:4px;-khtml-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;-o-border-top-right-radius:4px;-ms-border-top-right-radius:4px;-khtml-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;-o-border-bottom-right-radius:4px;-ms-border-bottom-right-radius:4px;-khtml-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;-o-border-bottom-left-radius:4px;-ms-border-bottom-left-radius:4px;-khtml-border-bottom-left-radius:4px;border-bottom-left-radius:4px;padding:4px 5px 4px 5px;border-width:1px;border-style:solid;background-image:none;background-color:#d3cccc;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #535353), color-stop(100%, #363636));background-image:-webkit-linear-gradient(top, #535353,#363636);background-image:-moz-linear-gradient(top, #535353,#363636);background-image:-o-linear-gradient(top, #535353,#363636);background-image:-ms-linear-gradient(top, #535353,#363636);background-image:linear-gradient(top, #535353,#363636)}.x-nlg .x-panel-header-default-framed-collapsed-bottom-mc{background-image:url('../resources/themes/images/partkeepr/panel-header/panel-header-default-framed-collapsed-bottom-bg.gif');background-color:#d3cccc}.x-nbr .x-panel-header-default-framed-collapsed-bottom{padding:0 !important;border-width:0 !important;-moz-border-radius:0px;-webkit-border-radius:0px;-o-border-radius:0px;-ms-border-radius:0px;-khtml-border-radius:0px;border-radius:0px;background-color:transparent;background-position:1000404px 1000404px}.x-nbr .x-panel-header-default-framed-collapsed-bottom-tl,.x-nbr .x-panel-header-default-framed-collapsed-bottom-bl,.x-nbr .x-panel-header-default-framed-collapsed-bottom-tr,.x-nbr .x-panel-header-default-framed-collapsed-bottom-br,.x-nbr .x-panel-header-default-framed-collapsed-bottom-tc,.x-nbr .x-panel-header-default-framed-collapsed-bottom-bc,.x-nbr .x-panel-header-default-framed-collapsed-bottom-ml,.x-nbr .x-panel-header-default-framed-collapsed-bottom-mr{zoom:1;background-image:url('../resources/themes/images/partkeepr/panel-header/panel-header-default-framed-collapsed-bottom-corners.gif')}.x-nbr .x-panel-header-default-framed-collapsed-bottom-ml,.x-nbr .x-panel-header-default-framed-collapsed-bottom-mr{zoom:1;background-image:url('../resources/themes/images/partkeepr/panel-header/panel-header-default-framed-collapsed-bottom-sides.gif');background-position:0 0}.x-nbr .x-panel-header-default-framed-collapsed-bottom-mc{padding:0px 1px 0px 1px}.x-panel-header-default-framed-collapsed-left{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;-o-border-top-left-radius:4px;-ms-border-top-left-radius:4px;-khtml-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;-o-border-top-right-radius:4px;-ms-border-top-right-radius:4px;-khtml-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;-o-border-bottom-right-radius:4px;-ms-border-bottom-right-radius:4px;-khtml-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;-o-border-bottom-left-radius:4px;-ms-border-bottom-left-radius:4px;-khtml-border-bottom-left-radius:4px;border-bottom-left-radius:4px;padding:4px 5px 4px 5px;border-width:1px;border-style:solid;background-image:none;background-color:#d3cccc;background-image:-webkit-gradient(linear, 100% 50%, 0% 50%, color-stop(0%, #535353), color-stop(100%, #363636));background-image:-webkit-linear-gradient(right, #535353,#363636);background-image:-moz-linear-gradient(right, #535353,#363636);background-image:-o-linear-gradient(right, #535353,#363636);background-image:-ms-linear-gradient(right, #535353,#363636);background-image:linear-gradient(right, #535353,#363636)}.x-nlg .x-panel-header-default-framed-collapsed-left-mc{background-image:url('../resources/themes/images/partkeepr/panel-header/panel-header-default-framed-collapsed-left-bg.gif');background-color:#d3cccc}.x-nbr .x-panel-header-default-framed-collapsed-left{padding:0 !important;border-width:0 !important;-moz-border-radius:0px;-webkit-border-radius:0px;-o-border-radius:0px;-ms-border-radius:0px;-khtml-border-radius:0px;border-radius:0px;background-color:transparent;background-position:1000404px 1100404px}.x-nbr .x-panel-header-default-framed-collapsed-left-tl,.x-nbr .x-panel-header-default-framed-collapsed-left-bl,.x-nbr .x-panel-header-default-framed-collapsed-left-tr,.x-nbr .x-panel-header-default-framed-collapsed-left-br,.x-nbr .x-panel-header-default-framed-collapsed-left-tc,.x-nbr .x-panel-header-default-framed-collapsed-left-bc,.x-nbr .x-panel-header-default-framed-collapsed-left-ml,.x-nbr .x-panel-header-default-framed-collapsed-left-mr{zoom:1;background-image:url('../resources/themes/images/partkeepr/panel-header/panel-header-default-framed-collapsed-left-corners.gif')}.x-nbr .x-panel-header-default-framed-collapsed-left-tc,.x-nbr .x-panel-header-default-framed-collapsed-left-bc{zoom:1;background-image:url('../resources/themes/images/partkeepr/panel-header/panel-header-default-framed-collapsed-left-sides.gif');background-position:0 0;background-repeat:repeat-x}.x-nbr .x-panel-header-default-framed-collapsed-left-mc{padding:0px 1px 0px 1px}.x-panel-header-default-framed-right-tc,.x-panel-header-default-framed-right-mc,.x-panel-header-default-framed-right-bc{background-position:right 0}.x-panel-header-default-framed-bottom-tc,.x-panel-header-default-framed-bottom-mc,.x-panel-header-default-framed-bottom-bc{background-position:0 bottom}.x-panel-header-plain,.x-panel-body-plain{border:0;padding:0}.x-tip{position:absolute;overflow:visible;border-color:#818181}.x-tip .x-tip-header .x-box-item{padding:3px 3px 0}.x-tip .x-tip-header .x-tool{padding:0px 1px 0 0 !important}.x-tip{-moz-border-radius:3px;-webkit-border-radius:3px;-o-border-radius:3px;-ms-border-radius:3px;-khtml-border-radius:3px;border-radius:3px;padding:2px 2px 2px 2px;border-width:1px;border-style:solid;background-image:none;background-color:#c7c7c7;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ededed), color-stop(100%, #c7c7c7));background-image:-webkit-linear-gradient(top, #ededed,#c7c7c7);background-image:-moz-linear-gradient(top, #ededed,#c7c7c7);background-image:-o-linear-gradient(top, #ededed,#c7c7c7);background-image:-ms-linear-gradient(top, #ededed,#c7c7c7);background-image:linear-gradient(top, #ededed,#c7c7c7)}.x-nlg .x-tip-mc{background-image:url('../resources/themes/images/partkeepr/tip/tip-bg.gif');background-color:#c7c7c7}.x-nbr .x-tip{padding:0 !important;border-width:0 !important;-moz-border-radius:0px;-webkit-border-radius:0px;-o-border-radius:0px;-ms-border-radius:0px;-khtml-border-radius:0px;border-radius:0px;background-color:transparent;background-position:1100303px 1000303px}.x-nbr .x-tip-tl,.x-nbr .x-tip-bl,.x-nbr .x-tip-tr,.x-nbr .x-tip-br,.x-nbr .x-tip-tc,.x-nbr .x-tip-bc,.x-nbr .x-tip-ml,.x-nbr .x-tip-mr{zoom:1;background-image:url('../resources/themes/images/partkeepr/tip/tip-corners.gif')}.x-nbr .x-tip-ml,.x-nbr .x-tip-mr{zoom:1;background-image:url('../resources/themes/images/partkeepr/tip/tip-sides.gif');background-position:0 0}.x-nbr .x-tip-mc{padding:0 0 0 0}.x-tip-header-text{-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:ignore;cursor:default;color:#444;font-size:11px;font-weight:bold}.x-tip-header-draggable .x-tip-header-text{cursor:move}.x-tip-body,.x-form-invalid-tip-body{overflow:hidden;position:relative;padding:3px}.x-tip-header,.x-tip-body,.x-form-invalid-tip-body{color:#444;font-size:11px;font-weight:normal}.x-tip-header a,.x-tip-body a,.x-form-invalid-tip-body a{color:#2a2a2a}.x-tip-anchor{position:absolute;overflow:hidden;height:0;width:0;border-style:solid;border-width:5px;border-color:#818181;zoom:1}.x-border-box .x-tip-anchor{width:10px;height:10px}.x-tip-anchor-top{border-top-color:transparent;border-left-color:transparent;border-right-color:transparent;_border-top-color:pink;_border-left-color:pink;_border-right-color:pink;_filter:chroma(color=pink)}.x-tip-anchor-bottom{border-bottom-color:transparent;border-left-color:transparent;border-right-color:transparent;_border-bottom-color:pink;_border-left-color:pink;_border-right-color:pink;_filter:chroma(color=pink)}.x-tip-anchor-left{border-top-color:transparent;border-bottom-color:transparent;border-left-color:transparent;_border-top-color:pink;_border-bottom-color:pink;_border-left-color:pink;_filter:chroma(color=pink)}.x-tip-anchor-right{border-top-color:transparent;border-bottom-color:transparent;border-right-color:transparent;_border-top-color:pink;_border-bottom-color:pink;_border-right-color:pink;_filter:chroma(color=pink)}.x-form-invalid-tip{border-color:#a1311f;-moz-box-shadow:#d87166 0 1px 0px 0 inset,#d87166 0 -1px 0px 0 inset,#d87166 -1px 0 0px 0 inset,#d87166 1px 0 0px 0 inset;-webkit-box-shadow:#d87166 0 1px 0px 0 inset,#d87166 0 -1px 0px 0 inset,#d87166 -1px 0 0px 0 inset,#d87166 1px 0 0px 0 inset;-o-box-shadow:#d87166 0 1px 0px 0 inset,#d87166 0 -1px 0px 0 inset,#d87166 -1px 0 0px 0 inset,#d87166 1px 0 0px 0 inset;box-shadow:#d87166 0 1px 0px 0 inset,#d87166 0 -1px 0px 0 inset,#d87166 -1px 0 0px 0 inset,#d87166 1px 0 0px 0 inset}.x-form-invalid-tip-body{background:1px 1px no-repeat;background-image:url('../resources/themes/images/partkeepr/form/exclamation.gif');padding-left:22px}.x-form-invalid-tip-body li{margin-bottom:4px}.x-form-invalid-tip-body li.last{margin-bottom:0}.x-form-invalid-tip-default{-moz-border-radius:5px;-webkit-border-radius:5px;-o-border-radius:5px;-ms-border-radius:5px;-khtml-border-radius:5px;border-radius:5px;padding:4px 4px 4px 4px;border-width:1px;border-style:solid;background-image:none;background-color:#fff;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ededed), color-stop(100%, #c7c7c7));background-image:-webkit-linear-gradient(top, #ededed,#c7c7c7);background-image:-moz-linear-gradient(top, #ededed,#c7c7c7);background-image:-o-linear-gradient(top, #ededed,#c7c7c7);background-image:-ms-linear-gradient(top, #ededed,#c7c7c7);background-image:linear-gradient(top, #ededed,#c7c7c7)}.x-nlg .x-form-invalid-tip-default-mc{background-image:url('../resources/themes/images/partkeepr/form-invalid-tip/form-invalid-tip-default-bg.gif');background-color:#fff}.x-nbr .x-form-invalid-tip-default{padding:0 !important;border-width:0 !important;-moz-border-radius:0px;-webkit-border-radius:0px;-o-border-radius:0px;-ms-border-radius:0px;-khtml-border-radius:0px;border-radius:0px;background-color:transparent;background-position:1100505px 1000505px}.x-nbr .x-form-invalid-tip-default-tl,.x-nbr .x-form-invalid-tip-default-bl,.x-nbr .x-form-invalid-tip-default-tr,.x-nbr .x-form-invalid-tip-default-br,.x-nbr .x-form-invalid-tip-default-tc,.x-nbr .x-form-invalid-tip-default-bc,.x-nbr .x-form-invalid-tip-default-ml,.x-nbr .x-form-invalid-tip-default-mr{zoom:1;background-image:url('../resources/themes/images/partkeepr/form-invalid-tip/form-invalid-tip-default-corners.gif')}.x-nbr .x-form-invalid-tip-default-ml,.x-nbr .x-form-invalid-tip-default-mr{zoom:1;background-image:url('../resources/themes/images/partkeepr/form-invalid-tip/form-invalid-tip-default-sides.gif');background-position:0 0}.x-nbr .x-form-invalid-tip-default-mc{padding:0 0 0 0}.x-slider{zoom:1}.x-slider-inner{position:relative;left:0;top:0;overflow:visible;zoom:1}.x-slider-focus{position:absolute;left:0;top:0;width:1px;height:1px;line-height:1px;font-size:1px;-moz-outline:0 none;outline:0 none;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:ignore;display:block;overflow:hidden}.x-slider-horz{padding-left:7px;background:transparent no-repeat 0 -24px}.x-slider-horz .x-slider-end{padding-right:7px;zoom:1;background:transparent no-repeat right -46px}.x-slider-horz .x-slider-inner{background:transparent repeat-x 0 -2px;height:18px}.x-slider-horz .x-slider-thumb{width:14px;height:15px;position:absolute;left:0;top:1px;background:transparent no-repeat 0 0}.x-slider-horz .x-slider-thumb-over{background-position:-14px -15px}.x-slider-horz .x-slider-thumb-drag{background-position:-28px -30px}.x-slider-vert{padding-top:7px;background:transparent no-repeat -44px 0}.x-slider-vert .x-slider-end{padding-bottom:7px;zoom:1;background:transparent no-repeat -22px bottom;width:22px}.x-slider-vert .x-slider-inner{background:transparent repeat-y 0 0;width:22px}.x-slider-vert .x-slider-thumb{width:15px;height:14px;position:absolute;left:3px;bottom:0;background:transparent no-repeat 0 0}.x-slider-vert .x-slider-thumb-over{background-position:-15px -14px}.x-slider-vert .x-slider-thumb-drag{background-position:-30px -28px}.x-slider-horz,.x-slider-horz .x-slider-end,.x-slider-horz .x-slider-inner{background-image:url('../resources/themes/images/partkeepr/slider/slider-bg.png')}.x-slider-horz .x-slider-thumb{background-image:url('../resources/themes/images/partkeepr/slider/slider-thumb.png')}.x-slider-vert,.x-slider-vert .x-slider-end,.x-slider-vert .x-slider-inner{background-image:url('../resources/themes/images/partkeepr/slider/slider-v-bg.png')}.x-slider-vert .x-slider-thumb{background-image:url('../resources/themes/images/partkeepr/slider/slider-v-thumb.png')}.x-ie6 .x-slider-horz,.x-ie6 .x-slider-horz .x-slider-end,.x-ie6 .x-slider-horz .x-slider-inner{background-image:url('../resources/themes/images/partkeepr/slider/slider-bg.gif')}.x-ie6 .x-slider-horz .x-slider-thumb{background-image:url('../resources/themes/images/partkeepr/slider/slider-thumb.gif')}.x-ie6 .x-slider-vert,.x-ie6 .x-slider-vert .x-slider-end,.x-ie6 .x-slider-vert .x-slider-inner{background-image:url('../resources/themes/images/partkeepr/slider/slider-v-bg.gif')}.x-ie6 .x-slider-vert .x-slider-thumb{background-image:url('../resources/themes/images/partkeepr/slider/slider-v-thumb.gif')}.x-progress{border-width:1px;border-style:solid;-moz-border-radius:0;-webkit-border-radius:0;-o-border-radius:0;-ms-border-radius:0;-khtml-border-radius:0;border-radius:0;overflow:hidden;height:20px}.x-progress-bar{height:18px;overflow:hidden;position:absolute;width:0;-moz-border-radius:0;-webkit-border-radius:0;-o-border-radius:0;-ms-border-radius:0;-khtml-border-radius:0;border-radius:0;border-right:1px solid;border-top:1px solid}.x-progress-text{overflow:hidden;position:absolute;padding:0 5px;height:18px;font-weight:bold;font-size:11px;line-height:16px;text-align:center}.x-progress-text-back{padding-top:1px}.x-strict .x-progress{height:18px}.x-progress-default{border-color:#8b8b8b}.x-progress-default .x-progress-bar{border-right-color:#8b8b8b;border-top-color:#cacaca;background-image:none;background-color:#a29292;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #c5bbbb), color-stop(50%, #aea0a0), color-stop(51%, #a29292), color-stop(100%, #978484));background-image:-webkit-linear-gradient(top, #c5bbbb,#aea0a0 50%,#a29292 51%,#978484);background-image:-moz-linear-gradient(top, #c5bbbb,#aea0a0 50%,#a29292 51%,#978484);background-image:-o-linear-gradient(top, #c5bbbb,#aea0a0 50%,#a29292 51%,#978484);background-image:-ms-linear-gradient(top, #c5bbbb,#aea0a0 50%,#a29292 51%,#978484);background-image:linear-gradient(top, #c5bbbb,#aea0a0 50%,#a29292 51%,#978484)}.x-progress-default .x-progress-text{color:#fff}.x-progress-default .x-progress-text-back{color:#585858}.x-nlg .x-progress-default .x-progress-bar{background:url('../resources/themes/images/partkeepr/progress/progress-default-bg.gif') repeat-x}.x-toolbar{font-size:11px;border:1px solid;padding:2px 0 2px 2px}.x-toolbar .x-form-item-label{font-size:11px;line-height:15px}.x-toolbar .x-toolbar-item{margin:0 2px 0 0}.x-toolbar .x-toolbar-text{margin-left:4px;margin-right:6px;white-space:nowrap;color:#4c4c4c !important;line-height:16px;font-family:tahoma,arial,verdana,sans-serif;font-size:11px;font-weight:normal}.x-toolbar .x-toolbar-separator{display:block;font-size:1px;overflow:hidden;cursor:default;border:0}.x-toolbar .x-toolbar-separator-horizontal{margin:0 3px 0 2px;height:14px;width:0px;border-left:1px solid #98c8ff;border-right:1px solid #fff}.x-quirks .x-ie .x-toolbar .x-toolbar-separator-horizontal{width:2px}.x-toolbar-footer{background:transparent;border:0px none;margin-top:3px;padding:2px 0 2px 6px}.x-toolbar-footer .x-box-inner{border-width:0}.x-toolbar-footer .x-toolbar-item{margin:0 6px 0 0}.x-toolbar-vertical{padding:2px 2px 0 2px}.x-toolbar-vertical .x-toolbar-item{margin:0 0 2px 0}.x-toolbar-vertical .x-toolbar-text{margin-top:4px;margin-bottom:6px}.x-toolbar-vertical .x-toolbar-separator-vertical{margin:2px 5px 3px 5px;height:0px;width:10px;line-height:0px;border-top:1px solid #98c8ff;border-bottom:1px solid #fff}.x-toolbar-scroller{padding-left:0}.x-toolbar-spacer{width:2px}.x-toolbar-more-icon{background-image:url('../resources/themes/images/partkeepr/toolbar/more.gif') !important;background-position:2px center !important;background-repeat:no-repeat}.x-toolbar-default{border-color:#aaa;background-image:none;background-color:#ddd;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #eaeaea), color-stop(100%, #dddddd));background-image:-webkit-linear-gradient(top, #eaeaea,#dddddd);background-image:-moz-linear-gradient(top, #eaeaea,#dddddd);background-image:-o-linear-gradient(top, #eaeaea,#dddddd);background-image:-ms-linear-gradient(top, #eaeaea,#dddddd);background-image:linear-gradient(top, #eaeaea,#dddddd)}.x-nlg .x-toolbar-default{background-image:url('../resources/themes/images/partkeepr/toolbar/toolbar-default-bg.gif') !important;background-repeat:repeat-x}.x-toolbar-plain{border:0}.x-window{outline:none}.x-window .x-window-wrap{position:relative}.x-window .x-window-wrap .x-window-body{overflow:hidden}.x-window-body{position:relative;border-style:solid}.x-window-maximized .x-window-wrap .x-window-header{-moz-border-radius:0 !important;-webkit-border-radius:0 !important;-o-border-radius:0 !important;-ms-border-radius:0 !important;-khtml-border-radius:0 !important;border-radius:0 !important}.x-window-collapsed .x-window-header-vertical{-moz-border-radius:5px;-webkit-border-radius:5px;-o-border-radius:5px;-ms-border-radius:5px;-khtml-border-radius:5px;border-radius:5px}.x-window-collapsed .x-window-header-horizontal{-moz-border-radius:5px;-webkit-border-radius:5px;-o-border-radius:5px;-ms-border-radius:5px;-khtml-border-radius:5px;border-radius:5px}.x-window-collapsed .x-window-header-left{padding-right:5px !important}.x-window-collapsed .x-window-header-right{padding-left:5px !important}.x-window-collapsed .x-window-header-top{padding-bottom:5px !important}.x-window-collapsed .x-window-header-bottom{padding-top:5px !important}.x-window-header-left .x-vml-base,.x-window-header-right .x-vml-base{left:-3px !important}.x-window-header-text{-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:ignore;cursor:default;white-space:nowrap;display:block}.x-window-default{border-color:#a4a4a4;-moz-border-radius:5px 5px;-webkit-border-radius:5px 5px;-o-border-radius:5px 5px;-ms-border-radius:5px 5px;-khtml-border-radius:5px 5px;border-radius:5px 5px;-moz-box-shadow:#e7e2e1 0 1px 0px 0 inset,#e7e2e1 0 -1px 0px 0 inset,#e7e2e1 -1px 0 0px 0 inset,#e7e2e1 1px 0 0px 0 inset;-webkit-box-shadow:#e7e2e1 0 1px 0px 0 inset,#e7e2e1 0 -1px 0px 0 inset,#e7e2e1 -1px 0 0px 0 inset,#e7e2e1 1px 0 0px 0 inset;-o-box-shadow:#e7e2e1 0 1px 0px 0 inset,#e7e2e1 0 -1px 0px 0 inset,#e7e2e1 -1px 0 0px 0 inset,#e7e2e1 1px 0 0px 0 inset;box-shadow:#e7e2e1 0 1px 0px 0 inset,#e7e2e1 0 -1px 0px 0 inset,#e7e2e1 -1px 0 0px 0 inset,#e7e2e1 1px 0 0px 0 inset}.x-window-default{-moz-border-radius-topleft:5px;-webkit-border-top-left-radius:5px;-o-border-top-left-radius:5px;-ms-border-top-left-radius:5px;-khtml-border-top-left-radius:5px;border-top-left-radius:5px;-moz-border-radius-topright:5px;-webkit-border-top-right-radius:5px;-o-border-top-right-radius:5px;-ms-border-top-right-radius:5px;-khtml-border-top-right-radius:5px;border-top-right-radius:5px;-moz-border-radius-bottomright:5px;-webkit-border-bottom-right-radius:5px;-o-border-bottom-right-radius:5px;-ms-border-bottom-right-radius:5px;-khtml-border-bottom-right-radius:5px;border-bottom-right-radius:5px;-moz-border-radius-bottomleft:5px;-webkit-border-bottom-left-radius:5px;-o-border-bottom-left-radius:5px;-ms-border-bottom-left-radius:5px;-khtml-border-bottom-left-radius:5px;border-bottom-left-radius:5px;padding:4px 4px 4px 4px;border-width:1px;border-style:solid;background-color:#cbcbcb}.x-nlg .x-window-default-mc{background-color:#cbcbcb}.x-nbr .x-window-default{padding:0 !important;border-width:0 !important;-moz-border-radius:0px;-webkit-border-radius:0px;-o-border-radius:0px;-ms-border-radius:0px;-khtml-border-radius:0px;border-radius:0px;background-color:transparent;background-position:1000505px 1000505px}.x-nbr .x-window-default-tl,.x-nbr .x-window-default-bl,.x-nbr .x-window-default-tr,.x-nbr .x-window-default-br,.x-nbr .x-window-default-tc,.x-nbr .x-window-default-bc,.x-nbr .x-window-default-ml,.x-nbr .x-window-default-mr{zoom:1;background-image:url('../resources/themes/images/partkeepr/window/window-default-corners.gif')}.x-nbr .x-window-default-ml,.x-nbr .x-window-default-mr{zoom:1;background-image:url('../resources/themes/images/partkeepr/window/window-default-sides.gif');background-position:0 0;background-repeat:repeat-y}.x-nbr .x-window-default-mc{padding:0 0 0 0}.x-window-body-default{border-color:#b7abab;border-width:1px;background:#dbdbdb;color:#000}.x-window-header-default{border-color:#a4a4a4;zoom:1}.x-window-header-text-default{font-weight:bold;line-height:16px;font-family:tahoma,arial,verdana,sans-serif;font-size:11px}.x-window-header-default-top{-moz-border-radius-topleft:5px;-webkit-border-top-left-radius:5px;-o-border-top-left-radius:5px;-ms-border-top-left-radius:5px;-khtml-border-top-left-radius:5px;border-top-left-radius:5px;-moz-border-radius-topright:5px;-webkit-border-top-right-radius:5px;-o-border-top-right-radius:5px;-ms-border-top-right-radius:5px;-khtml-border-top-right-radius:5px;border-top-right-radius:5px;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;-o-border-bottom-right-radius:0;-ms-border-bottom-right-radius:0;-khtml-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;-o-border-bottom-left-radius:0;-ms-border-bottom-left-radius:0;-khtml-border-bottom-left-radius:0;border-bottom-left-radius:0;padding:5px 5px 0 5px;border-width:1px;border-style:solid;background-color:#cbcbcb}.x-nlg .x-window-header-default-top-mc{background-color:#cbcbcb}.x-nbr .x-window-header-default-top{padding:0 !important;border-width:0 !important;-moz-border-radius:0px;-webkit-border-radius:0px;-o-border-radius:0px;-ms-border-radius:0px;-khtml-border-radius:0px;border-radius:0px;background-color:transparent;background-position:1000505px 1000000px}.x-nbr .x-window-header-default-top-tl,.x-nbr .x-window-header-default-top-bl,.x-nbr .x-window-header-default-top-tr,.x-nbr .x-window-header-default-top-br,.x-nbr .x-window-header-default-top-tc,.x-nbr .x-window-header-default-top-bc,.x-nbr .x-window-header-default-top-ml,.x-nbr .x-window-header-default-top-mr{zoom:1;background-image:url('../resources/themes/images/partkeepr/window-header/window-header-default-top-corners.gif')}.x-nbr .x-window-header-default-top-ml,.x-nbr .x-window-header-default-top-mr{zoom:1;background-image:url('../resources/themes/images/partkeepr/window-header/window-header-default-top-sides.gif');background-position:0 0;background-repeat:repeat-y}.x-nbr .x-window-header-default-top-mc{padding:0px 0px 0 0px}.x-window-header-default-right{-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;-o-border-top-left-radius:0;-ms-border-top-left-radius:0;-khtml-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:5px;-webkit-border-top-right-radius:5px;-o-border-top-right-radius:5px;-ms-border-top-right-radius:5px;-khtml-border-top-right-radius:5px;border-top-right-radius:5px;-moz-border-radius-bottomright:5px;-webkit-border-bottom-right-radius:5px;-o-border-bottom-right-radius:5px;-ms-border-bottom-right-radius:5px;-khtml-border-bottom-right-radius:5px;border-bottom-right-radius:5px;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;-o-border-bottom-left-radius:0;-ms-border-bottom-left-radius:0;-khtml-border-bottom-left-radius:0;border-bottom-left-radius:0;padding:5px 5px 5px 0;border-width:1px;border-style:solid;background-color:#cbcbcb}.x-nlg .x-window-header-default-right-mc{background-color:#cbcbcb}.x-nbr .x-window-header-default-right{padding:0 !important;border-width:0 !important;-moz-border-radius:0px;-webkit-border-radius:0px;-o-border-radius:0px;-ms-border-radius:0px;-khtml-border-radius:0px;border-radius:0px;background-color:transparent;background-position:1000005px 1000500px}.x-nbr .x-window-header-default-right-tl,.x-nbr .x-window-header-default-right-bl,.x-nbr .x-window-header-default-right-tr,.x-nbr .x-window-header-default-right-br,.x-nbr .x-window-header-default-right-tc,.x-nbr .x-window-header-default-right-bc,.x-nbr .x-window-header-default-right-ml,.x-nbr .x-window-header-default-right-mr{zoom:1;background-image:url('../resources/themes/images/partkeepr/window-header/window-header-default-right-corners.gif')}.x-nbr .x-window-header-default-right-ml,.x-nbr .x-window-header-default-right-mr{zoom:1;background-image:url('../resources/themes/images/partkeepr/window-header/window-header-default-right-sides.gif');background-position:0 0;background-repeat:repeat-y}.x-nbr .x-window-header-default-right-mc{padding:0px 0px 0px 0}.x-window-header-default-bottom{-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;-o-border-top-left-radius:0;-ms-border-top-left-radius:0;-khtml-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;-o-border-top-right-radius:0;-ms-border-top-right-radius:0;-khtml-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomright:5px;-webkit-border-bottom-right-radius:5px;-o-border-bottom-right-radius:5px;-ms-border-bottom-right-radius:5px;-khtml-border-bottom-right-radius:5px;border-bottom-right-radius:5px;-moz-border-radius-bottomleft:5px;-webkit-border-bottom-left-radius:5px;-o-border-bottom-left-radius:5px;-ms-border-bottom-left-radius:5px;-khtml-border-bottom-left-radius:5px;border-bottom-left-radius:5px;padding:0 5px 5px 5px;border-width:1px;border-style:solid;background-color:#cbcbcb}.x-nlg .x-window-header-default-bottom-mc{background-color:#cbcbcb}.x-nbr .x-window-header-default-bottom{padding:0 !important;border-width:0 !important;-moz-border-radius:0px;-webkit-border-radius:0px;-o-border-radius:0px;-ms-border-radius:0px;-khtml-border-radius:0px;border-radius:0px;background-color:transparent;background-position:1000000px 1000505px}.x-nbr .x-window-header-default-bottom-tl,.x-nbr .x-window-header-default-bottom-bl,.x-nbr .x-window-header-default-bottom-tr,.x-nbr .x-window-header-default-bottom-br,.x-nbr .x-window-header-default-bottom-tc,.x-nbr .x-window-header-default-bottom-bc,.x-nbr .x-window-header-default-bottom-ml,.x-nbr .x-window-header-default-bottom-mr{zoom:1;background-image:url('../resources/themes/images/partkeepr/window-header/window-header-default-bottom-corners.gif')}.x-nbr .x-window-header-default-bottom-ml,.x-nbr .x-window-header-default-bottom-mr{zoom:1;background-image:url('../resources/themes/images/partkeepr/window-header/window-header-default-bottom-sides.gif');background-position:0 0;background-repeat:repeat-y}.x-nbr .x-window-header-default-bottom-mc{padding:0 0px 0px 0px}.x-window-header-default-left{-moz-border-radius-topleft:5px;-webkit-border-top-left-radius:5px;-o-border-top-left-radius:5px;-ms-border-top-left-radius:5px;-khtml-border-top-left-radius:5px;border-top-left-radius:5px;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;-o-border-top-right-radius:0;-ms-border-top-right-radius:0;-khtml-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;-o-border-bottom-right-radius:0;-ms-border-bottom-right-radius:0;-khtml-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomleft:5px;-webkit-border-bottom-left-radius:5px;-o-border-bottom-left-radius:5px;-ms-border-bottom-left-radius:5px;-khtml-border-bottom-left-radius:5px;border-bottom-left-radius:5px;padding:5px 0px 5px 5px;border-width:1px;border-style:solid;background-color:#cbcbcb}.x-nlg .x-window-header-default-left-mc{background-color:#cbcbcb}.x-nbr .x-window-header-default-left{padding:0 !important;border-width:0 !important;-moz-border-radius:0px;-webkit-border-radius:0px;-o-border-radius:0px;-ms-border-radius:0px;-khtml-border-radius:0px;border-radius:0px;background-color:transparent;background-position:1000500px 1000005px}.x-nbr .x-window-header-default-left-tl,.x-nbr .x-window-header-default-left-bl,.x-nbr .x-window-header-default-left-tr,.x-nbr .x-window-header-default-left-br,.x-nbr .x-window-header-default-left-tc,.x-nbr .x-window-header-default-left-bc,.x-nbr .x-window-header-default-left-ml,.x-nbr .x-window-header-default-left-mr{zoom:1;background-image:url('../resources/themes/images/partkeepr/window-header/window-header-default-left-corners.gif')}.x-nbr .x-window-header-default-left-ml,.x-nbr .x-window-header-default-left-mr{zoom:1;background-image:url('../resources/themes/images/partkeepr/window-header/window-header-default-left-sides.gif');background-position:0 0;background-repeat:repeat-y}.x-nbr .x-window-header-default-left-mc{padding:0px 0px 0px 0px}.x-window-header-default-top{-moz-box-shadow:#e7e2e1 0 1px 0px 0 inset,#e7e2e1 -1px 0 0px 0 inset,#e7e2e1 1px 0 0px 0 inset;-webkit-box-shadow:#e7e2e1 0 1px 0px 0 inset,#e7e2e1 -1px 0 0px 0 inset,#e7e2e1 1px 0 0px 0 inset;-o-box-shadow:#e7e2e1 0 1px 0px 0 inset,#e7e2e1 -1px 0 0px 0 inset,#e7e2e1 1px 0 0px 0 inset;box-shadow:#e7e2e1 0 1px 0px 0 inset,#e7e2e1 -1px 0 0px 0 inset,#e7e2e1 1px 0 0px 0 inset}.x-window-header-default-right{-moz-box-shadow:#e7e2e1 0 1px 0px 0 inset,#e7e2e1 0 -1px 0px 0 inset,#e7e2e1 -1px 0 0px 0 inset;-webkit-box-shadow:#e7e2e1 0 1px 0px 0 inset,#e7e2e1 0 -1px 0px 0 inset,#e7e2e1 -1px 0 0px 0 inset;-o-box-shadow:#e7e2e1 0 1px 0px 0 inset,#e7e2e1 0 -1px 0px 0 inset,#e7e2e1 -1px 0 0px 0 inset;box-shadow:#e7e2e1 0 1px 0px 0 inset,#e7e2e1 0 -1px 0px 0 inset,#e7e2e1 -1px 0 0px 0 inset}.x-window-header-default-bottom{-moz-box-shadow:0,#e7e2e1 0 -1px 0px 0 inset,#e7e2e1 -1px 0 0px 0 inset,#e7e2e1 1px 0 0px 0 inset;-webkit-box-shadow:0,#e7e2e1 0 -1px 0px 0 inset,#e7e2e1 -1px 0 0px 0 inset,#e7e2e1 1px 0 0px 0 inset;-o-box-shadow:0,#e7e2e1 0 -1px 0px 0 inset,#e7e2e1 -1px 0 0px 0 inset,#e7e2e1 1px 0 0px 0 inset;box-shadow:0,#e7e2e1 0 -1px 0px 0 inset,#e7e2e1 -1px 0 0px 0 inset,#e7e2e1 1px 0 0px 0 inset}.x-window-header-default-left{-moz-box-shadow:#e7e2e1 0 1px 0px 0 inset,#e7e2e1 0 -1px 0px 0 inset,#e7e2e1 1px 0 0px 0 inset;-webkit-box-shadow:#e7e2e1 0 1px 0px 0 inset,#e7e2e1 0 -1px 0px 0 inset,#e7e2e1 1px 0 0px 0 inset;-o-box-shadow:#e7e2e1 0 1px 0px 0 inset,#e7e2e1 0 -1px 0px 0 inset,#e7e2e1 1px 0 0px 0 inset;box-shadow:#e7e2e1 0 1px 0px 0 inset,#e7e2e1 0 -1px 0px 0 inset,#e7e2e1 1px 0 0px 0 inset}.x-window-body-plain{background:transparent}.x-message-box .x-window-body{background-color:#cbcbcb;border:none}.x-message-box .ext-mb-textarea{margin-top:4px}.x-message-box .x-progress-wrap{margin-top:4px}.x-message-box .ext-mb-icon{width:47px;height:32px}.x-message-box .ext-mb-info,.x-message-box .ext-mb-warning,.x-message-box .ext-mb-question,.x-message-box .ext-mb-error{background:transparent no-repeat top left}.ext-gecko2 .ext-mb-fix-cursor{overflow:auto}.x-message-box .x-msg-box-wait{background-image:url('../resources/themes/images/partkeepr/shared/blue-loading.gif')}.x-message-box .ext-mb-info{background-image:url('../resources/themes/images/partkeepr/shared/icon-info.gif')}.x-message-box .ext-mb-warning{background-image:url('../resources/themes/images/partkeepr/shared/icon-warning.gif')}.x-message-box .ext-mb-question{background-image:url('../resources/themes/images/partkeepr/shared/icon-question.gif')}.x-message-box .ext-mb-error{background-image:url('../resources/themes/images/partkeepr/shared/icon-error.gif')}.x-tab-bar{position:relative;background-color:transparent;background-image:none;background-color:#cecece;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #dad9d9), color-stop(100%, #cecece));background-image:-webkit-linear-gradient(top, #dad9d9,#cecece);background-image:-moz-linear-gradient(top, #dad9d9,#cecece);background-image:-o-linear-gradient(top, #dad9d9,#cecece);background-image:-ms-linear-gradient(top, #dad9d9,#cecece);background-image:linear-gradient(top, #dad9d9,#cecece);font-size:11px}.x-nlg .x-tab-bar{background-image:url('../resources/themes/images/partkeepr/tab-bar/tab-bar-bg.gif')}.x-tab-bar-default-plain,.x-nlg .x-tab-bar-default-plain{background:transparent none}.x-tab-bar-body{border-style:solid;border-color:#aaa;position:relative;z-index:2;zoom:1}.x-tab-bar-top .x-tab-bar-body{height:23;border-width:1px 1px 0;padding:1px 0 3px}.x-tab-bar-top .x-tab-bar-strip{top:25px;border-width:1px 1px 0;height:2px}.x-border-box .x-tab-bar-top .x-tab-bar-body{height:28px}.x-border-box .x-tab-bar-top .x-tab-bar-strip{height:3px}.x-tab-bar-top .x-tab-bar-body-default-plain{height:23;border-width:0;padding:0 0 3px}.x-tab-bar-top .x-tab-bar-strip-default-plain{top:23;border-width:1px 1px 0 1px;height:2px}.x-border-box .x-tab-bar-top .x-tab-bar-body-default-plain{height:26px}.x-border-box .x-tab-bar-top .x-tab-bar-strip-default-plain{height:3px}.x-tab-bar-bottom .x-tab-bar-body{height:23;border-width:0 1px 1px;padding:3px 0 1px}.x-tab-bar-bottom .x-tab-bar-body .x-box-inner{position:relative;top:-1px}.x-tab-bar-bottom .x-tab-bar-body .x-box-scroller,.x-tab-bar-bottom .x-tab-bar-body .x-box-scroller-left,.x-tab-bar-bottom .x-tab-bar-body .x-box-scroller-right{height:25px}.x-tab-bar-bottom .x-tab-bar-strip{top:0;border-width:0 1px 1px 1px;height:2px}.x-border-box .x-tab-bar-bottom .x-tab-bar-body{height:28px}.x-border-box .x-tab-bar-bottom .x-tab-bar-strip{height:3px}.x-tab-bar-bottom .x-tab-bar-body-default-plain{height:23;border-width:0;padding:3px 0 0}.x-tab-bar-bottom .x-tab-bar-body-default-plain .x-box-inner{position:relative;top:-1px}.x-tab-bar-bottom .x-tab-bar-body-default-plain .x-box-scroller,.x-tab-bar-bottom .x-tab-bar-body-default-plain .x-box-scroller-left,.x-tab-bar-bottom .x-tab-bar-body-default-plain .x-box-scroller-right{height:24px}.x-tab-bar-bottom .x-tab-bar-strip-default-plain{top:0;border-width:0 1px 1px 1px;height:2px}.x-border-box .x-tab-bar-bottom .x-tab-bar-body-default-plain{height:26px}.x-border-box .x-tab-bar-bottom .x-tab-bar-strip-default-plain{height:3px}.x-tab-bar-strip-default,.x-tab-bar-strip-default-plain{font-size:0;line-height:0;position:absolute;z-index:1;border-style:solid;overflow:hidden;border-color:#aaa;background-color:#c7c7c7;zoom:1}.x-tab-default-top{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;-o-border-top-left-radius:4px;-ms-border-top-left-radius:4px;-khtml-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;-o-border-top-right-radius:4px;-ms-border-top-right-radius:4px;-khtml-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;-o-border-bottom-right-radius:0;-ms-border-bottom-right-radius:0;-khtml-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;-o-border-bottom-left-radius:0;-ms-border-bottom-left-radius:0;-khtml-border-bottom-left-radius:0;border-bottom-left-radius:0;padding:3px 3px 0 3px;border-width:1px 1px 0 1px;border-style:solid;background-image:none;background-color:#eaeaea;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #dddddd), color-stop(25%, #e4e4e4), color-stop(45%, #eaeaea));background-image:-webkit-linear-gradient(top, #dddddd,#e4e4e4 25%,#eaeaea 45%);background-image:-moz-linear-gradient(top, #dddddd,#e4e4e4 25%,#eaeaea 45%);background-image:-o-linear-gradient(top, #dddddd,#e4e4e4 25%,#eaeaea 45%);background-image:-ms-linear-gradient(top, #dddddd,#e4e4e4 25%,#eaeaea 45%);background-image:linear-gradient(top, #dddddd,#e4e4e4 25%,#eaeaea 45%)}.x-nlg .x-tab-default-top-mc{background-image:url('../resources/themes/images/partkeepr/tab/tab-default-top-bg.gif');background-color:#eaeaea}.x-nbr .x-tab-default-top{padding:0 !important;border-width:0 !important;-moz-border-radius:0px;-webkit-border-radius:0px;-o-border-radius:0px;-ms-border-radius:0px;-khtml-border-radius:0px;border-radius:0px;background-color:transparent;background-position:1100404px 1000000px}.x-nbr .x-tab-default-top-tl,.x-nbr .x-tab-default-top-bl,.x-nbr .x-tab-default-top-tr,.x-nbr .x-tab-default-top-br,.x-nbr .x-tab-default-top-tc,.x-nbr .x-tab-default-top-bc,.x-nbr .x-tab-default-top-ml,.x-nbr .x-tab-default-top-mr{zoom:1;background-image:url('../resources/themes/images/partkeepr/tab/tab-default-top-corners.gif')}.x-nbr .x-tab-default-top-ml,.x-nbr .x-tab-default-top-mr{zoom:1;background-image:url('../resources/themes/images/partkeepr/tab/tab-default-top-sides.gif');background-position:0 0}.x-nbr .x-tab-default-top-mc{padding:0 0 0 0}.x-tab-default-bottom{-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;-o-border-top-left-radius:0;-ms-border-top-left-radius:0;-khtml-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;-o-border-top-right-radius:0;-ms-border-top-right-radius:0;-khtml-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;-o-border-bottom-right-radius:4px;-ms-border-bottom-right-radius:4px;-khtml-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;-o-border-bottom-left-radius:4px;-ms-border-bottom-left-radius:4px;-khtml-border-bottom-left-radius:4px;border-bottom-left-radius:4px;padding:0 3px 3px 3px;border-width:0 1px 1px 1px;border-style:solid;background-image:none;background-color:#eaeaea;background-image:-webkit-gradient(linear, 50% 100%, 50% 0%, color-stop(0%, #dddddd), color-stop(25%, #e4e4e4), color-stop(45%, #eaeaea));background-image:-webkit-linear-gradient(bottom, #dddddd,#e4e4e4 25%,#eaeaea 45%);background-image:-moz-linear-gradient(bottom, #dddddd,#e4e4e4 25%,#eaeaea 45%);background-image:-o-linear-gradient(bottom, #dddddd,#e4e4e4 25%,#eaeaea 45%);background-image:-ms-linear-gradient(bottom, #dddddd,#e4e4e4 25%,#eaeaea 45%);background-image:linear-gradient(bottom, #dddddd,#e4e4e4 25%,#eaeaea 45%)}.x-nlg .x-tab-default-bottom-mc{background-image:url('../resources/themes/images/partkeepr/tab/tab-default-bottom-bg.gif');background-color:#eaeaea}.x-nbr .x-tab-default-bottom{padding:0 !important;border-width:0 !important;-moz-border-radius:0px;-webkit-border-radius:0px;-o-border-radius:0px;-ms-border-radius:0px;-khtml-border-radius:0px;border-radius:0px;background-color:transparent;background-position:1100000px 1000404px}.x-nbr .x-tab-default-bottom-tl,.x-nbr .x-tab-default-bottom-bl,.x-nbr .x-tab-default-bottom-tr,.x-nbr .x-tab-default-bottom-br,.x-nbr .x-tab-default-bottom-tc,.x-nbr .x-tab-default-bottom-bc,.x-nbr .x-tab-default-bottom-ml,.x-nbr .x-tab-default-bottom-mr{zoom:1;background-image:url('../resources/themes/images/partkeepr/tab/tab-default-bottom-corners.gif')}.x-nbr .x-tab-default-bottom-ml,.x-nbr .x-tab-default-bottom-mr{zoom:1;background-image:url('../resources/themes/images/partkeepr/tab/tab-default-bottom-sides.gif');background-position:0 0}.x-nbr .x-tab-default-bottom-mc{padding:0 0 0 0}.x-tab{z-index:1;margin:0 0 0 2px;display:inline-block;zoom:1;*display:inline;white-space:nowrap;height:23;border-color:#b5b5b5;cursor:pointer;cursor:hand}.x-tab *{cursor:pointer;cursor:hand}.x-tab em{display:block;padding:0 6px;line-height:1px}.x-tab button{background:none;border:0;padding:0;margin:0;-webkit-appearance:none;font-size:11px;font-weight:bold;color:#6f6f6f;outline:0 none;overflow:hidden;overflow-x:visible;-o-text-overflow:ellipsis;text-overflow:ellipsis}.x-tab button::-moz-focus-inner{border:0;padding:0}.x-tab button .x-tab-inner{background-color:transparent;background-repeat:no-repeat;background-position:0 -2px;display:block;text-align:center;white-space:nowrap}.x-tab img{display:none}.x-border-box .x-tab-default-top{height:24px}.x-border-box .x-tab-default-bottom{height:24px}* html .x-ie .x-tab button{width:1px}.x-strict .x-ie6 .x-tab .x-frame-mc,.x-strict .x-ie7 .x-tab .x-frame-mc{height:100%}.x-ie .x-tab-active button:active{position:relative;top:-1px;left:-1px}.x-tab-default-top{-moz-box-shadow:#fff 0 1px 0px 0 inset,#fff -1px 0 0px 0 inset,#fff 1px 0 0px 0 inset;-webkit-box-shadow:#fff 0 1px 0px 0 inset,#fff -1px 0 0px 0 inset,#fff 1px 0 0px 0 inset;-o-box-shadow:#fff 0 1px 0px 0 inset,#fff -1px 0 0px 0 inset,#fff 1px 0 0px 0 inset;box-shadow:#fff 0 1px 0px 0 inset,#fff -1px 0 0px 0 inset,#fff 1px 0 0px 0 inset;border-bottom:1px solid #aaa !important}.x-tab-default-top em{padding-bottom:3px}.x-tab-default-top button,.x-tab-default-top .x-tab-inner{height:16px;line-height:16px}.x-nbr .x-tab-default-top{border-bottom-width:1px !important}.x-tab-default-top-active{border-bottom-color:#c7c7c7 !important}.x-tab-default-bottom{-moz-box-shadow:0 -1px 0 0 #fff inset,-1px 0 0 0 #fff inset,1px 0 0 0 #fff inset;-webkit-box-shadow:0 -1px 0 0 #fff inset,-1px 0 0 0 #fff inset,1px 0 0 0 #fff inset;-o-box-shadow:0 -1px 0 0 #fff inset,-1px 0 0 0 #fff inset,1px 0 0 0 #fff inset;box-shadow:0 -1px 0 0 #fff inset,-1px 0 0 0 #fff inset,1px 0 0 0 #fff inset;border-top:1px solid #aaa !important}.x-tab-default-bottom em{padding-top:3px}.x-tab-default-bottom button,.x-tab-default-bottom .x-tab-inner{height:16px;line-height:16px}.x-nbr .x-tab-default-bottom{border-top-width:1px !important}.x-tab-default-bottom-active{border-top-color:#c7c7c7 !important}.x-tab-default-disabled{cursor:default;border-color:#c9c2c2;background-image:none;background-color:#e3d9d9;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #e3d9d9), color-stop(100%, #eedddd));background-image:-webkit-linear-gradient(top, #e3d9d9,#eedddd);background-image:-moz-linear-gradient(top, #e3d9d9,#eedddd);background-image:-o-linear-gradient(top, #e3d9d9,#eedddd);background-image:-ms-linear-gradient(top, #e3d9d9,#eedddd);background-image:linear-gradient(top, #e3d9d9,#eedddd)}.x-tab-default-disabled *{cursor:default}.x-tab-default-disabled button{color:#c3b3b3 !important}.x-tab-icon-text-left .x-tab-inner{padding-left:20px}.x-tab button,.x-tab a{position:relative}.x-tab button .x-tab-icon,.x-tab a .x-tab-icon{position:absolute;background-repeat:no-repeat;top:0;left:0;right:auto;bottom:0;width:18px;height:18px}.x-tab-top-over{background-image:none;background-color:#f2eeee;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #e7e6e6), color-stop(25%, #eeeaea), color-stop(45%, #f2eeee));background-image:-webkit-linear-gradient(top, #e7e6e6,#eeeaea 25%,#f2eeee 45%);background-image:-moz-linear-gradient(top, #e7e6e6,#eeeaea 25%,#f2eeee 45%);background-image:-o-linear-gradient(top, #e7e6e6,#eeeaea 25%,#f2eeee 45%);background-image:-ms-linear-gradient(top, #e7e6e6,#eeeaea 25%,#f2eeee 45%);background-image:linear-gradient(top, #e7e6e6,#eeeaea 25%,#f2eeee 45%)}.x-tab-bottom-over{background-image:none;background-color:#f2eeee;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #e7e6e6), color-stop(25%, #eeeaea), color-stop(45%, #f2eeee));background-image:-webkit-linear-gradient(top, #e7e6e6,#eeeaea 25%,#f2eeee 45%);background-image:-moz-linear-gradient(top, #e7e6e6,#eeeaea 25%,#f2eeee 45%);background-image:-o-linear-gradient(top, #e7e6e6,#eeeaea 25%,#f2eeee 45%);background-image:-ms-linear-gradient(top, #e7e6e6,#eeeaea 25%,#f2eeee 45%);background-image:linear-gradient(top, #e7e6e6,#eeeaea 25%,#f2eeee 45%)}.x-tab-active{z-index:3;background-image:none;background-color:red}.x-tab-active button{color:#333;color:white;text-shadow:0 0 1px #000}.x-tab-top-active{background-image:none;background-color:#eaeaea;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #2aaad3), color-stop(100%, #2067a3));background-image:-webkit-linear-gradient(top, #2aaad3,#2067a3);background-image:-moz-linear-gradient(top, #2aaad3,#2067a3);background-image:-o-linear-gradient(top, #2aaad3,#2067a3);background-image:-ms-linear-gradient(top, #2aaad3,#2067a3);background-image:linear-gradient(top, #2aaad3,#2067a3)}.x-tab-bottom-active{background-image:none;background-color:#eaeaea;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #2aaad3), color-stop(100%, #2067a3));background-image:-webkit-linear-gradient(top, #2aaad3,#2067a3);background-image:-moz-linear-gradient(top, #2aaad3,#2067a3);background-image:-o-linear-gradient(top, #2aaad3,#2067a3);background-image:-ms-linear-gradient(top, #2aaad3,#2067a3);background-image:linear-gradient(top, #2aaad3,#2067a3)}.x-tab-disabled{border-color:#c9c2c2}.x-tab-disabled button{color:#c3b3b3}.x-tab-top-disabled{background-image:none;background:transparent;background-image:none;background-color:#e3d9d9;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #e3d9d9), color-stop(100%, #eedddd));background-image:-webkit-linear-gradient(top, #e3d9d9,#eedddd);background-image:-moz-linear-gradient(top, #e3d9d9,#eedddd);background-image:-o-linear-gradient(top, #e3d9d9,#eedddd);background-image:-ms-linear-gradient(top, #e3d9d9,#eedddd);background-image:linear-gradient(top, #e3d9d9,#eedddd)}.x-tab-bottom-disabled{background-image:none;background:transparent;background-image:none;background-color:#e3d9d9;background-image:-webkit-gradient(linear, 50% 100%, 50% 0%, color-stop(0%, #e3d9d9), color-stop(100%, #eedddd));background-image:-webkit-linear-gradient(bottom, #e3d9d9,#eedddd);background-image:-moz-linear-gradient(bottom, #e3d9d9,#eedddd);background-image:-o-linear-gradient(bottom, #e3d9d9,#eedddd);background-image:-ms-linear-gradient(bottom, #e3d9d9,#eedddd);background-image:linear-gradient(bottom, #e3d9d9,#eedddd)}.x-nlg .x-tab-top{background-image:url('../resources/themes/images/partkeepr/tab/tab-default-top-bg.gif')}.x-nlg .x-tab-bottom{background-image:url('../resources/themes/images/partkeepr/tab/tab-default-bottom-bg.gif')}.x-nlg .x-tab-top-over{background-image:url('../resources/themes/images/partkeepr/tab/tab-default-top-over-bg.gif')}.x-nlg .x-tab-bottom-over{background-image:url('../resources/themes/images/partkeepr/tab/tab-default-bottom-over-bg.gif')}.x-nlg .x-tab-top-active{background-image:url('../resources/themes/images/partkeepr/tab/tab-default-top-active-bg.gif')}.x-nlg .x-tab-bottom-active{background-image:url('../resources/themes/images/partkeepr/tab/tab-default-bottom-active-bg.gif')}.x-nlg .x-tab-top-disabled{background-image:url('../resources/themes/images/partkeepr/tab/tab-default-top-disabled-bg.gif') !important}.x-nlg .x-tab-bottom-disabled{background-image:url('../resources/themes/images/partkeepr/tab/tab-default-bottom-disabled-bg.gif') !important}.x-tab-closable em{padding-right:14px}.x-tab-close-btn{position:absolute !important;top:3px;right:3px;width:11px;height:11px;font-size:0;line-height:0;text-indent:-999px;background:url('../resources/themes/images/partkeepr/tab/tab-default-close.gif') no-repeat;filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=60);opacity:0.6}.x-tab-close-btn:hover{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);opacity:1}.x-nbr .x-tab-top-over .x-frame-tl,.x-nbr .x-tab-top-over .x-frame-bl,.x-nbr .x-tab-top-over .x-frame-tr,.x-nbr .x-tab-top-over .x-frame-br,.x-nbr .x-tab-top-over .x-frame-tc,.x-nbr .x-tab-top-over .x-frame-bc{background-image:url('../resources/themes/images/partkeepr/tab/tab-default-top-over-corners.gif')}.x-nbr .x-tab-top-over .x-frame-ml,.x-nbr .x-tab-top-over .x-frame-mr{background-image:url('../resources/themes/images/partkeepr/tab/tab-default-top-over-sides.gif')}.x-nbr .x-tab-top-over .x-frame-mc{background-color:#f2eeee;background-repeat:repeat-x;background-image:url('../resources/themes/images/partkeepr/tab/tab-default-top-over-bg.gif')}.x-nbr .x-tab-bottom-over .x-frame-tl,.x-nbr .x-tab-bottom-over .x-frame-bl,.x-nbr .x-tab-bottom-over .x-frame-tr,.x-nbr .x-tab-bottom-over .x-frame-br,.x-nbr .x-tab-bottom-over .x-frame-tc,.x-nbr .x-tab-bottom-over .x-frame-bc{background-image:url('../resources/themes/images/partkeepr/tab/tab-default-bottom-over-corners.gif')}.x-nbr .x-tab-bottom-over .x-frame-ml,.x-nbr .x-tab-bottom-over .x-frame-mr{background-image:url('../resources/themes/images/partkeepr/tab/tab-default-bottom-over-sides.gif')}.x-nbr .x-tab-bottom-over .x-frame-mc{background-color:#f2eeee;background-repeat:repeat-x;background-image:url('../resources/themes/images/partkeepr/tab/tab-default-bottom-over-bg.gif')}.x-nbr .x-tab-top-active .x-frame-tl,.x-nbr .x-tab-top-active .x-frame-bl,.x-nbr .x-tab-top-active .x-frame-tr,.x-nbr .x-tab-top-active .x-frame-br,.x-nbr .x-tab-top-active .x-frame-tc,.x-nbr .x-tab-top-active .x-frame-bc{background-image:url('../resources/themes/images/partkeepr/tab/tab-default-top-active-corners.gif')}.x-nbr .x-tab-top-active .x-frame-ml,.x-nbr .x-tab-top-active .x-frame-mr{background-image:url('../resources/themes/images/partkeepr/tab/tab-default-top-active-sides.gif')}.x-nbr .x-tab-top-active .x-frame-mc{background-color:#eaeaea;background-repeat:repeat-x;background-image:url('../resources/themes/images/partkeepr/tab/tab-default-top-active-bg.gif')}.x-nbr .x-tab-bottom-active .x-frame-tl,.x-nbr .x-tab-bottom-active .x-frame-bl,.x-nbr .x-tab-bottom-active .x-frame-tr,.x-nbr .x-tab-bottom-active .x-frame-br,.x-nbr .x-tab-bottom-active .x-frame-tc,.x-nbr .x-tab-bottom-active .x-frame-bc{background-image:url('../resources/themes/images/partkeepr/tab/tab-default-bottom-active-corners.gif')}.x-nbr .x-tab-bottom-active .x-frame-ml,.x-nbr .x-tab-bottom-active .x-frame-mr{background-image:url('../resources/themes/images/partkeepr/tab/tab-default-bottom-active-sides.gif')}.x-nbr .x-tab-bottom-active .x-frame-mc{background-color:#eaeaea;background-repeat:repeat-x;background-image:url('../resources/themes/images/partkeepr/tab/tab-default-bottom-active-bg.gif')}.x-nbr .x-tab-top-disabled .x-frame-tl,.x-nbr .x-tab-top-disabled .x-frame-bl,.x-nbr .x-tab-top-disabled .x-frame-tr,.x-nbr .x-tab-top-disabled .x-frame-br,.x-nbr .x-tab-top-disabled .x-frame-tc,.x-nbr .x-tab-top-disabled .x-frame-bc{background-image:url('../resources/themes/images/partkeepr/tab/tab-default-top-disabled-corners.gif')}.x-nbr .x-tab-top-disabled .x-frame-ml,.x-nbr .x-tab-top-disabled .x-frame-mr{background-image:url('../resources/themes/images/partkeepr/tab/tab-default-top-disabled-sides.gif')}.x-nbr .x-tab-top-disabled .x-frame-mc{background-repeat:repeat-x;background-image:url('../resources/themes/images/partkeepr/tab/tab-default-top-disabled-bg.gif')}.x-nbr .x-tab-bottom-disabled .x-frame-tl,.x-nbr .x-tab-bottom-disabled .x-frame-bl,.x-nbr .x-tab-bottom-disabled .x-frame-tr,.x-nbr .x-tab-bottom-disabled .x-frame-br,.x-nbr .x-tab-bottom-disabled .x-frame-tc,.x-nbr .x-tab-bottom-disabled .x-frame-bc{background-image:url('../resources/themes/images/partkeepr/tab/tab-default-bottom-disabled-corners.gif')}.x-nbr .x-tab-bottom-disabled .x-frame-ml,.x-nbr .x-tab-bottom-disabled .x-frame-mr{background-image:url('../resources/themes/images/partkeepr/tab/tab-default-bottom-disabled-sides.gif')}.x-nbr .x-tab-bottom-disabled .x-frame-mc{background-repeat:repeat-x;background-image:url('../resources/themes/images/partkeepr/tab/tab-default-bottom-disabled-bg.gif')}.x-tree-no-lines .x-tree-elbow{background-color:transparent}.x-tree-no-lines .x-tree-elbow-end{background-color:transparent}.x-tree-no-lines .x-tree-elbow-line{background-color:transparent}.x-tree-arrows .x-tree-elbow-plus{background:transparent no-repeat 0 0}.x-tree-arrows .x-tree-elbow-end-plus{background:transparent no-repeat 0 0}.x-tree-arrows .x-tree-elbow-end-minus{background:transparent no-repeat -16px 0}.x-tree-arrows .x-tree-elbow-minus{background:transparent no-repeat -16px 0}.x-tree-arrows .x-tree-elbow{background-color:transparent !important}.x-tree-arrows .x-tree-elbow-end{background-color:transparent !important}.x-tree-arrows .x-tree-elbow-line{background-color:transparent !important}.x-tree-arrows .x-tree-expander-over .x-tree-elbow-plus,.x-tree-arrows .x-tree-expander-over .x-tree-elbow-end-plus{background-position:-32px 0}.x-tree-arrows .x-tree-expander-over .x-tree-elbow-minus,.x-tree-arrows .x-tree-expander-over .x-tree-elbow-end-minus{background-position:-48px 0}.x-tree-arrows .x-grid-tree-node-expanded .x-tree-elbow-plus,.x-tree-arrows .x-grid-tree-node-expanded .x-tree-elbow-end-plus{background-position:-16px 0}.x-tree-arrows .x-grid-tree-node-expanded .x-tree-expander-over .x-tree-elbow-plus,.x-tree-arrows .x-grid-tree-node-expanded .x-tree-expander-over .x-tree-elbow-end-plus{background-position:-48px 0}.x-tree-elbow-plus,.x-tree-elbow-minus,.x-tree-elbow-end-plus,.x-tree-elbow-end-minus{cursor:pointer}.x-tree-lines .x-tree-elbow{background-image:url('../resources/themes/images/partkeepr/tree/elbow.gif')}.x-tree-lines .x-tree-elbow-end{background-image:url('../resources/themes/images/partkeepr/tree/elbow-end.gif')}.x-tree-lines .x-tree-elbow-plus{background-image:url('../resources/themes/images/partkeepr/tree/elbow-plus.gif')}.x-tree-lines .x-tree-elbow-end-plus{background-image:url('../resources/themes/images/partkeepr/tree/elbow-end-plus.gif')}.x-tree-lines .x-grid-tree-node-expanded .x-tree-elbow-plus{background-image:url('../resources/themes/images/partkeepr/tree/elbow-minus.gif')}.x-tree-lines .x-grid-tree-node-expanded .x-tree-elbow-end-plus{background-image:url('../resources/themes/images/partkeepr/tree/elbow-end-minus.gif')}.x-tree-lines .x-tree-elbow-line{background-image:url('../resources/themes/images/partkeepr/tree/elbow-line.gif')}.x-tree-no-lines .x-tree-elbow-plus,.x-tree-no-lines .x-tree-elbow-end-plus{background-image:url('../resources/themes/images/partkeepr/tree/elbow-plus-nl.gif')}.x-tree-no-lines .x-grid-tree-node-expanded .x-tree-elbow-plus,.x-tree-no-lines .x-grid-tree-node-expanded .x-tree-elbow-end-plus{background-image:url('../resources/themes/images/partkeepr/tree/elbow-end-minus-nl.gif')}.x-tree-arrows .x-tree-elbow-plus,.x-tree-arrows .x-tree-elbow-minus,.x-tree-arrows .x-tree-elbow-end-plus,.x-tree-arrows .x-tree-elbow-end-minus{background-image:url('../resources/themes/images/partkeepr/tree/arrows.gif')}.x-tree-icon{margin-right:3px}.x-tree-elbow,.x-tree-elbow-end,.x-tree-elbow-plus,.x-tree-elbow-end-plus,.x-tree-elbow-empty,.x-tree-elbow-line{height:18px;width:16px}.x-tree-icon-leaf{width:16px;background-image:url('../resources/themes/images/partkeepr/tree/leaf.gif')}.x-tree-icon-parent{width:16px;background-image:url('../resources/themes/images/partkeepr/tree/folder.gif')}.x-grid-tree-node-expanded .x-tree-icon-parent{background-image:url('../resources/themes/images/partkeepr/tree/folder-open.gif')}.x-grid-rowbody{padding:0}.x-tree-panel .x-grid-cell-inner{padding:0px}.x-tree-panel .x-grid-row .x-grid-cell{border:none}.x-tree-panel .x-grid-row .x-grid-cell-inner{height:18px;line-height:18px;vertical-align:middle;cursor:pointer}.x-tree-panel .x-grid-row .x-grid-cell-inner img{float:left}.x-ie .x-tree-panel .x-grid-row .x-grid-cell-inner{white-space:normal}.x-tree-checkbox{float:left;margin:2px 3px 0 0;display:block;width:13px;height:13px;background:url('../resources/themes/images/partkeepr/form/checkbox.png') no-repeat;overflow:hidden;padding:0;border:0}.x-tree-checkbox::-moz-focus-inner{padding:0;border:0}.x-nbr.x-ie .x-tree-checkbox{font-size:0}.x-tree-checkbox-checked{background-position:0 -13px}.x-tree-panel .x-grid-cell-inner{border-width:0 !important}.x-gecko .x-tree-panel .x-grid-row .x-grid-cell-inner{line-height:16px}.x-tree-drop-ok-append .x-dd-drop-icon{background-image:url('../resources/themes/images/partkeepr/tree/drop-append.gif')}.x-tree-drop-ok-above .x-dd-drop-icon{background-image:url('../resources/themes/images/partkeepr/tree/drop-above.gif')}.x-tree-drop-ok-below .x-dd-drop-icon{background-image:url('../resources/themes/images/partkeepr/tree/drop-below.gif')}.x-tree-drop-ok-between .x-dd-drop-icon{background-image:url('../resources/themes/images/partkeepr/tree/drop-between.gif')}.x-grid-tree-loading .x-tree-icon{background-image:url('../resources/themes/images/partkeepr/tree/loading.gif')}.x-tree-ddindicator{height:1px;border-width:1px 0px 0px;border-style:dotted;border-color:green}.x-grid-tree-loading span{font-style:italic;color:#444444}.x-tree-animator-wrap{overflow:hidden}.x-surface{display:-moz-inline-box;-moz-box-orient:vertical;display:inline-block;vertical-align:middle;*vertical-align:auto}.x-surface{*display:inline}.rvml{behavior:url(#default#VML)}.x-surface tspan{user-select:none;-o-user-select:none;-ms-user-select:none;-moz-user-select:none;-webkit-user-select:none}.x-vml-sprite{position:absolute;left:0;top:0;width:1px;height:1px}.x-vml-group{position:absolute;left:0;top:0;width:1000px;height:1000px}.x-vml-measure-span{position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;display:inline}.x-vml-base{position:relative;top:0;left:0;overflow:hidden;display:inline-block}.x-vml-base{position:relative;top:0;left:0;overflow:hidden;display:inline-block}.x-viewport,.x-viewport body{margin:0;padding:0;border:0 none;overflow:hidden;height:100%}.x-dd-drag-repair .x-dd-drag-ghost{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=60);opacity:0.6}.x-dd-drag-repair .x-dd-drop-icon{display:none}.x-dd-drag-ghost{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=85);opacity:0.85;padding:5px;padding-left:20px;white-space:nowrap;color:#000;font:normal 11px tahoma,arial,verdana,sans-serif;border:1px solid;border-color:#ddd #bbb #bbb #ddd;background-color:#fff}.x-dd-drop-icon{position:absolute;top:3px;left:3px;display:block;width:16px;height:16px;background-color:transparent;background-position:center;background-repeat:no-repeat;z-index:1}.x-view-selector{position:absolute;left:0;top:0;width:0;background-color:#c3daf9;border:1px dotted #3399bb;filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=50);opacity:0.5;zoom:1}.x-dd-drop-nodrop .x-dd-drop-icon{background-image:url('../resources/themes/images/partkeepr/dd/drop-no.gif')}.x-dd-drop-ok .x-dd-drop-icon{background-image:url('../resources/themes/images/partkeepr/dd/drop-yes.gif')}.x-dd-drop-ok-add .x-dd-drop-icon{background-image:url('../resources/themes/images/partkeepr/dd/drop-add.gif')}.x-resizable-handle{position:absolute;z-index:100;font-size:1px;line-height:6px;overflow:hidden;zoom:1;filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=0);opacity:0;background-color:#fff}.x-resizable-handle-east{width:6px;height:100%;right:0;top:0}.x-resizable-over .x-resizable-handle-east{cursor:e-resize}.x-resizable-handle-south{width:100%;height:6px;left:0;bottom:0}.x-resizable-over .x-resizable-handle-south{cursor:s-resize}.x-resizable-handle-west{width:6px;height:100%;left:0;top:0}.x-resizable-over .x-resizable-handle-west{cursor:w-resize}.x-resizable-handle-north{width:100%;height:6px;left:0;top:0}.x-resizable-over .x-resizable-handle-north{cursor:n-resize}.x-resizable-handle-southeast{width:6px;height:6px;right:0;bottom:0;z-index:101}.x-resizable-over .x-resizable-handle-southeast{cursor:se-resize}.x-resizable-handle-northwest{width:6px;height:6px;left:0;top:0;z-index:101}.x-resizable-over .x-resizable-handle-northwest{cursor:nw-resize}.x-resizable-handle-northeast{width:6px;height:6px;right:0;top:0;z-index:101}.x-resizable-over .x-resizable-handle-northeast{cursor:ne-resize}.x-resizable-handle-southwest{width:6px;height:6px;left:0;bottom:0;z-index:101}.x-resizable-over .x-resizable-handle-southwest{cursor:sw-resize}.x-ie .x-resizable-handle-east{margin-right:-1px}.x-ie .x-resizable-handle-south{margin-bottom:-1px}.x-resizable-over .x-resizable-handle,.x-resizable-pinned .x-resizable-handle{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);opacity:1}.x-window .x-window-handle{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=0);opacity:0}.x-window-collapsed .x-window-handle{display:none}.x-resizable-proxy{border:1px dashed #3b5a82;position:absolute;left:0;top:0;overflow:hidden;z-index:50000}.x-resizable-overlay{position:absolute;left:0;top:0;width:100%;height:100%;display:none;z-index:200000;background-color:#fff;filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=0);opacity:0}.x-resizable-over .x-resizable-handle-east,.x-resizable-over .x-resizable-handle-west,.x-resizable-pinned .x-resizable-handle-east,.x-resizable-pinned .x-resizable-handle-west{background-position:left;background-image:url('../resources/themes/images/partkeepr/sizer/e-handle.gif')}.x-resizable-over .x-resizable-handle-south,.x-resizable-over .x-resizable-handle-north,.x-resizable-pinned .x-resizable-handle-south,.x-resizable-pinned .x-resizable-handle-north{background-position:top;background-image:url('../resources/themes/images/partkeepr/sizer/s-handle.gif')}.x-resizable-over .x-resizable-handle-southeast,.x-resizable-pinned .x-resizable-handle-southeast{background-position:top left;background-image:url('../resources/themes/images/partkeepr/sizer/se-handle.gif')}.x-resizable-over .x-resizable-handle-northwest,.x-resizable-pinned .x-resizable-handle-northwest{background-position:bottom right;background-image:url('../resources/themes/images/partkeepr/sizer/nw-handle.gif')}.x-resizable-over .x-resizable-handle-northeast,.x-resizable-pinned .x-resizable-handle-northeast{background-position:bottom left;background-image:url('../resources/themes/images/partkeepr/sizer/ne-handle.gif')}.x-resizable-over .x-resizable-handle-southwest,.x-resizable-pinned .x-resizable-handle-southwest{background-position:top right;background-image:url('../resources/themes/images/partkeepr/sizer/sw-handle.gif')}.x-splitter .x-collapse-el{position:absolute;cursor:pointer;background-color:transparent;background-repeat:no-repeat !important}.x-layout-split-left,.x-layout-split-right{top:50%;margin-top:-17px;width:5px;height:35px}.x-layout-split-top,.x-layout-split-bottom{left:50%;width:35px;height:5px;margin-left:-17px}.x-layout-split-left{background:no-repeat top right;background-image:url('../resources/themes/images/partkeepr/util/splitter/mini-left.gif')}.x-layout-split-right{background:no-repeat top left;background-image:url('../resources/themes/images/partkeepr/util/splitter/mini-right.gif')}.x-layout-split-top{background:no-repeat top left;background-image:url('../resources/themes/images/partkeepr/util/splitter/mini-top.gif')}.x-layout-split-bottom{background:no-repeat top left;background-image:url('../resources/themes/images/partkeepr/util/splitter/mini-bottom.gif')}.x-splitter-collapsed .x-layout-split-left{background:no-repeat top left;background-image:url('../resources/themes/images/partkeepr/util/splitter/mini-right.gif')}.x-splitter-collapsed .x-layout-split-right{background:no-repeat top right;background-image:url('../resources/themes/images/partkeepr/util/splitter/mini-left.gif')}.x-splitter-collapsed .x-layout-split-top{background:no-repeat top left;background-image:url('../resources/themes/images/partkeepr/util/splitter/mini-bottom.gif')}.x-splitter-collapsed .x-layout-split-bottom{background:no-repeat top left;background-image:url('../resources/themes/images/partkeepr/util/splitter/mini-top.gif')}.x-splitter-horizontal{cursor:e-resize;cursor:row-resize;font-size:1px}.x-splitter-vertical{cursor:e-resize;cursor:col-resize;font-size:1px}.x-splitter-collapsed{cursor:default}.x-splitter-active{z-index:4;font-size:1px;background-color:#b4b4b4;filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=80);opacity:0.8}.x-splitter-active .x-collapse-el{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=30);opacity:0.3}.x-proxy-el{position:absolute;background:#b4b4b4;filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=80);opacity:0.8}.x-docked{position:absolute;z-index:1}.x-docked-top{border-bottom-width:0 !important}.x-docked-bottom{border-top-width:0 !important}.x-docked-left{border-right-width:0 !important}.x-docked-right{border-left-width:0 !important}.x-docked-noborder-top{border-top-width:0 !important}.x-docked-noborder-right{border-right-width:0 !important}.x-docked-noborder-bottom{border-bottom-width:0 !important}.x-docked-noborder-left{border-left-width:0 !important}.x-box-inner{overflow:hidden;zoom:1;position:relative;left:0;top:0}.x-box-item{position:absolute !important;left:0;top:0}.x-box-layout-ct,.x-border-layout-ct{overflow:hidden;zoom:1}.x-overflow-hidden{overflow:hidden !important}.x-inline-children > *{display:inline-block !important}.x-abs-layout-item{position:absolute}.x-border-layout-ct{background-color:#dbdbdb}.x-border-region-slide-in{z-index:5}.x-region-collapsed-placeholder{z-index:4}.x-accordion-hd .x-panel-header-text{color:#000;font-weight:normal}.x-accordion-hd{background:#d9e7f8 !important;-moz-box-shadow:inset 0 0 0 0 #d9e7f8;-webkit-box-shadow:inset 0 0 0 0 #d9e7f8;-o-box-shadow:inset 0 0 0 0 #d9e7f8;box-shadow:inset 0 0 0 0 #d9e7f8}.x-accordion-hd .x-tool-collapse-top,.x-accordion-hd .x-tool-collapse-right,.x-accordion-hd .x-tool-collapse-bottom,.x-accordion-hd .x-tool-collapse-left{background-position:0 -255px}.x-accordion-hd .x-tool-expand-top,.x-accordion-hd .x-tool-expand-right,.x-accordion-hd .x-tool-expand-bottom,.x-accordion-hd .x-tool-expand-left{background-position:0 -240px}.x-accordion-hd .x-tool-over .x-tool-collapse-top,.x-accordion-hd .x-tool-over .x-tool-collapse-right,.x-accordion-hd .x-tool-over .x-tool-collapse-bottom,.x-accordion-hd .x-tool-over .x-tool-collapse-left{background-position:-15px -255px}.x-accordion-hd .x-tool-over .x-tool-expand-top,.x-accordion-hd .x-tool-over .x-tool-expand-right,.x-accordion-hd .x-tool-over .x-tool-expand-bottom,.x-accordion-hd .x-tool-over .x-tool-expand-left{background-position:-15px -240px}.x-accordion-hd{border-width:1px 0 1px 0 !important;padding:4px 5px 5px 5px;border-top-color:#e8e8e8 !important}.x-accordion-body{border-width:0 !important}.x-accordion-hd-sibling-expanded{border-top-color:#aaa !important;-moz-box-shadow:inset 0 1px 0 0 #e8e8e8;-webkit-box-shadow:inset 0 1px 0 0 #e8e8e8;-o-box-shadow:inset 0 1px 0 0 #e8e8e8;box-shadow:inset 0 1px 0 0 #e8e8e8}.x-accordion-hd-last-collapsed{border-bottom-color:#d9e7f8 !important}.x-frame-tl,.x-frame-tr,.x-frame-tc,.x-frame-bl,.x-frame-br,.x-frame-bc{overflow:hidden;background-repeat:no-repeat}.x-frame-tc,.x-frame-bc{background-repeat:repeat-x}.x-frame-mc{position:relative;background-repeat:repeat-x;overflow:hidden}.x-box-scroller-left{float:left;height:100%;z-index:5}.x-box-scroller-left .x-toolbar-scroll-left,.x-box-scroller-left .x-tabbar-scroll-left{width:18px;position:relative;cursor:pointer;height:23;background:transparent no-repeat -18px 0;background-image:url('../resources/themes/images/partkeepr/tab-bar/scroll-left.gif')}.x-box-scroller-left .x-toolbar-scroll-left-hover{background-position:0 0}.x-box-scroller-left .x-toolbar-scroll-left-disabled,.x-box-scroller-left .x-tabbar-scroll-left-disabled{background-position:-18px 0;filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=50);opacity:0.5;cursor:default}.x-box-scroller-left .x-toolbar-scroll-left{background-image:url('../resources/themes/images/partkeepr/toolbar/scroll-left.gif');background-position:-14px 0}.x-box-scroller-left .x-toolbar-scroll-left-hover{background-position:0 0}.x-box-scroller-left .x-toolbar-scroll-left-disabled{background-position:-14px 0}.x-box-scroller-left .x-toolbar-scroll-left{width:14px;height:22px;border-bottom:1px solid #8db2e3}.x-horizontal-box-overflow-body{float:left}.x-box-scroller-right{float:right;height:100%;z-index:5}.x-box-scroller-right .x-toolbar-scroll-right,.x-box-scroller-right .x-tabbar-scroll-right{width:18px;position:relative;cursor:pointer;height:23;background:transparent no-repeat 0 0;background-image:url('../resources/themes/images/partkeepr/tab-bar/scroll-right.gif')}.x-box-scroller-right .x-toolbar-scroll-right-hover{background-position:-18px 0}.x-box-scroller-right .x-toolbar-scroll-right-disabled,.x-box-scroller-right .x-tabbar-scroll-right-disabled{background-position:0 0;filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=50);opacity:0.5;cursor:default}.x-box-scroller-right .x-toolbar-scroll-right{background-image:url('../resources/themes/images/partkeepr/toolbar/scroll-right.gif')}.x-box-scroller-right .x-toolbar-scroll-right-hover{background-position:-14px 0}.x-box-scroller-right .x-toolbar-scroll-right-disabled{background-position:0 0}.x-box-scroller-right .x-toolbar-scroll-right{width:14px;height:22px;border-bottom:1px solid #8db2e3}.x-box-scroller-top .x-box-scroller{line-height:0;font-size:0}.x-box-scroller-top .x-menu-scroll-top{background:transparent no-repeat center center;background-image:url('../resources/themes/images/partkeepr/layout/mini-top.gif');height:8px;cursor:pointer}.x-box-scroller-bottom .x-box-scroller{line-height:0;font-size:0}.x-box-scroller-bottom .x-menu-scroll-bottom{background:transparent no-repeat center center;background-image:url('../resources/themes/images/partkeepr/layout/mini-bottom.gif');height:8px;cursor:pointer}.x-box-menu-right{float:right;padding-right:2px}.x-column{float:left}.x-ie6 .x-column{display:inline}.x-tool{height:15px}.x-tool img{overflow:hidden;width:15px;height:15px;cursor:pointer;background-color:transparent;background-repeat:no-repeat;background-image:url('../resources/themes/images/partkeepr/tools/tool-sprites.gif');margin:0}.x-panel-header-horizontal .x-tool,.x-window-header-horizontal .x-tool{margin-left:2px}.x-panel-header-vertical .x-tool,.x-window-header-vertical .x-tool{margin-bottom:2px}.x-tool-placeholder{visibility:hidden}.x-tool-toggle{background-position:0 -60px}.x-tool-over .x-tool-toggle{background-position:-15px -60px}.x-panel-collapsed .x-tool-toggle,.x-fieldset-collapsed .x-tool-toggle{background-position:0 -75px}.x-panel-collapsed .x-tool-over .x-tool-toggle,.x-fieldset-collapsed .x-tool-over .x-tool-toggle{background-position:-15px -75px}.x-tool-close{background-position:0 0}.x-tool-minimize{background-position:0 -15px}.x-tool-maximize{background-position:0 -30px}.x-tool-restore{background-position:0 -45px}.x-tool-gear{background-position:0 -90px}.x-tool-prev{background-position:0 -105px}.x-tool-next{background-position:0 -120px}.x-tool-pin{background-position:0 -135px}.x-tool-unpin{background-position:0 -150px}.x-tool-right{background-position:0 -165px}.x-tool-left{background-position:0 -180px}.x-tool-help{background-position:0 -300px}.x-tool-save{background-position:0 -285px}.x-tool-search{background-position:0 -270px}.x-tool-minus{background-position:0 -255px}.x-tool-plus{background-position:0 -240px}.x-tool-refresh{background-position:0 -225px}.x-tool-up{background-position:0 -210px}.x-tool-down{background-position:0 -195px}.x-tool-move{background-position:0 -375px}.x-tool-resize{background-position:0 -360px}.x-tool-collapse{background-position:0 -345px}.x-tool-expand{background-position:0 -330px}.x-tool-print{background-position:0 -315px}.x-tool-expand-bottom,.x-tool-collapse-bottom{background-position:0 -195px}.x-tool-expand-top,.x-tool-collapse-top{background-position:0 -210px}.x-tool-expand-left,.x-tool-collapse-left{background-position:0 -180px}.x-tool-expand-right,.x-tool-collapse-right{background-position:0 -165px}.x-tool-over .x-tool-close{background-position:-15px 0}.x-tool-over .x-tool-minimize{background-position:-15px -15px}.x-tool-over .x-tool-maximize{background-position:-15px -30px}.x-tool-over .x-tool-restore{background-position:-15px -45px}.x-tool-over .x-tool-gear{background-position:-15px -90px}.x-tool-over .x-tool-prev{background-position:-15px -105px}.x-tool-over .x-tool-next{background-position:-15px -120px}.x-tool-over .x-tool-pin{background-position:-15px -135px}.x-tool-over .x-tool-unpin{background-position:-15px -150px}.x-tool-over .x-tool-right{background-position:-15px -165px}.x-tool-over .x-tool-left{background-position:-15px -180px}.x-tool-over .x-tool-down{background-position:-15px -195px}.x-tool-over .x-tool-up{background-position:-15px -210px}.x-tool-over .x-tool-refresh{background-position:-15px -225px}.x-tool-over .x-tool-plus{background-position:-15px -240px}.x-tool-over .x-tool-minus{background-position:-15px -255px}.x-tool-over .x-tool-search{background-position:-15px -270px}.x-tool-over .x-tool-save{background-position:-15px -285px}.x-tool-over .x-tool-help{background-position:-15px -300px}.x-tool-over .x-tool-print{background-position:-15px -315px}.x-tool-over .x-tool-expand{background-position:-15px -330px}.x-tool-over .x-tool-collapse{background-position:-15px -345px}.x-tool-over .x-tool-resize{background-position:-15px -360px}.x-tool-over .x-tool-move{background-position:-15px -375px}.x-tool-over .x-tool-expand-bottom,.x-tool-over .x-tool-collapse-bottom{background-position:-15px -195px}.x-tool-over .x-tool-expand-top,.x-tool-over .x-tool-collapse-top{background-position:-15px -210px}.x-tool-over .x-tool-expand-left,.x-tool-over .x-tool-collapse-left{background-position:-15px -180px}.x-tool-over .x-tool-expand-right,.x-tool-over .x-tool-collapse-right{background-position:-15px -165px}.x-horizontal-scroller-present .x-grid-body{border-bottom-width:0px}.x-vertical-scroller-present .x-grid-body{border-right-width:0px}.x-scroller{overflow:hidden}.x-scroller-vertical{border:1px solid #aaa;border-top-color:#c5c5c5}.x-scroller-horizontal{border:1px solid #aaa}.x-vertical-scroller-present .x-scroller-horizontal{border-right-width:0px}.x-scroller-ct{overflow:hidden;position:absolute;margin:0;padding:0;border:none;left:0px;top:0px;box-sizing:content-box !important;-ms-box-sizing:content-box !important;-moz-box-sizing:content-box !important;-webkit-box-sizing:content-box !important}.x-scroller-vertical .x-scroller-ct{overflow-y:scroll}.x-scroller-horizontal .x-scroller-ct{overflow-x:scroll}.x-html html,.x-html address,.x-html blockquote,.x-html body,.x-html dd,.x-html div,.x-html dl,.x-html dt,.x-html fieldset,.x-html form,.x-html frame,.x-html frameset,.x-html h1,.x-html h2,.x-html h3,.x-html h4,.x-html h5,.x-html h6,.x-html noframes,.x-html ol,.x-html p,.x-html ul,.x-html center,.x-html dir,.x-html hr,.x-html menu,.x-html pre{display:block}.x-html li{display:list-item;list-style:disc}.x-html head{display:none}.x-html table{display:table}.x-html tr{display:table-row}.x-html thead{display:table-header-group}.x-html tbody{display:table-row-group}.x-html tfoot{display:table-footer-group}.x-html col{display:table-column}.x-html colgroup{display:table-column-group}.x-html td,.x-html th{display:table-cell}.x-html caption{display:table-caption}.x-html th{font-weight:bolder;text-align:center}.x-html caption{text-align:center}.x-html body{margin:8px}.x-html h1{font-size:2em;margin:.67em 0}.x-html h2{font-size:1.5em;margin:.75em 0}.x-html h3{font-size:1.17em;margin:.83em 0}.x-html h4,.x-html p,.x-html blockquote,.x-html ul,.x-html fieldset,.x-html form,.x-html ol,.x-html dl,.x-html dir,.x-html menu{margin:1.12em 0}.x-html h5{font-size:.83em;margin:1.5em 0}.x-html h6{font-size:.75em;margin:1.67em 0}.x-html h1,.x-html h2,.x-html h3,.x-html h4,.x-html h5,.x-html h6,.x-html b,.x-html strong{font-weight:bolder}.x-html blockquote{margin-left:40px;margin-right:40px}.x-html i,.x-html cite,.x-html em,.x-html var,.x-html address{font-style:italic}.x-html pre,.x-html tt,.x-html code,.x-html kbd,.x-html samp{font-family:monospace}.x-html pre{white-space:pre}.x-html button,.x-html textarea,.x-html input,.x-html select{display:inline-block}.x-html big{font-size:1.17em}.x-html small,.x-html sub,.x-html sup{font-size:.83em}.x-html sub{vertical-align:sub}.x-html sup{vertical-align:super}.x-html table{border-spacing:2px}.x-html thead,.x-html tbody,.x-html tfoot{vertical-align:middle}.x-html td,.x-html th{vertical-align:inherit}.x-html s,.x-html strike,.x-html del{text-decoration:line-through}.x-html hr{border:1px inset}.x-html ol,.x-html ul,.x-html dir,.x-html menu,.x-html dd{margin-left:40px}.x-html ul,.x-html menu,.x-html dir{list-style-type:disc}.x-html ol{list-style-type:decimal}.x-html ol ul,.x-html ul ol,.x-html ul ul,.x-html ol ol{margin-top:0;margin-bottom:0}.x-html u,.x-html ins{text-decoration:underline}.x-html br:before{content:"\A"}.x-html :before,.x-html :after{white-space:pre-line}.x-html center{text-align:center}.x-html :link,.x-html :visited{text-decoration:underline}.x-html :focus{outline:invert dotted thin}.x-html BDO[DIR="ltr"]{direction:ltr;unicode-bidi:bidi-override}.x-html BDO[DIR="rtl"]{direction:rtl;unicode-bidi:bidi-override}.x-toolbar-mainmenu{background-image:none;background-color:#ececec;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #2aaad3), color-stop(100%, #2067a3));background-image:-webkit-linear-gradient(top, #2aaad3,#2067a3);background-image:-moz-linear-gradient(top, #2aaad3,#2067a3);background-image:-o-linear-gradient(top, #2aaad3,#2067a3);background-image:-ms-linear-gradient(top, #2aaad3,#2067a3);background-image:linear-gradient(top, #2aaad3,#2067a3)}.x-toolbar-mainmenu .x-btn-default-toolbar-small{border:0 !important;background:none;box-shadow:none}.x-toolbar-mainmenu .x-btn-default-toolbar-small .x-btn-inner{color:white;font-weight:bold;text-shadow:0 0 1px #000}.x-toolbar-mainmenu .x-btn-over{background-image:none;background-color:#2aaad3;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #68c4e1), color-stop(100%, #388ed8));background-image:-webkit-linear-gradient(top, #68c4e1,#388ed8);background-image:-moz-linear-gradient(top, #68c4e1,#388ed8);background-image:-o-linear-gradient(top, #68c4e1,#388ed8);background-image:-ms-linear-gradient(top, #68c4e1,#388ed8);background-image:linear-gradient(top, #68c4e1,#388ed8)}.x-toolbar-mainmenu .x-btn-menu-active{background-image:none;background-color:#2aaad3;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #68c4e1), color-stop(100%, #388ed8));background-image:-webkit-linear-gradient(top, #68c4e1,#388ed8);background-image:-moz-linear-gradient(top, #68c4e1,#388ed8);background-image:-o-linear-gradient(top, #68c4e1,#388ed8);background-image:-ms-linear-gradient(top, #68c4e1,#388ed8);background-image:linear-gradient(top, #68c4e1,#388ed8)}.x-toolbar-mainmenu .x-btn-default-toolbar-small .x-btn-arrow{background-image:url(../resources/themes/images/partkeepr/button/arrow-white.gif)}.x-btn-default-toolbar-small{padding:3px}.x-panel-header-default .x-panel-header-text{text-shadow:1px 1px 0px black}.x-accordion-hd{text-shadow:clear}.x-panel-header-default{box-shadow:none}.x-panel-header-default-top{box-shadow:none;-webkit-box-shadow:none}.x-panel-header-default-framed-top{box-shadow:none;-webkit-box-shadow:none}.partkeepr-logo{color:white !important;font-weight:bold;font-style:italic;font-family:'Ubuntu', sans-serif !important;text-shadow:0px -1px 0px #374683;font-size:24px !important}.partkeepr-logo-align{margin-right:1px;text-align:right}.x-tab-default-icon-text-left em{margin-left:-4px} diff --git a/src/frontend/favicon.ico b/src/frontend/favicon.ico Binary files differ. diff --git a/src/frontend/file.php b/src/frontend/file.php @@ -0,0 +1,67 @@ +<?php +namespace de\RaumZeitLabor\PartKeepr\Frontend; +use de\RaumZeitLabor\PartKeepr\Footprint\FootprintAttachment; + +use de\RaumZeitLabor\PartKeepr\Part\PartAttachment; + +use de\RaumZeitLabor\PartKeepr\UploadedFile\TempUploadedFile; + +declare(encoding = 'UTF-8'); + +use de\RaumZeitLabor\PartKeepr\PartKeepr; +use de\RaumZeitLabor\PartKeepr\Image\Image; +use de\RaumZeitLabor\PartKeepr\Manufacturer\ManufacturerICLogo; + +include("../src/de/RaumZeitLabor/PartKeepr/PartKeepr.php"); + +PartKeepr::initialize(""); + +$type = $_REQUEST["type"]; +$id = $_REQUEST["id"]; + +if (substr($id, 0, 4) === "TMP:") { + $tmpFileId = str_replace("TMP:", "", $id); + $file = TempUploadedFile::loadById($tmpFileId); +} else { + try { + switch ($type) { + case "PartKeepr.PartAttachment": + case "PartAttachment": + $file = PartAttachment::loadById($id); + break; + case "FootprintAttachment": + case "PartKeepr.FootprintAttachment": + $file = FootprintAttachment::loadById($id); + break; + default: + $file = null; + // Add default image? + } + + } catch (\Exception $e) { + $file = null; + // Something bad happened + } +} + +if ($file == null) { + + // Could not find the image, but maybe we want a temporary image? + if (array_key_exists("tmpId", $_REQUEST)) { + $file = TempUploadedFile::loadById($_REQUEST["tmpId"]); + } +} + +if (is_object($file)) { + header("Content-Type: ".$file->getMimeType()); + header('Content-Disposition: attachment; filename="'.basename($file->getOriginalFilename()).'"'); + + $fp = fopen($file->getFilename(), "rb"); + fpassthru($fp); + fclose($fp); +} else { + echo "404 not found"; +} + +PartKeepr::getEM()->flush(); +exit();+ \ No newline at end of file diff --git a/src/frontend/image.php b/src/frontend/image.php @@ -0,0 +1,117 @@ +<?php +namespace de\RaumZeitLabor\PartKeepr\Frontend; +use de\RaumZeitLabor\PartKeepr\Part\PartImage; +use de\RaumZeitLabor\PartKeepr\StorageLocation\StorageLocationImage; + +use de\RaumZeitLabor\PartKeepr\Footprint\FootprintImage; + +use de\RaumZeitLabor\PartKeepr\TempImage\TempImage; + +declare(encoding = 'UTF-8'); + +use de\RaumZeitLabor\PartKeepr\PartKeepr; +use de\RaumZeitLabor\PartKeepr\Image\Image; +use de\RaumZeitLabor\PartKeepr\Image\CachedImage; +use de\RaumZeitLabor\PartKeepr\Manufacturer\ManufacturerICLogo; + +include("../src/de/RaumZeitLabor/PartKeepr/PartKeepr.php"); + +PartKeepr::initialize(""); + +$type = $_REQUEST["type"]; +$id = $_REQUEST["id"]; + +if (substr($id, 0, 4) === "TMP:") { + $tmpImageId = str_replace("TMP:", "", $id); + $image = TempImage::loadById($tmpImageId); +} else { + try { + switch ($type) { + case Image::IMAGE_ICLOGO: + $image = ManufacturerICLogo::loadById($id); + break; + case Image::IMAGE_FOOTPRINT: + $image = FootprintImage::loadById($id); + break; + case Image::IMAGE_STORAGELOCATION: + $image = StorageLocationImage::loadById($id); + break; + case Image::IMAGE_PART: + $image = PartImage::loadById($id); + break; + default: + $image = null; + // Add default image? + } + + } catch (\Exception $e) { + $image = null; + // Something bad happened + } +} + +if ($image == null) { + // Could not find the image, but maybe we want a temporary image? + if (array_key_exists("tmpId", $_REQUEST)) { + $image = TempImage::loadById($_REQUEST["tmpId"]); + } + + if ($image === null) { + /* The image is still null - output an "image not found" image. */ + $image = imagecreate($_REQUEST["w"], $_REQUEST["h"]); + $white = imagecolorallocate($image, 255,255,255); + $black = imagecolorallocate($image, 0,0,0); + + header("Content-Type: image/png"); + + $w = $_REQUEST["w"]-1; + $h = $_REQUEST["h"]-1; + imagefill($image, 0,0, $white); + + /* Draw the X */ + imageline($image, 0,0,$w,$h, $black); + imageline($image, $w,0,0,$h, $black); + imagepng($image); + exit(); + + } +} + +$mode = "fit"; + +if (array_key_exists("m", $_REQUEST)) { + $mode = $_REQUEST["m"]; +} + +if (array_key_exists("cache", $_REQUEST)) { + if ($_REQUEST["cache"] == "false") { + CachedImage::invalidate($image); + } +} + +switch ($mode) { + case "fitpadding": + $file = $image->fitWithinPadding($_REQUEST["w"],$_REQUEST["h"]); + break; + case "fitexact": + $file = $image->fitWithinExact($_REQUEST["w"],$_REQUEST["h"]); + break; + case "scale": + $file = $image->scaleTo($_REQUEST["w"],$_REQUEST["h"]); + break; + case "fit": + default: + $file = $image->fitWithin($_REQUEST["w"],$_REQUEST["h"]); + break; + +} + + +header("Content-Type: image/png"); + +$fp = fopen($file, "rb"); +fpassthru($fp); +fclose($fp); + +PartKeepr::getEM()->flush(); +exit();+ \ No newline at end of file diff --git a/src/frontend/index.php b/src/frontend/index.php @@ -0,0 +1,88 @@ +<?php +namespace de\RaumZeitLabor\PartKeepr\Frontend; +declare(encoding = 'UTF-8'); + +use de\RaumZeitLabor\PartKeepr\Service\ServiceManager; +use de\RaumZeitLabor\PartKeepr\PartKeepr; +use de\RaumZeitLabor\PartKeepr\Util\Configuration; + +include("../src/de/RaumZeitLabor/PartKeepr/PartKeepr.php"); + +PartKeepr::initialize(""); +?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" + "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> +<html> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> + <title>PartKeepr</title> + + <link href='http://fonts.googleapis.com/css?family=Ubuntu:400,700italic' rel='stylesheet' type='text/css'> + + <!-- Include the ExtJS CSS Theme --> + <link rel="stylesheet" type="text/css" href="css/partkeepr-theme.css"/> + + <link rel="stylesheet" type="text/css" href="js/Ext.ux/statusbar/css/statusbar.css"/> + + <link rel="stylesheet" type="text/css" href="css/PartKeepr.css"/> + + <link rel="icon" href="favicon.ico"/> + + <!-- Include the ExtJS JavaScript Library --> + <script type="text/javascript" src="extjs/bootstrap.js"></script> + + <?php + // @todo This is ugly, but how to fix? + if (Configuration::getOption("partkeepr.frontend.debug", false) === true) { + ?> + <script type="text/javascript" src="extjs/ext-all-debug.js"></script> + <script type="text/javascript" src="js/partkeepr-debug.js"></script> + <?php + } else { + ?> + <script type="text/javascript" src="extjs/ext-all.js"></script> + <script type="text/javascript" src="js/partkeepr.js"></script> + <?php + } + ?> + <script type="text/javascript" src="js/org.phpjs.lib/php.default.min.js"></script> + <script type="text/javascript" src="js/webcam.js"></script> + + </head> +<body> +<div id="loading"><span class="logo"></span></div> +<?php +// @todo put that somewhere else. This is only a stupid hack. +function return_bytes ($size_str) +{ + switch (substr ($size_str, -1)) + { + case 'M': case 'm': return (int)$size_str * 1048576; + case 'K': case 'k': return (int)$size_str * 1024; + case 'G': case 'g': return (int)$size_str * 1073741824; + default: return $size_str; + } +} + +$maxPostSize = return_bytes(ini_get("post_max_size")); +$maxFilesize = return_bytes(ini_get("upload_max_filesize")); + +$maxUploadSize = ($maxPostSize < $maxFilesize) ? $maxPostSize : $maxFilesize; + +$imagick = new \Imagick(); +?> +<script type="text/javascript"> +window.maxUploadSize = <?php echo $maxUploadSize; ?>; +window.availableImageFormats = <?php echo json_encode($imagick->queryFormats()); ?>; + +<?php +if (Configuration::getOption("partkeepr.frontend.autologin.enabled", false) === true) { +?> +window.autoLoginUsername = "<?php echo Configuration::getOption("partkeepr.frontend.autologin.username"); ?>"; +window.autoLoginPassword = "<?php echo Configuration::getOption("partkeepr.frontend.autologin.password"); ?>"; +<?php +} +?> +</script> +</body> +</html>+ \ No newline at end of file diff --git a/src/frontend/js/Components/CategoryEditor/CategoryEditorForm.js b/src/frontend/js/Components/CategoryEditor/CategoryEditorForm.js @@ -0,0 +1,18 @@ +Ext.define('PartKeepr.CategoryEditorForm', { + extend: 'Ext.form.Panel', + layout: 'anchor', + border: false, + frame: false, + bodyStyle: 'background:#DBDBDB;padding: 10px;', + items: [{ + xtype: 'textfield', + name: 'name', + anchor: '100%', + fieldLabel: i18n("Name") + },{ + xtype: 'textarea', + name: 'description', + anchor: '100%', + fieldLabel: i18n("Description") + }] +});+ \ No newline at end of file diff --git a/src/frontend/js/Components/CategoryEditor/CategoryEditorTree.js b/src/frontend/js/Components/CategoryEditor/CategoryEditorTree.js @@ -0,0 +1,202 @@ +Ext.define("PartKeepr.CategoryEditorTree", { + alias: 'widget.CategoryEditorTree', + extend: 'PartKeepr.CategoryTree', + ddGroup: null, + categoryModel: null, + categoryService: null, + initComponent: function () { + if (this.ddGroup !== null) { + Ext.apply(this, { + viewConfig: { + animate: false, + plugins: { + ptype: 'treeviewdragdrop', + ddGroup: this.ddGroup + } + }}); + } + + this.createToolbar(); + + this.callParent(); + + this.getView().on("drop", Ext.bind(this.onCategoryDrop, this)); + this.getView().on("beforedrop", this.onBeforeDrop, this); + this.getView().on("itemcontextmenu", Ext.bind(this.onItemContextMenu, this)); + + this.createMenu(); + + }, + onBeforeDrop: function () { + + }, + onCategoryDrop: function (node, data, model, pos) { + var draggedRecord = data.records[0]; + var droppedOn = this.getView().getRecord(node); + + if (!draggedRecord.isCategory) { + return; + } else { + /* Must be a category */ + + var targetRecord; + + if (pos == "after" || pos == "before") { + targetRecord = droppedOn.parentNode; + } else { + targetRecord = droppedOn; + } + + this.getStore().sort("name", "ASC"); + + var call = new PartKeepr.ServiceCall(this.categoryService, "moveCategory"); + call.setLoadMessage(sprintf(i18n("Moving category %s..."), draggedRecord.get("name"))); + call.setParameter("category", draggedRecord.get("id")); + call.setParameter("target", targetRecord.get("id")); + call.doCall(); + } + + }, + + onItemContextMenu: function (view, record, item, index, event) { + if (!record.isCategory) { return; } + var menu = this.menu; + event.stopEvent(); + + menu.record = record; + + this.menuCategoryDelete.enable(); + + if (record.get("id") == 1) { + this.menuCategoryDelete.disable(); + } + + if (record.hasChildNodes()) { + this.menuCategoryDelete.disable(); + } + + menu.showAt(event.getXY()); + }, + createMenu: function () { + this.menuCategoryDelete = Ext.create("Ext.menu.Item", { + text: i18n("Delete Category"), + handler: Ext.bind(this.confirmCategoryDelete, this), + icon: 'resources/silkicons/folder_delete.png' + }); + + this.menuCategoryAdd = Ext.create("Ext.menu.Item", { + text: i18n("Add Category"), + handler: Ext.bind(this.showCategoryAddDialog, this), + icon: 'resources/silkicons/folder_add.png' + }); + + this.menuCategoryEdit = Ext.create("Ext.menu.Item", { + text: i18n("Edit Category"), + handler: Ext.bind(this.showCategoryEditDialog, this), + icon: 'resources/silkicons/folder_edit.png' + }); + + this.menu = Ext.create('widget.menu', { + items: [ + this.menuCategoryAdd, + this.menuCategoryEdit, + this.menuCategoryDelete + ] + }); + }, + createToolbar: function () { + this.toolbarExpandButton = Ext.create("Ext.button.Button", { + icon: 'resources/fugue-icons/icons/toggle-expand.png', + tooltip: i18n("Expand All"), + handler: this._onExpandClick, + scope: this + }); + + this.toolbarCollapseButton = Ext.create("Ext.button.Button", { + icon: 'resources/fugue-icons/icons/toggle.png', + tooltip: i18n("Collapse All"), + handler: this._onCollapseClick, + scope: this + }); + + this.toolbarReloadButton = Ext.create("Ext.button.Button", { + icon: 'extjs/resources/themes/images/default/grid/refresh.gif', + tooltip: i18n("Reload"), + handler: this._onReloadClick, + scope: this + }); + + this.toolbar = Ext.create("Ext.toolbar.Toolbar", { + enableOverflow: true, + dock: 'top', + items: [ this.toolbarExpandButton, this.toolbarCollapseButton, this.toolbarReloadButton ] + }); + + Ext.apply(this, { + dockedItems: [ this.toolbar ] + }); + }, + _onReloadClick: function () { + this.loadCategories(); + }, + _onExpandClick: function () { + this.getRootNode().firstChild.expand(true); + }, + _onCollapseClick: function () { + this.getRootNode().firstChild.collapse(true); + }, + confirmCategoryDelete: function () { + Ext.Msg.confirm(i18n("Confirm Category Delete"), sprintf(i18n("Do you really wish to delete the category %s?"), this.menu.record.get("name")), this.onCategoryDelete, this); + }, + showCategoryAddDialog: function () { + var j = Ext.create("PartKeepr.CategoryEditorWindow", { + record: null, + categoryModel: this.categoryModel, + parent: this.menu.record.get("id"), + listeners: { + save: Ext.bind(this.onUpdateRecord, this) + } + }); + + j.show(); + }, + showCategoryEditDialog: function () { + var j = Ext.create("PartKeepr.CategoryEditorWindow", { + record: this.menu.record, + parent: null, + categoryModel: this.categoryModel, + listeners: { + save: Ext.bind(this.onUpdateRecord, this) + } + }); + + j.show(); + }, + onUpdateRecord: function (record) { + var currentRecord = this.getStore().getRootNode().findChild("id", record.get("id"), true); + + if (currentRecord === null) { + var parentRecord = this.getStore().getRootNode().findChild("id", record.get("parent"), true); + + var nodeData = { + id : record.get("id"), + name : record.get("name"), + tooltip : record.get("description") + }; + + parentRecord.appendChild(nodeData); + + } else { + currentRecord.set("name", record.get("name")); + currentRecord.set("description", record.get("description")); + currentRecord.commit(); + } + + }, + onCategoryDelete: function (btn) { + if (btn == "yes") { + var del = this.getStore().getRootNode().findChild("id", this.menu.record.get("id"), true); + del.destroy(); + } + } +});+ \ No newline at end of file diff --git a/src/frontend/js/Components/CategoryEditor/CategoryEditorWindow.js b/src/frontend/js/Components/CategoryEditor/CategoryEditorWindow.js @@ -0,0 +1,67 @@ +Ext.define('PartKeepr.CategoryEditorWindow', { + extend: 'Ext.window.Window', + border: false, + width: 400, + categoryModel: null, + initComponent: function () { + + this.form = Ext.create("PartKeepr.CategoryEditorForm"); + + this.keys = [{ + key: Ext.EventObject.ENTER, + handler: this.onEnter, + scope: this + }]; + + this.buttons = [{ + text: i18n("Save"), + handler: Ext.bind(this.onSave, this) + },{ + text: i18n("Cancel"), + handler: Ext.bind(this.onCancel, this) + }]; + + this.items = this.form; + + this.addEvents("save"); + + this.callParent(); + + this.proxyRecord = Ext.create(this.categoryModel); + + if (this.record) { + this.proxyRecord.set("name", this.record.get("name")); + this.proxyRecord.set("description", this.record.get("description")); + this.proxyRecord.set("id", this.record.get("id")); + this.proxyRecord.phantom = false; + + this.setTitle(i18n("Edit Category")); + } else { + this.proxyRecord.set("parent", this.parent); + this.setTitle(i18n("Add Category")); + } + + this.form.getForm().loadRecord(this.proxyRecord); + + this.on("show", Ext.bind(this.onShow, this)); + + }, + onEnter: function () { + this.onSave(); + }, + onShow: function () { + this.form.items.first().focus(); + }, + onSave: function () { + this.form.getForm().updateRecord(this.proxyRecord); + this.proxyRecord.save({ + success: Ext.bind(function (response) { + this.fireEvent("save", response); + this.destroy(); + }, this) + }); + }, + onCancel: function () { + this.destroy(); + } +}); diff --git a/src/frontend/js/Components/CategoryStore.js b/src/frontend/js/Components/CategoryStore.js @@ -0,0 +1,28 @@ +PartKeepr.CategoryTreeStore = Ext.define("CategoryTreeStore", +{ + extend: "Ext.data.TreeStore", + model: 'PartKeepr.Category', + proxy: { + type: 'ajax', + url: PartKeepr.getBasePath()+'/Category', + method: 'POST', + extraParams: { + call: 'getCategories' + }, + reader: { + type: 'json', + root: 'response' + } + }, + root: { + text: 'Ext JS', + id: 'src', + expanded: true + }, + constructor: function () { + this.proxy.extraParams.session = PartKeepr.getSession(); + + this.callParent(); + }, + folderSort: true +});+ \ No newline at end of file diff --git a/src/frontend/js/Components/CategoryTree.js b/src/frontend/js/Components/CategoryTree.js @@ -0,0 +1,109 @@ +Ext.define("PartKeepr.CategoryTree", { + alias: 'widget.CategoryTree', + extend: 'Ext.tree.Panel', + categoryService: null, + categoryModel: null, + displayField: 'name', + sorters: [{ + property: 'name', + direction: 'ASC' + }], + viewConfig: { + animate: false + }, + loaded: false, + rootVisible: false, + initComponent: function () { + this.store = new Ext.data.TreeStore({ + root: { + id: "src", + name: "Foo" + }, + remoteSort: false, + folderSort: true + }); + + this.callParent(); + + this.addEvents("categoriesLoaded"); + + this.loadCategories(); + }, + loadCategories: function () { + var call = new PartKeepr.ServiceCall(this.categoryService, "getAllCategories"); + call.setLoadMessage(i18n("Loading categories...")); + call.setHandler(Ext.bind(this._onCategoriesLoaded, this)); + call.doCall(); + }, + _onCategoriesLoaded: function (result) { + /* Store expand/collapse state for all nodes */ + var expandedNodes = this.getExpandedNodes(this.getRootNode()); + + this.getRootNode().removeAll(); + + this.buildCategoryTree(this.getRootNode(), result, expandedNodes); + + this.loaded = true; + + this.getRootNode().expandChildren(); + + this.getStore().sort("name", "ASC"); + + this.fireEvent("categoriesLoaded"); + }, + getExpandedNodes: function (node) { + var ret = []; + if (node.get("expanded") === true) { + ret.push(node.get("id")); + } + + for (var i=0;i<node.childNodes.length;i++) { + ret = ret.concat(this.getExpandedNodes(node.childNodes[i])); + } + return ret; + }, + buildCategoryTree : function(root, data, expandedNodes) { + var nodeData = { + id : data.id, + name : data.name, + tooltip : data.description + }; + + if (Ext.Array.contains(expandedNodes, data.id)) { + Ext.apply(nodeData, { + expanded: true + }); + } + + // Hack to prevent our virtual root node from being dragged + if (data.id == 1) { + nodeData.allowDrag = false; + } + + /* We'd like to set leaf here. For some reason, the tree + * is stupid. + * + * If the node is a leaf, it's not possible to append children. I would + * have expected that the "leaf" flag is cleared when a child is appended. + * + * If the node is not a leaf, the node should (in theory) use the children + * count. However, it doesn't do that in our case and always shows the "expand" + * button unless clicked once. + */ + + /*if (data.children.length === 0) { + nodeData.leaf = true; + } else { + nodeData.leaf = false; + }*/ + + nodeData.leaf = false; + nodeData.loaded = true; + + var node = root.appendChild(Ext.create(this.categoryModel, nodeData)); + + for ( var i = 0; i < data.children.length; i++) { + this.buildCategoryTree(node, data.children[i], expandedNodes); + } + } +});+ \ No newline at end of file diff --git a/src/frontend/js/Components/ConnectionButton.js b/src/frontend/js/Components/ConnectionButton.js @@ -0,0 +1,17 @@ +Ext.define('PartKeepr.ConnectionButton', { + extend: 'Ext.Button', + connectedIcon: 'resources/silkicons/connect.png', + disconnectedIcon: 'resources/silkicons/disconnect.png', + cls: 'x-btn-icon', + icon: 'resources/silkicons/disconnect.png', + //tooltip: i18n("Disconnected"), + setConnected: function () { + this.setIcon(this.connectedIcon); + //this.setTooltip(i18n("Connected")); + }, + setDisconnected: function () { + this.setIcon(this.disconnectedIcon); + //this.setTooltip(i18n("Disconnected")); + } +}); + diff --git a/src/frontend/js/Components/Distributor/DistributorEditor.js b/src/frontend/js/Components/Distributor/DistributorEditor.js @@ -0,0 +1,34 @@ +Ext.define('PartKeepr.DistributorEditor', { + extend: 'PartKeepr.Editor', + alias: 'widget.DistributorEditor', + items: [{ + xtype: 'textfield', + name: 'name', + fieldLabel: i18n("Distributor") + },{ + xtype: 'textarea', + name: 'address', + fieldLabel: i18n("Address") + },{ + xtype: 'textfield', + name: 'url', + fieldLabel: i18n("Website") + },{ + xtype: 'textfield', + name: 'email', + fieldLabel: i18n("Email") + },{ + xtype: 'textfield', + name: 'phone', + fieldLabel: i18n("Phone") + },{ + xtype: 'textfield', + name: 'fax', + fieldLabel: i18n("Fax") + },{ + xtype: 'textarea', + name: 'comment', + fieldLabel: i18n("Comment") + }], + saveText: i18n("Save Distributor") +}); diff --git a/src/frontend/js/Components/Distributor/DistributorEditorComponent.js b/src/frontend/js/Components/Distributor/DistributorEditorComponent.js @@ -0,0 +1,18 @@ +Ext.define('PartKeepr.DistributorEditorComponent', { + extend: 'PartKeepr.EditorComponent', + alias: 'widget.DistributorEditorComponent', + navigationClass: 'PartKeepr.DistributorGrid', + editorClass: 'PartKeepr.DistributorEditor', + newItemText: i18n("New Distributor"), + model: 'PartKeepr.Distributor', + initComponent: function () { + this.createStore({ + sorters: [{ + property: 'name', + direction:'ASC' + }] + }); + + this.callParent(); + } +});+ \ No newline at end of file diff --git a/src/frontend/js/Components/Distributor/DistributorGrid.js b/src/frontend/js/Components/Distributor/DistributorGrid.js @@ -0,0 +1,12 @@ +Ext.define('PartKeepr.DistributorGrid', { + extend: 'PartKeepr.EditorGrid', + alias: 'widget.DistributorGrid', + columns: [ + {header: i18n("Distributor"), dataIndex: 'name', flex: 1} + ], + addButtonText: i18n("Add Distributor"), + addButtonIcon: 'resources/silkicons/lorry_add.png', + deleteButtonText: i18n("Delete Distributor"), + deleteButtonIcon: 'resources/silkicons/lorry_delete.png' + +});+ \ No newline at end of file diff --git a/src/frontend/js/Components/Editor/Editor.js b/src/frontend/js/Components/Editor/Editor.js @@ -0,0 +1,120 @@ +Ext.define('PartKeepr.Editor', { + extend: 'Ext.form.Panel', + alias: 'widget.Editor', + trackResetOnLoad: true, + bodyStyle: 'background:#DBDBDB;padding: 10px;', + record: null, // The record which is currently edited + saveText: i18n("Save"), + cancelText: i18n("Cancel"), + model: null, + layout: 'anchor', + change: false, + autoScroll: true, + defaults: { + anchor: '100%', + labelWidth: 150 + }, + enableButtons: true, + + // If false, determinates if we should sync via the store or the record itself. + // If true, always syncs the record via it's own proxy. + syncDirect: false, + + onFieldChange: function () { + return; + + // @todo Finish implementing the dirty flag later + /*if (this.change == false) { + this.setTitle(this.record.getRecordName() + "*"); + } + + this.change = true;*/ + }, + initComponent: function () { + if (this.enableButtons) { + this.saveButton = Ext.create("Ext.button.Button", { + text: this.saveText, + cls: 'x-btn-text-icon', + icon: 'resources/fugue-icons/icons/disk.png', + handler: Ext.bind(this.onItemSave, this) + }); + + this.cancelButton = Ext.create("Ext.button.Button", { + text: this.cancelText, + cls: 'x-btn-text-icon', + icon: 'resources/silkicons/cancel.png', + handler: Ext.bind(this.onCancelEdit, this) + }); + + this.bottomToolbar = Ext.create("Ext.toolbar.Toolbar", { + enableOverflow: true, + margin: '10px', + defaults: {minWidth: 100}, + dock: 'bottom', + ui: 'footer', + items: [ this.saveButton, this.cancelButton ] + }); + + Ext.apply(this, { + dockedItems: [ this.bottomToolbar ]}); + } + + + + + this.on("dirtychange", function (form, dirty) { + // @todo Check dirty flag + // Waiting for reply on http://www.sencha.com/forum/showthread.php?135142-Ext.form.Basic.loadRecord-causes-form-to-be-dirty&p=607588#post607588 + }); + + this.addEvents("editorClose", "startEdit", "itemSaved"); + + this.defaults.listeners = { + "change": Ext.bind(this.onFieldChange, this) + }; + + this.callParent(); + }, + onCancelEdit: function () { + this.fireEvent("editorClose", this); + }, + newItem: function (defaults) { + Ext.apply(defaults, {}); + var j = Ext.create(this.model, defaults); + this.editItem(j); + }, + editItem: function (record) { + this.record = record; + this.getForm().loadRecord(this.record); + this.show(); + if (this.record.getRecordName() !== "") { + this._setTitle(this.record.getRecordName()); + } + + this.change = false; + this.fireEvent("startEdit", this); + }, + getRecordId: function () { + if (this.record) { + return this.record.get("id"); + } else { + return null; + } + }, + onItemSave: function () { + this.getForm().updateRecord(this.record); + this.record.save({ + callback: this._onSave, + scope: this + }); + }, + _onSave: function (record, response) { + if (response.success === true) { + this.record = record; + this.fireEvent("itemSaved", this.record); + } + }, + _setTitle: function (title) { + this.setTitle(title); + } +}); diff --git a/src/frontend/js/Components/Editor/EditorComponent.js b/src/frontend/js/Components/Editor/EditorComponent.js @@ -0,0 +1,201 @@ +/** + * @class PartKeepr.EditorComponent + + * <p>The EditorComponent encapsulates an editing workflow. In general, we have four actions + * for each object: create, update, delete, view. These actions stay exactly the same for each + * distinct object.</p> + * <p>The EditorComponent is a border layout, which has a navigation and an editor area.</p> + * @todo Document the editor system a bit better + */ +Ext.define('PartKeepr.EditorComponent', { + extend: 'Ext.panel.Panel', + alias: 'widget.EditorComponent', + + /** + * Misc layout settings + */ + layout: 'border', + padding: 5, + border: false, + + /** + * Specifies the class name of the navigation. The navigation is placed in the "west" region + * and needs to fire the event "itemSelect". The component listens on that event and + * creates an editor based on the selected record. + */ + navigationClass: null, + + /** + * Specifies the class name of the editor. + */ + editorClass: null, + + /** + * Contains the store for the item overview. + */ + store: null, + + /** + * Contains the associated model to load a record for. + */ + model: null, + + /** + * Some default text messages. Can be overridden by sub classes. + */ + deleteMessage: i18n("Do you really wish to delete the item %s?"), + deleteTitle: i18n("Delete Item"), + newItemText: i18n("New Item"), + + initComponent: function () { + + /** + * Create the navigation panel + */ + this.navigation = Ext.create(this.navigationClass, { + region: 'west', + width: 265, + split: true, + store: this.store + }); + + this.navigation.on("itemAdd", this.newRecord, this); + this.navigation.on("itemDelete", this.confirmDelete, this); + this.navigation.on("itemEdit", this.startEdit, this); + + /** + * Create the editor panel + */ + this.editorTabPanel = Ext.create("Ext.tab.Panel", { + region: "center", + layout: 'fit', + plugins: Ext.create('Ext.ux.TabCloseMenu') + }); + + this.items = [ this.navigation, this.editorTabPanel ]; + + this.callParent(); + }, + /** + * Creates a new record. Creates a new instance of the editor. + */ + newRecord: function (defaults) { + Ext.apply(defaults, {}); + + var editor = this.createEditor(this.newItemText); + editor.newItem(defaults); + this.editorTabPanel.add(editor).show(); + }, + /** + * Instructs the component to edit a new record. + * @param {Record} record The record to edit + */ + startEdit: function (id) { + /* Search for an open editor for the current record. If we + * already have an editor, show the editor instead of loading + * a new record. + */ + var editor = this.findEditor(id); + + if (editor !== null) { + editor.show(); + return; + } + + // Still here? OK, we don't have an editor open. Create a new one + var model = Ext.ModelManager.getModel(this.model); + + model.load(id, { + scope: this, + success: function(record, operation) { + editor = this.createEditor(record.getRecordName()); + editor.editItem(record); + this.editorTabPanel.add(editor).show(); + } + }); + }, + findEditor: function (id) { + for (var i=0;i<this.editorTabPanel.items.getCount();i++) { + if (this.editorTabPanel.items.getAt(i).getRecordId() == id) { + return this.editorTabPanel.items.getAt(i); + } + } + + return null; + }, + createEditor: function (title) { + var editor = Ext.create(this.editorClass, { + store: this.store, + title: title, + model: this.model, + closable: true, + listeners: { + editorClose: Ext.bind(function (m) { + this.editorTabPanel.remove(m); + }, this) + } + }); + + editor.on("itemSaved", this.onItemSaved, this); + return editor; + }, + confirmDelete: function () { + var r = this.navigation.getSelectionModel().getLastSelected(); + var recordName; + + if (r.getRecordName) { + recordName = r.getRecordName(); + } else { + recordName = r.get("name"); + } + + Ext.Msg.confirm( + this.deleteTitle, + sprintf(this.deleteMessage, recordName), + function (but) { + if (but == "yes") { + this.deleteRecord(r); + } + },this); + }, + deleteRecord: function (r) { + var editor = this.findEditor(r.get("id")); + + if (editor !== null) { + this.editorTabPanel.remove(editor); + } + + r.destroy(); + this.store.load(); + }, + // Creates a store. To be called from child's initComponent + createStore: function (config) { + Ext.Object.merge(config, { + autoLoad: true, + model: this.model, + autoSync: false, // Do not change. If true, new (empty) records would be immediately commited to the database. + remoteFilter: true, + remoteSort: true, + pageSize: 15}); + + this.store = Ext.create('Ext.data.Store', config); + + // Workaround for bug http://www.sencha.com/forum/showthread.php?133767-Store.sync()-does-not-update-dirty-flag&p=607093#post607093 + this.store.on('write', function(store, operation) { + var success=operation.wasSuccessful(); + if (success) { + Ext.each(operation.records, function(record){ + if (record.dirty) { + record.commit(); + } + }); + } + }); + }, + getStore: function () { + return this.store; + }, + onItemSaved: function (record) { + this.navigation.syncChanges(record); + } +});+ \ No newline at end of file diff --git a/src/frontend/js/Components/Editor/EditorGrid.js b/src/frontend/js/Components/Editor/EditorGrid.js @@ -0,0 +1,164 @@ +/** + * This class extends a regular GridPanel with the following features: + * + * - Buttons to add/delete items + * - Enable/Disable the delete button if an item is selected + * - Search field + * - Paging Toolbar + */ +Ext.define('PartKeepr.EditorGrid', { + extend: 'Ext.grid.Panel', + alias: 'widget.EditorGrid', + + /** + * @cfg {String} text The text for the "delete" button + */ + deleteButtonText: i18n("Delete Item"), + + /** + * @cfg {String} text The path to the 'delete' icon + */ + deleteButtonIcon: 'resources/silkicons/delete.png', + + /** + * @cfg {String} text The text for the "add" button + */ + addButtonText: i18n("Add Item"), + + /** + * @cfg {String} text The path to the 'add' icon + */ + addButtonIcon: 'resources/silkicons/add.png', + + /** + * @cfg {String} text Defines if the "add"/"delete" buttons should show their text or icon only. If "hide", the + * button text is hidden, anything else shows the text. + */ + buttonTextMode: 'hide', + + initComponent: function () { + + this.addEvents( + /** + * @event itemSelect + * Fires if a record was selected within the grid. + * @param {Object} record The selected record + */ + "itemSelect", + + /** + * @event itemDeselect + * Fires if a record was deselected within the grid. + * @param {Object} record The deselected record + */ + "itemDeselect", + + /** + * @event itemEdit + * Fires if a record should be edited. + * @param {Object} record The record to edit + */ + "itemEdit", + + /** + * @event itemDelete + * Fires if the delete button was clicked. + */ + "itemDelete", + + /** + * @event itemDelete + * Fires if the add button was clicked. + */ + "itemAdd"); + + + this.getSelectionModel().on("select", this._onItemSelect, this); + this.getSelectionModel().on("deselect", this._onItemDeselect, this); + + this.on("itemclick", this._onItemEdit, this); + + this.deleteButton = Ext.create("Ext.button.Button", { + text: (this.buttonTextMode !== "hide") ? this.deleteButtonText : '', + tooltip: this.deleteButtonText, + icon: this.deleteButtonIcon, + handler: Ext.bind(function () { + this.fireEvent("itemDelete"); + }, this), + disabled: true + }); + + this.searchField = Ext.create("Ext.ux.form.SearchField",{ + store: this.store + }); + + this.topToolbar = Ext.create("Ext.toolbar.Toolbar",{ + dock: 'top', + enableOverflow: true, + items: [ + { + text: (this.buttonTextMode !== "hide") ? this.addButtonText : '', + tooltip: this.addButtonText, + icon: this.addButtonIcon, + handler: Ext.bind(function () { + this.fireEvent("itemAdd"); + }, this) + }, + this.deleteButton, + { xtype: 'tbfill' }, + this.searchField] + }); + + this.bottomToolbar = Ext.create("Ext.toolbar.Paging", { + store: this.store, + enableOverflow: true, + dock: 'bottom', + displayInfo: false + }); + + Ext.apply(this, { + dockedItems: [ + this.topToolbar, + this.bottomToolbar + ] + }); + + this.callParent(); + }, + syncChanges: function (record) { + // Simply reload the store for now + this.store.load(); + }, + /** + * Called when an item was selected. Enables/disables the delete button. + */ + _updateDeleteButton: function (selectionModel, record) { + /* Right now, we support delete on a single record only */ + if (this.getSelectionModel().getCount() == 1) { + this.deleteButton.enable(); + } else { + this.deleteButton.disable(); + } + }, + + /** + * Called when an item should be edited + */ + _onItemEdit: function (view, record) { + this.fireEvent("itemEdit", record.get("id")); + }, + /** + * Called when an item was selected + */ + _onItemSelect: function (selectionModel, record) { + this._updateDeleteButton(selectionModel, record); + this.fireEvent("itemSelect", record); + }, + /** + * Called when an item was deselected + */ + _onItemDeselect: function (selectionModel, record) { + this._updateDeleteButton(selectionModel, record); + this.fireEvent("itemDeselect", record); + } +});+ \ No newline at end of file diff --git a/src/frontend/js/Components/Footprint/FootprintAttachmentGrid.js b/src/frontend/js/Components/Footprint/FootprintAttachmentGrid.js @@ -0,0 +1,6 @@ +Ext.define('PartKeepr.FootprintAttachmentGrid', { + extend: 'PartKeepr.AttachmentGrid', + alias: 'widget.FootprintAttachmentGrid', + + model: "PartKeepr.FootprintAttachment" +});+ \ No newline at end of file diff --git a/src/frontend/js/Components/Footprint/FootprintEditor.js b/src/frontend/js/Components/Footprint/FootprintEditor.js @@ -0,0 +1,66 @@ +Ext.define('PartKeepr.FootprintEditor', { + extend: 'PartKeepr.Editor', + alias: 'widget.FootprintEditor', + saveText: i18n("Save Footprint"), + layout: 'column', + syncDirect: true, + labelWidth: 75, + initComponent: function () { + this.on("startEdit", this.onEditStart, this, { delay: 50 }); + + this.attachmentGrid = Ext.create("PartKeepr.FootprintAttachmentGrid", { + height: 200, + width: '100%', + border: true + }); + + this.items = [{ + columnWidth: 1, + minWidth: 500, + layout: 'anchor', + xtype: 'container', + margin: '0 5 0 0', + items: [ + { + xtype: 'textfield', + name: 'name', + labelWidth: 75, + anchor: '100%', + fieldLabel: i18n("Name") + },{ + labelWidth: 75, + xtype: 'textarea', + name: 'description', + anchor: '100%', + fieldLabel: i18n("Description") + },{ + labelWidth: 75, + xtype: 'fieldcontainer', + anchor: '100%', + fieldLabel: i18n("Attachments"), + items: this.attachmentGrid + } + ] + },{ + width: 370, + height: 250, + xtype: 'remoteimagefield', + name: 'image_id', + imageType: 'footprint', + imageWidth: 256, + imageHeight: 256, + labelWidth: 75, + fieldLabel: i18n("Image") + }]; + + this.on("itemSaved", this._onItemSaved, this); + this.callParent(); + }, + _onItemSaved: function (record) { + this.attachmentGrid.bindStore(record.attachments()); + }, + onEditStart: function () { + var store = this.record.attachments(); + this.attachmentGrid.bindStore(store); + } +}); diff --git a/src/frontend/js/Components/Footprint/FootprintEditorComponent.js b/src/frontend/js/Components/Footprint/FootprintEditorComponent.js @@ -0,0 +1,39 @@ +Ext.define('PartKeepr.FootprintEditorComponent', { + extend: 'PartKeepr.EditorComponent', + alias: 'widget.FootprintEditorComponent', + navigationClass: 'PartKeepr.FootprintTree', + editorClass: 'PartKeepr.FootprintEditor', + newItemText: i18n("New Footprint"), + model: 'PartKeepr.Footprint', + initComponent: function () { + this.createStore({ + sorters: [{ + property: 'name', + direction:'ASC' + }] + }); + + this.callParent(); + + }, + deleteRecord: function (r) { + var editor = this.findEditor(r.get("footprintId")); + + if (editor !== null) { + this.editorTabPanel.remove(editor); + } + + var call = new PartKeepr.ServiceCall("Footprint", "destroy"); + call.setParameter("id", r.get("footprintId")); + call.setHandler(Ext.bind(function () { + var oldRecordIndex = PartKeepr.getApplication().getFootprintStore().find("id", r.get("footprintId")); + + PartKeepr.getApplication().getFootprintStore().removeAt(oldRecordIndex); + this.navigation.loadCategories(); + }, this)); + + call.doCall(); + + + } +});+ \ No newline at end of file diff --git a/src/frontend/js/Components/Footprint/FootprintTree.js b/src/frontend/js/Components/Footprint/FootprintTree.js @@ -0,0 +1,186 @@ +Ext.define("PartKeepr.FootprintTree", { + extend: 'PartKeepr.CategoryEditorTree', + alias: 'widget.FootprintTree', + + ddGroup: 'FootprintTree', + categoryModel: 'PartKeepr.FootprintCategory', + categoryService: 'FootprintCategory', + folderSort: true, + + /** + * @cfg {String} text The path to the 'add' icon + */ + addButtonIcon: 'resources/icons/footprint_add.png', + + /** + * @cfg {String} text The path to the 'delete' icon + */ + deleteButtonIcon: 'resources/icons/footprint_delete.png', + + /** + * Initializes the component + */ + initComponent: function () { + this.callParent(); + + this.addEvents("itemEdit"); + + this.on("itemclick", Ext.bind(function (t,record) { + if (record.get("footprintId")) { + this.fireEvent("itemEdit", record.get("footprintId")); + } + }, this)); + + this.addButton = Ext.create("Ext.button.Button", + { + tooltip: i18n("Add Footprint"), + icon: this.addButtonIcon, + handler: this._onAddFootprint, + scope: this + }); + + this.deleteButton = Ext.create("Ext.button.Button", { + tooltip: i18n("Delete Footprint"), + icon: this.deleteButtonIcon, + handler: Ext.bind(function () { + this.fireEvent("itemDelete"); + }, this), + disabled: true + }); + + this.toolbar.add(['-', this.addButton, this.deleteButton]); + + this.getSelectionModel().on("select", this._onItemSelect, this); + this.getSelectionModel().on("deselect", this._onItemDeselect, this); + }, + /** + * Called when a footprint is about to be added + */ + _onAddFootprint: function () { + var r = this.getSelectionModel().getLastSelected(); + + if (r && !r.get("footprintId")) { + this.fireEvent("itemAdd", { category: r.get("id") }); + } else { + if (!r) { + this.fireEvent("itemAdd", this.getRootNode().get("id")); + } else { + /* Try to find the category's parent id */ + if (r.parentNode && !r.parentNode.get("footprintId")) { + this.fireEvent("itemAdd", { category: r.parentNode.get("id") }); + } else { + this.fireEvent("itemAdd", this.getRootNode().get("id")); + } + } + + } + }, + /** + * Called when an item was selected + */ + _onItemSelect: function (selectionModel, record) { + this._updateDeleteButton(selectionModel, record); + this.fireEvent("itemSelect", record); + }, + /** + * Called when an item was deselected + */ + _onItemDeselect: function (selectionModel, record) { + this._updateDeleteButton(selectionModel, record); + this.fireEvent("itemDeselect", record); + }, + /** + * Called when an item was selected. Enables/disables the delete button. + */ + _updateDeleteButton: function (selectionModel, record) { + /* Right now, we support delete on a single record only */ + if (this.getSelectionModel().getCount() == 1 && record.get("footprintId")) { + this.deleteButton.enable(); + } else { + this.deleteButton.disable(); + } + }, + syncChanges: function (record) { + var oldRecordIndex = PartKeepr.getApplication().getFootprintStore().find("id", record.get("id")); + + if (oldRecordIndex === -1) { + /* Record doesn't exist yet; add it */ + PartKeepr.getApplication().getFootprintStore().add(record); + } else { + var oldRecord = PartKeepr.getApplication().getFootprintStore().getAt(oldRecordIndex); + oldRecord.set("name", record.get("name")); + } + + this.loadCategories(); + }, + _onCategoriesLoaded: function () { + this.callParent(arguments); + var store = PartKeepr.getApplication().getFootprintStore(); + var category_id; + var nodeData, record; + + for (var i=0;i<store.getCount();i++) { + record = store.getAt(i); + + nodeData = { + name: record.getRecordName(), + footprintId: record.get("id"), + leaf: true, + iconCls:'icon-footprint' + }; + + + if (record.get("category") === 0) { + this.getRootNode().firstChild.appendChild(nodeData); + } else { + var node = this.getRootNode().findChild("id", record.get("category"), true); + + if (node) { + node.appendChild(nodeData); + } else { + this.getRootNode().firstChild.appendChild(nodeData); + } + } + + } + + }, + onBeforeDrop: function (node, data, overModel, dropPosition, dropFunction, options) { + var draggedRecord = data.records[0]; + var droppedOn = this.getView().getRecord(node); + + if (droppedOn.get("footprintId")) { + // Target record is a footprint, we don't allow moving categories onto footprints + return false; + } + + if (draggedRecord.get("footprintId")) { + /* Move Footprint */ + var call = new PartKeepr.ServiceCall("Footprint", "moveFootprint"); + + call.setParameter("id", draggedRecord.get("footprintId")); + call.setParameter("targetCategory", droppedOn.get("id")); + call.setHandler(Ext.bind(function () { + var node = this.getRootNode().findChild("footprintId", draggedRecord.get("footprintId"), true); + + var targetNode = this.getRootNode().findChild("id", droppedOn.get("id"), true); + targetNode.expand(); + + node.remove(); + + targetNode.appendChild(node); + + var oldRecordIndex = PartKeepr.getApplication().getFootprintStore().find("id", draggedRecord.get("footprintId")); + var oldRecord = PartKeepr.getApplication().getFootprintStore().getAt(oldRecordIndex); + + oldRecord.set("category", droppedOn.get("id")); + + }, this)); + call.doCall(); + + return false; + } + + } + +});+ \ No newline at end of file diff --git a/src/frontend/js/Components/Manufacturer/ManufacturerEditor.js b/src/frontend/js/Components/Manufacturer/ManufacturerEditor.js @@ -0,0 +1,129 @@ +Ext.define('PartKeepr.ManufacturerEditor', { + extend: 'PartKeepr.Editor', + alias: 'widget.ManufacturerEditor', + saveText: i18n("Save Manufacturer"), + labelWidth: 150, + initComponent: function () { + this.on("startEdit", Ext.bind(this.onEditStart, this)); + + this.tpl = [ + '<tpl for=".">', + '<div class="thumb-wrap" id="{id}">', + '<div class="thumb"><img src="image.php?type=iclogo&id={id}&w=64&h=64&tmpId={tmp_id}"></div>', + '</div>', + '</tpl>', + '</tpl>', + '<div class="x-clear"></div>' + ]; + + this.addLogoButton = Ext.create("Ext.button.Button", { + cls:'x-btn-text-icon', + icon: "resources/silkicons/add.png", + text: i18n("Add Logo"), + handler: Ext.bind(this.uploadImage, this) + }); + + this.deleteLogoButton = Ext.create("Ext.button.Button", { + cls:'x-btn-text-icon', + icon: "resources/silkicons/delete.png", + text: i18n("Delete Logo"), + disabled: true, + handler: Ext.bind(this.deleteImage, this) + }); + + this.iclogoGrid = Ext.create("Ext.view.View", { + store: null, + border: true, + frame: true, + style: 'background-color: white', + emptyText: 'No images to display', + height: 200, + fieldLabel: i18n("Logos"), + overItemCls: 'x-view-over', + componentCls: 'manufacturer-ic-logos', + itemSelector: 'div.thumb-wrap', + singleSelect: true, + anchor: '100%', + tpl: this.tpl, + listeners: { + selectionchange: Ext.bind(function (view, selections) { + if (selections.length > 0) { + this.deleteLogoButton.enable(); + } else { + this.deleteLogoButton.disable(); + } + }, this) + //this.onLogoSelectionChange.createDelegate(this) + } + }); + + this.items = [{ + xtype: 'textfield', + name: 'name', + fieldLabel: i18n("Manufacturer Name") + },{ + xtype: 'textarea', + name: 'address', + fieldLabel: i18n("Address") + },{ + xtype: 'textfield', + name: 'url', + fieldLabel: i18n("Website") + },{ + xtype: 'textfield', + name: 'email', + fieldLabel: i18n("Email") + },{ + xtype: 'textfield', + name: 'phone', + fieldLabel: i18n("Phone") + },{ + xtype: 'textfield', + name: 'fax', + fieldLabel: i18n("Fax") + },{ + xtype: 'textarea', + name: 'comment', + fieldLabel: i18n("Comment") + },{ + xtype: 'fieldcontainer', + fieldLabel: i18n("Manufacturer Logos"), + items: [{ + xtype: 'panel', + dockedItems: [{ + xtype: 'toolbar', + dock: 'bottom', + items: [ this.addLogoButton, this.deleteLogoButton ] + }], + items: this.iclogoGrid + }] + + }]; + + + this.on("itemSaved", this._onItemSaved, this); + this.callParent(); + + }, + _onItemSaved: function (record) { + this.iclogoGrid.bindStore(record.iclogos()); + }, + onFileUploaded: function (response) { + this.iclogoGrid.getStore().add({ + id: "TMP:"+response.id, + manufacturer_id: this.record.get("id") + }); + }, + uploadImage: function () { + var j = Ext.create("PartKeepr.FileUploadDialog", { imageUpload: true }); + j.on("fileUploaded", Ext.bind(this.onFileUploaded, this)); + j.show(); + }, + deleteImage: function () { + this.iclogoGrid.store.remove(this.iclogoGrid.getSelectionModel().getLastSelected()); + }, + onEditStart: function () { + var store = this.record.iclogos(); + this.iclogoGrid.bindStore(store); + } +});+ \ No newline at end of file diff --git a/src/frontend/js/Components/Manufacturer/ManufacturerEditorComponent.js b/src/frontend/js/Components/Manufacturer/ManufacturerEditorComponent.js @@ -0,0 +1,18 @@ +Ext.define('PartKeepr.ManufacturerEditorComponent', { + extend: 'PartKeepr.EditorComponent', + alias: 'widget.ManufacturerEditorComponent', + navigationClass: 'PartKeepr.ManufacturerGrid', + editorClass: 'PartKeepr.ManufacturerEditor', + newItemText: i18n("New Manufacturer"), + model: 'PartKeepr.Manufacturer', + initComponent: function () { + this.createStore({ + sorters: [{ + property: 'name', + direction:'ASC' + }] + }); + + this.callParent(); + } +});+ \ No newline at end of file diff --git a/src/frontend/js/Components/Manufacturer/ManufacturerGrid.js b/src/frontend/js/Components/Manufacturer/ManufacturerGrid.js @@ -0,0 +1,11 @@ +Ext.define('PartKeepr.ManufacturerGrid', { + extend: 'PartKeepr.EditorGrid', + alias: 'widget.ManufacturerGrid', + columns: [ + {header: i18n("Manufacturer"), dataIndex: 'name', flex: 1} + ], + addButtonText: i18n("Add Manufacturer"), + addButtonIcon: 'resources/silkicons/building_add.png', + deleteButtonText: i18n("Delete Manufacturer"), + deleteButtonIcon: 'resources/silkicons/building_delete.png' +});+ \ No newline at end of file diff --git a/src/frontend/js/Components/Menu.js b/src/frontend/js/Components/Menu.js @@ -0,0 +1,6 @@ +Ext.define('PartKeepr.Menu', { + extend: 'Ext.toolbar.Toolbar', + items: [{ + + }] +});+ \ No newline at end of file diff --git a/src/frontend/js/Components/MenuBar.js b/src/frontend/js/Components/MenuBar.js @@ -0,0 +1,209 @@ +Ext.define('PartKeepr.MenuBar', { + extend: 'Ext.toolbar.Toolbar', + initComponent: function () { + //this.cls = "partkeepr-mainmenu"; + this.ui = "mainmenu"; + + this.menu = Ext.create('Ext.menu.Menu', { + items: [ + { + text: i18n('Footprints'), + icon: 'resources/fugue-icons/icons/fingerprint.png', + handler: this.editFootprints + },{ + text: i18n('Manufacturers'), + icon: 'resources/silkicons/building.png', + handler: this.editManufacturers + },{ + text: i18n('Storage Locations'), + icon: 'resources/fugue-icons/icons/wooden-box.png', + handler: this.editStorageLocations + },{ + text: i18n('Distributors'), + icon: 'resources/silkicons/lorry.png', + handler: this.editDistributors + },{ + text: i18n('Users'), + id: 'edit-users', + handler: this.editUsers, + icon: "resources/silkicons/user.png" + },{ + text: i18n('Part Measure Units'), + handler: this.editPartUnits, + icon: "resources/fugue-icons/icons/ruler.png" + },{ + text: i18n("Statistics"), + icon: 'resources/silkicons/chart_bar.png', + menu: [ + { + text: i18n("Summary"), + handler: this.showStatisticsSummary, + icon: 'resources/silkicons/chart_bar.png' + },{ + text: i18n("Chart"), + handler: this.showStatisticsChart, + icon: 'resources/silkicons/chart_bar.png' + }] + },{ + text: i18n("Units"), + handler: this.editUnits, + icon: 'resources/icons/unit.png' + },{ + text: i18n("System Information"), + handler: this.showSystemInformation, + icon: 'resources/fugue-icons/icons/system-monitor.png' + }] + }); + + this.systemMenu = Ext.create('Ext.menu.Menu', { + items: [ + { + text: i18n('Disconnect'), + icon: 'resources/silkicons/disconnect.png', + handler: this.disconnect + },{ + text: i18n("User Preferences"), + icon: 'resources/fugue-icons/icons/gear.png', + handler: this.showUserPreferences + } + ] + }); + + this.items = [{ + text: i18n("System"), + menu: this.systemMenu + },{ + text: i18n('Menu'), + menu: this.menu + }, + '->', + { + xtype: 'tbtext', + cls: 'partkeepr-logo-align', + text: '<div class="partkeepr-logo">PartKeepr</div>', + width: 200 + }]; + + + + this.callParent(); + }, + showUserPreferences: function () { + var j = new PartKeepr.UserPreferencePanel({ + iconCls: 'icon-gear', + closable: true + }); + + PartKeepr.getApplication().addItem(j); + j.show(); + }, + disconnect: function () { + PartKeepr.getApplication().logout(); + }, + /** + * Shows the system information window + */ + showSystemInformation: function () { + var j = Ext.create("PartKeepr.SystemInformationGrid", { + title: i18n("System Information"), + iconCls: 'icon-system-monitor', + closable: true, + padding: "5 5 5 5" + }); + + + PartKeepr.getApplication().addItem(j); + j.show(); + }, + showStatisticsSummary: function () { + var j = Ext.create("PartKeepr.CurrentStatisticsPanel", { + iconCls: 'icon-chart-bar', + closable: true + }); + + + PartKeepr.getApplication().addItem(j); + j.show(); + }, + showStatisticsChart: function () { + var j = Ext.create("PartKeepr.StatisticsChartPanel", { + iconCls: 'icon-chart-bar', + closable: true + }); + + + PartKeepr.getApplication().addItem(j); + j.show(); + }, + editStorageLocations: function () { + var j = Ext.create("PartKeepr.StorageLocationEditorComponent", { + title: i18n("Storage Locations"), + iconCls: 'icon-wooden-box', + closable: true + }); + + PartKeepr.getApplication().addItem(j); + j.show(); + }, + editUnits: function () { + var j = Ext.create("PartKeepr.UnitEditorComponent", { + title: i18n("Units"), + iconCls: 'icon-unit', + closable: true + }); + + PartKeepr.getApplication().addItem(j); + j.show(); + }, + editManufacturers: function () { + var j = Ext.create("PartKeepr.ManufacturerEditorComponent", { + title: i18n("Manufacturers"), + iconCls: 'icon-building', + closable: true + }); + + PartKeepr.getApplication().addItem(j); + j.show(); + }, + editFootprints: function () { + var j = Ext.create("PartKeepr.FootprintEditorComponent", { + title: i18n("Footprints"), + iconCls: 'icon-footprint', + closable: true + }); + + PartKeepr.getApplication().addItem(j); + j.show(); + }, + editDistributors: function () { + var j = Ext.create("PartKeepr.DistributorEditorComponent", { + title: i18n("Distributors"), + iconCls: 'icon-lorry', + closable: true + }); + + PartKeepr.getApplication().addItem(j); + j.show(); + }, + editUsers: function () { + var j = Ext.create("PartKeepr.UserEditorComponent", { + title: i18n("Users"), + iconCls: 'icon-user', + closable: true + }); + + PartKeepr.getApplication().addItem(j); + j.show(); + }, + editPartUnits: function () { + var j = Ext.create("PartKeepr.PartUnitEditorComponent", { + title: i18n("Part Measurement Units"), + iconCls: 'icon-ruler', + closable: true + }); + + PartKeepr.getApplication().addItem(j); + j.show(); + } +}); + + \ No newline at end of file diff --git a/src/frontend/js/Components/MessageLog.js b/src/frontend/js/Components/MessageLog.js @@ -0,0 +1,22 @@ +Ext.define('PartKeepr.MessageLog', { + extend: 'Ext.grid.Panel', + store: { + model: "PartKeepr.Message" + }, + columns: [ + {header: i18n("Message"), dataIndex: 'message', flex: 1}, + {header: i18n("Date"), dataIndex: 'date', width: 300}, + {header: i18n("Severity"), dataIndex: 'severity'} + ], + proxy: { + type: 'memory', + reader: { + type: 'json', + root: 'items' + } + }, + sorters: [{ + property: 'date', + direction:'DESC' + }] +});+ \ No newline at end of file diff --git a/src/frontend/js/Components/Part/Editor/PartAttachmentGrid.js b/src/frontend/js/Components/Part/Editor/PartAttachmentGrid.js @@ -0,0 +1,6 @@ +Ext.define('PartKeepr.PartAttachmentGrid', { + extend: 'PartKeepr.AttachmentGrid', + alias: 'widget.PartAttachmentGrid', + + model: "PartKeepr.PartAttachment" +});+ \ No newline at end of file diff --git a/src/frontend/js/Components/Part/Editor/PartDistributorGrid.js b/src/frontend/js/Components/Part/Editor/PartDistributorGrid.js @@ -0,0 +1,109 @@ +Ext.define('PartKeepr.PartDistributorGrid', { + extend: 'Ext.grid.Panel', + alias: 'widget.PartDistributorGrid', + border: false, + initComponent: function () { + this.store = Ext.create("Ext.data.Store", { + model: 'PartKeepr.PartDistributor', + proxy: { + type: 'memory', + reader: { + type: 'json' + } + } + + }); + + this.editing = Ext.create('Ext.grid.plugin.RowEditing', { + clicksToEdit: 1 + }); + + this.plugins = [ this.editing ]; + + this.deleteButton = Ext.create("Ext.button.Button", { + text: 'Delete', + disabled: true, + itemId: 'delete', + scope: this, + icon: 'resources/silkicons/lorry_delete.png', + handler: this.onDeleteClick + }); + + this.dockedItems = [{ + xtype: 'toolbar', + items: [{ + text: 'Add', + scope: this, + icon: 'resources/silkicons/lorry_add.png', + handler: this.onAddClick + }, this.deleteButton] + }]; + + this.columns = [ + { + header: i18n("Distributor"), + dataIndex: 'distributor_id', + xtype: 'templatecolumn', + tpl: '{distributor_name}', + flex: 0.4, + editor: { + xtype:'DistributorComboBox', + allowBlank:true + } + }, + { + header: i18n("Order Number"), + dataIndex: 'orderNumber', + flex: 0.4, + editor: { + xtype:'textfield', + allowBlank:true + } + },{ + header: i18n("Packaging Unit"), + dataIndex: 'packagingUnit', + flex: 0.2, + editor: { + xtype:'numberfield', + allowDecimals: false, + allowBlank:false, + minValue: 1 + } + } + ]; + + this.callParent(); + + this.getSelectionModel().on('selectionchange', this.onSelectChange, this); + this.on("edit", this.onEdit, this); + }, + onEdit: function (data) { + var id = data.record.get("distributor_id"); + + var rec = PartKeepr.getApplication().getDistributorStore().findRecord("id", id); + + if (rec) { + data.record.set("distributor_name", rec.get("name")); + } + }, + onAddClick: function () { + this.editing.cancelEdit(); + + var rec = new PartKeepr.PartDistributor({ + packagingUnit: 1 + }); + + this.store.insert(0, rec); + + this.editing.startEdit(0,0); + }, + onDeleteClick: function () { + var selection = this.getView().getSelectionModel().getSelection()[0]; + if (selection) { + this.store.remove(selection); + } + }, + onSelectChange: function(selModel, selections){ + this.deleteButton.setDisabled(selections.length === 0); + } +});+ \ No newline at end of file diff --git a/src/frontend/js/Components/Part/Editor/PartEditor.js b/src/frontend/js/Components/Part/Editor/PartEditor.js @@ -0,0 +1,231 @@ +/** + * @class PartKeepr.PartEditor + + * <p>The PartEditor provides an editing form for a part. It contains multiple tabs, one for each nested record.</p> + */ +Ext.define('PartKeepr.PartEditor', { + extend: 'PartKeepr.Editor', + + // Assigned model + model: 'PartKeepr.Part', + + // Layout stuff + border: false, + layout: 'fit', + bodyStyle: 'background:#DBDBDB;', + + /** + * Initializes the editor fields + */ + initComponent: function () { + + // Defines the basic editor fields + var basicEditorFields = [{ + xtype: 'textfield', + name: 'name', + fieldLabel: i18n("Name"), + allowBlank: false + }, + { + layout: 'column', + bodyStyle: 'background:#DBDBDB', + border: false, + items: [{ + xtype: 'numberfield', + fieldLabel: i18n('Minimum Stock'), + allowDecimals: false, + allowBlank: false, + labelWidth: 150, + name: 'minStockLevel', + value: 0, + columnWidth: 0.5, + minValue: 0 + },{ + xtype: 'PartUnitComboBox', + fieldLabel: i18n("Part Unit"), + columnWidth: 0.5, + margin: "0 0 0 5", + name: 'partUnit', + value: PartKeepr.getApplication().getDefaultPartUnit().get("id") + }] + },{ + xtype: 'CategoryComboBox', + fieldLabel: i18n("Category"), + name: 'category' + },{ + xtype: 'StorageLocationComboBox', + fieldLabel: i18n("Storage Location"), + name: 'storageLocation', + allowBlank: false + },{ + xtype: 'FootprintComboBox', + fieldLabel: i18n("Footprint"), + name: 'footprint' + },{ + xtype: 'textarea', + fieldLabel: i18n("Comment"), + name: 'comment' + },{ + xtype: 'textfield', + fieldLabel: i18n("Status"), + name: 'status' + },{ + xtype: 'checkbox', + hideEmptyLabel: false, + fieldLabel: '', + boxLabel: i18n("Needs Review"), + name: 'needsReview' + }]; + + // Creates the distributor grid + this.partDistributorGrid = Ext.create("PartKeepr.PartDistributorGrid", { + title: i18n("Distributors"), + layout: 'fit' + }); + + // Creates the manufacturer grid + this.partManufacturerGrid = Ext.create("PartKeepr.PartManufacturerGrid", { + title: i18n("Manufacturers"), + layout: 'fit' + }); + + // Creates the parameter grid + this.partParameterGrid = Ext.create("PartKeepr.PartParameterGrid", { + title: i18n("Parameters"), + layout: 'fit' + }); + + // Creates the attachment grid + this.partAttachmentGrid = Ext.create("PartKeepr.PartAttachmentGrid", { + title: i18n("Attachments"), + layout: 'fit' + }); + + // Adds stock level fields for new items + if (this.partMode && this.partMode == "create") { + this.initialStockLevel = Ext.create("Ext.form.field.Number", { + fieldLabel: i18n("Initial Stock Level"), + name: "initialStockLevel", + labelWidth: 150, + columnWidth: 0.5 + }); + + this.initialStockLevelUser = Ext.create("PartKeepr.UserComboBox", { + fieldLabel: i18n("Stock User"), + name: 'initialStockLevelUser', + columnWidth: 0.5, + margin: "0 0 0 5" + }); + + basicEditorFields.push({ + layout: 'column', + bodyStyle: 'background:#DBDBDB', + border: false, + items: [ + this.initialStockLevel, + this.initialStockLevelUser + ] + }); + + this.initialStockLevelPrice = Ext.create("Ext.form.field.Number", { + fieldLabel: i18n('Price'), + labelWidth: 150, + columnWidth: 0.5, + name: 'initialStockLevelPrice' + }); + + this.initialStockLevelPricePerItem = Ext.create("Ext.form.field.Checkbox", { + boxLabel: i18n("Per Item"), + columnWidth: 0.5, + margin: "0 0 0 5", + name: 'initialStockLevelPricePerItem' + }); + + basicEditorFields.push({ + layout: 'column', + bodyStyle: 'background:#DBDBDB', + border: false, + items: [ + this.initialStockLevelPrice, + this.initialStockLevelPricePerItem + ] + }); + + + } + + // Create a tab panel of all fields + this.items = { + xtype: 'tabpanel', + border: false, + plain: true, + items: [{ + xtype: 'panel', + border: false, + autoScroll: true, + layout: 'anchor', + defaults: { + anchor: '100%', + labelWidth: 150 + }, + bodyStyle: 'background:#DBDBDB;padding: 10px;', + title: i18n("Basic Data"), + items: basicEditorFields + }, + this.partDistributorGrid, + this.partManufacturerGrid, + this.partParameterGrid, + this.partAttachmentGrid + ] + }; + + this.on("startEdit", this.onEditStart, this, { delay: 200 }); + this.on("itemSaved", this._onItemSaved, this); + + this.addEvents("partSaved", "titleChange"); + + this.callParent(); + + }, + onEditStart: function () { + this.bindChildStores(); + }, + _onItemSaved: function () { + this.fireEvent("partSaved", this.record); + + if (this.keepOpenCheckbox.getValue() !== true) { + this.fireEvent("editorClose"); + } else { + var newItem = Ext.create("PartKeepr.Part", this.partDefaults); + this.editItem(newItem); + } + }, + bindChildStores: function () { + this.partDistributorGrid.bindStore(this.record.distributors()); + this.partManufacturerGrid.bindStore(this.record.manufacturers()); + this.partParameterGrid.bindStore(this.record.parameters()); + this.partAttachmentGrid.bindStore(this.record.attachments()); + }, + onItemSave: function () { + if (!this.getForm().isValid()) { + return; + } + + this.callParent(); + }, + _setTitle: function (title) { + var tmpTitle; + + if (this.record.phantom) { + tmpTitle = i18n("Add Part"); + } else { + tmpTitle = i18n("Edit Part"); + } + + if (title !== "") { + tmpTitle = tmpTitle + ": " + title; + } + + this.fireEvent("titleChange", tmpTitle); + } +}); diff --git a/src/frontend/js/Components/Part/Editor/PartEditorWindow.js b/src/frontend/js/Components/Part/Editor/PartEditorWindow.js @@ -0,0 +1,96 @@ +/** + * @class PartKeepr.PartEditorWindow + + * <p>The PartEditorWindow encapsulates the PartKeepr.PartEditor within a window.</p> + */ +Ext.define('PartKeepr.PartEditorWindow', { + extend: 'Ext.window.Window', + + /* Constrain the window to fit the viewport */ + constrainHeader: true, + + /* Fit the editor within the window */ + layout: 'fit', + + /* Width and height settings */ + width: 600, + minWidth: 600, + minHeight: 390, + height: 390, + + saveText: i18n("Save"), + cancelText: i18n("Cancel"), + + /* Default edit mode. If mode = "create", we show additional fields */ + partMode: 'edit', + title: i18n("Add Part"), + + /** + * Creates the part editor and put it into the window. + */ + initComponent: function () { + this.editor = Ext.create("PartKeepr.PartEditor", { + border: false, + partMode: this.partMode, + enableButtons: false + }); + + /* If the edit mode is "create", we need to enlarge the window a bit to fit the fields without scrolling */ + if (this.partMode && this.partMode == "create") { + this.height = 445; + } + + this.items = [ this.editor ]; + + /** + * We need a delay, since if others are listening for "editorClose", the dialog plus the record could be destroyed + * before any following listeners have a chance to receive the record, resulting in strange problems. + */ + this.editor.on("editorClose", function (record) { this.close();}, this, { delay: 200 }); + + this.editor.on("titleChange", function (val) { this.setTitle(val); }, this); + + this.saveButton = Ext.create("Ext.button.Button", { + text: this.saveText, + cls: 'x-btn-text-icon', + icon: 'resources/fugue-icons/icons/disk.png', + handler: Ext.bind(this.onItemSave, this) + }); + + this.cancelButton = Ext.create("Ext.button.Button", { + text: this.cancelText, + cls: 'x-btn-text-icon', + icon: 'resources/silkicons/cancel.png', + handler: Ext.bind(this.onCancelEdit, this) + }); + + this.bottomToolbar = Ext.create("Ext.toolbar.Toolbar", { + enableOverflow: true, + defaults: {minWidth: 100}, + dock: 'bottom', + ui: 'footer', + pack: 'start', + items: [ this.saveButton, this.cancelButton ] + }); + + this.dockedItems = [ this.bottomToolbar ]; + + this.keepOpenCheckbox = Ext.create("Ext.form.field.Checkbox", { + boxLabel: i18n("Create blank item after save") + }); + + if (this.partMode == "create") { + this.bottomToolbar.add(this.keepOpenCheckbox); + } + + this.editor.keepOpenCheckbox = this.keepOpenCheckbox; + + this.callParent(); + }, + onCancelEdit: function () { + this.editor.onCancelEdit(); + }, + onItemSave: function () { + this.editor.onItemSave(); + } +}); diff --git a/src/frontend/js/Components/Part/Editor/PartManufacturerGrid.js b/src/frontend/js/Components/Part/Editor/PartManufacturerGrid.js @@ -0,0 +1,99 @@ +Ext.define('PartKeepr.PartManufacturerGrid', { + extend: 'Ext.grid.Panel', + alias: 'widget.PartManufacturerGrid', + border: false, + initComponent: function () { + this.store = Ext.create("Ext.data.Store", { + model: 'PartKeepr.PartManufacturer', + proxy: { + type: 'memory', + reader: { + type: 'json' + } + } + + }); + + this.editing = Ext.create('Ext.grid.plugin.RowEditing', { + clicksToEdit: 1 + }); + + this.plugins = [ this.editing ]; + + this.deleteButton = Ext.create("Ext.button.Button", { + text: 'Delete', + disabled: true, + itemId: 'delete', + scope: this, + icon: 'resources/silkicons/building_delete.png', + handler: this.onDeleteClick + }); + + this.dockedItems = [{ + xtype: 'toolbar', + items: [{ + text: 'Add', + scope: this, + icon: 'resources/silkicons/building_add.png', + handler: this.onAddClick + }, this.deleteButton] + }]; + + this.columns = [ + { + header: i18n("Manufacturer"), + dataIndex: 'manufacturer_id', + xtype: 'templatecolumn', + tpl: '{manufacturer_name}', + flex: 0.4, + editor: { + xtype:'ManufacturerComboBox', + allowBlank:true + } + }, + { + header: i18n("Part Number"), + dataIndex: 'partNumber', + flex: 0.4, + editor: { + xtype:'textfield', + allowBlank:true + } + } + ]; + + this.callParent(); + + this.getSelectionModel().on('selectionchange', this.onSelectChange, this); + this.on("edit", this.onEdit, this); + }, + onEdit: function (data) { + var id = data.record.get("manufacturer_id"); + + var rec = PartKeepr.getApplication().getManufacturerStore().findRecord("id", id); + + if (rec) { + data.record.set("manufacturer_name", rec.get("name")); + } + }, + onAddClick: function () { + this.editing.cancelEdit(); + + var rec = new PartKeepr.PartManufacturer({ + packagingUnit: 1 + }); + + this.store.insert(0, rec); + + this.editing.startEdit(0,0); + }, + onDeleteClick: function () { + var selection = this.getView().getSelectionModel().getSelection()[0]; + if (selection) { + this.store.remove(selection); + } + }, + onSelectChange: function(selModel, selections){ + this.deleteButton.setDisabled(selections.length === 0); + } +});+ \ No newline at end of file diff --git a/src/frontend/js/Components/Part/Editor/PartParameterGrid.js b/src/frontend/js/Components/Part/Editor/PartParameterGrid.js @@ -0,0 +1,149 @@ +Ext.define('PartKeepr.PartParameterGrid', { + extend: 'Ext.grid.Panel', + alias: 'widget.PartParameterGrid', + border: false, + initComponent: function () { + this.store = Ext.create("Ext.data.Store", { + model: 'PartKeepr.PartParameter', + proxy: { + type: 'memory', + reader: { + type: 'json' + } + } + }); + + this.editing = Ext.create('Ext.grid.plugin.CellEditing', { + clicksToEdit: 1, + listeners: { + scope: this, + beforeedit: this.onBeforeEdit, + edit: this.onAfterEdit + } + }); + + this.plugins = [ this.editing ]; + + this.deleteButton = Ext.create("Ext.button.Button", { + text: 'Delete', + disabled: true, + itemId: 'delete', + scope: this, + icon: 'resources/silkicons/building_delete.png', + handler: this.onDeleteClick + }); + + this.dockedItems = [{ + xtype: 'toolbar', + items: [{ + text: 'Add', + scope: this, + icon: 'resources/silkicons/building_add.png', + handler: this.onAddClick + }, this.deleteButton] + }]; + + this.columns = [ + { + header: i18n("Parameter"), + dataIndex: 'name', + flex: 0.2, + editor: { + xtype:'PartParameterComboBox', + allowBlank:false, + lazyRender: true, + listClass: 'x-combo-list-small', + selectOnTab: true + } + }, + { + header: i18n("Value"), + flex: 0.2, + dataIndex: "prefixedValue", + renderer: function (val,p,rec) { + if (!Ext.isObject(val)) { return ""; } + + var foundRec = PartKeepr.getApplication().getUnitStore().findRecord("id", rec.get("unit_id")); + + if (foundRec) { + return val.value + " "+val.symbol + foundRec.get("symbol"); + } else { + return val.value + " "+val.symbol; + } + + }, + editor: { + xtype: 'SiUnitField', + decimalPrecision: 20 + } + }, + { + header: i18n("Unit"), + flex: 0.2, + dataIndex: 'unit_id', + renderer: function (val,p,rec) { + var foundRec = PartKeepr.getApplication().getUnitStore().findRecord("id", val); + + if (foundRec) { + return foundRec.get("name"); + } else { + return ""; + } + }, + editor: { + xtype:'UnitComboBox', + allowBlank:true + } + }, + { + header: i18n("Description"), + dataIndex: 'description', + flex: 0.3, + editor: { + xtype:'textfield', + allowBlank:true + } + } + ]; + + this.callParent(); + + this.getSelectionModel().on('selectionchange', this.onSelectChange, this); + }, + onAddClick: function () { + this.editing.cancelEdit(); + + var rec = new PartKeepr.PartParameter({ + + }); + + this.store.insert(0, rec); + + this.editing.startEditByPosition({ row: 0, column: 0}); + }, + onDeleteClick: function () { + var selection = this.getView().getSelectionModel().getSelection()[0]; + if (selection) { + this.store.remove(selection); + } + }, + onSelectChange: function(selModel, selections){ + this.deleteButton.setDisabled(selections.length === 0); + }, + onBeforeEdit: function (editor, e, o) { + var header = this.headerCt.getHeaderAtIndex(editor.colIdx); + var edit = this.editing.getEditor(editor.record, header); + + if (editor.field == "prefixedValue") { + var unit = PartKeepr.getApplication().getUnitStore().getById(editor.record.get("unit_id")); + if (unit) { + edit.field.setStore(unit.prefixes()); + } + } + }, + onAfterEdit: function (editor, e) { + var f = e.record.get("prefixedValue"); + e.record.set("siprefix_id", f.siprefix_id); + e.record.set("value", f.value); + } +});+ \ No newline at end of file diff --git a/src/frontend/js/Components/Part/PartCategoryTree.js b/src/frontend/js/Components/Part/PartCategoryTree.js @@ -0,0 +1,53 @@ +Ext.define("PartKeepr.PartCategoryTree", { + extend: 'PartKeepr.CategoryEditorTree', + alias: 'widget.PartCategoryTree', + + ddGroup: 'PartTree', + categoryModel: 'PartKeepr.PartCategory', + categoryService: 'PartCategory', + initComponent: function () { + this.addEvents("syncCategory"); + this.callParent(); + + this.syncButton = Ext.create("Ext.button.Button", { + tooltip: i18n("Reveal Category"), + icon: 'resources/fugue-icons/icons/arrow-split-180.png', + handler: Ext.bind(function () { + this.fireEvent("syncCategory"); + }, this), + disabled: true + }); + this.toolbar.add(['->', this.syncButton]); + }, + + onBeforeDrop: function (node, data, overModel, dropPosition, dropFunction, options) { + var draggedRecord = data.records[0]; + var droppedOn = this.getView().getRecord(node); + + if (draggedRecord.modelName == "PartKeepr.Part") { + /* Move Part */ + var call = new PartKeepr.ServiceCall("Part", "movePart"); + + if (data.records.length > 1) { + var sources = []; + + for (var i=0;i<data.records.length;i++) { + sources.push(data.records[i].get("id")); + } + + call.setParameter("parts", sources); + } else { + call.setParameter("part", draggedRecord.get("id")); + } + + call.setParameter("targetCategory", droppedOn.get("id")); + call.setHandler(function () { + data.view.store.load(); + }); + call.doCall(); + + return false; + } + + } +});+ \ No newline at end of file diff --git a/src/frontend/js/Components/Part/PartDisplay.js b/src/frontend/js/Components/Part/PartDisplay.js @@ -0,0 +1,189 @@ +/** + * @class PartKeepr.PartDisplay + * <p>This component displays information about a specific part.</p> + */ +Ext.define('PartKeepr.PartDisplay', { + extend: 'Ext.panel.Panel', + bodyCls: 'partdisplay', + + /** + * Initializes the component and adds a template as well as the add/remove stock and edit part buttons. + */ + initComponent: function () { + /** + * Create the template + */ + this.tpl = new Ext.XTemplate( + '<h1>{name}</h1>', + '<table>', + '<tr>', + '<td class="o">'+i18n("Category")+':</td>', + '<td style="width: 100%;" class="o">{categoryName}</td>', + '</tr>', + '<tr>', + '<td class="e">'+i18n("Stock Level")+':</td>', + '<td class="e">{stockLevel}</td>', + '</tr>', + '<tr>', + '<td class="o">'+i18n("Minimum Stock Level")+':</td>', + '<td class="o">{minStockLevel}</td>', + '</tr>', + '<tr>', + '<td class="e">'+i18n("Footprint")+':</td>', + '<td class="e">{footprintName}</td>', + '</tr>', + '<tr>', + '<td style="white-space: nowrap;" class="o">'+i18n("Storage Location")+':</td>', + '<td class="o">{storageLocationName}</td>', + '</tr>', + '<tr>', + '<td class="e">'+i18n("Comment")+':</td>', + '<td class="e">{comment}</td>', + '</tr>', + '<tr>', + '<td class="o">'+i18n("Create Date")+':</td>', + '<td class="o">{createDate}</td>', + '</tr>', + '<tr>', + '<td class="e">'+i18n("Status")+':</td>', + '<td class="e">{status}</td>', + '</tr>', + '<tr>', + '<td class="o">'+i18n("Needs Review")+':</td>', + '<td class="o">{needsReview}</td>', + '</tr>', + '</table>'); + + /** + * Create the "add stock" button + */ + this.addButton = new Ext.Button({ + text: i18n("Add Stock"), + cls:'x-btn-text-icon', + icon: 'resources/silkicons/brick_add.png', + handler: Ext.bind(this.addPartPrompt, this) + }); + + /** + * Create the "remove stock" button + */ + this.deleteButton = new Ext.Button({ + text: i18n("Remove Stock"), + cls:'x-btn-text-icon', + icon: 'resources/silkicons/brick_delete.png', + handler: Ext.bind(this.deletePartPrompt, this) + }); + + /** + * Create the "edit part" button + */ + this.editButton = new Ext.Button({ + text: i18n("Edit Part"), + icon: 'resources/silkicons/brick_edit.png', + handler: Ext.bind(function () { this.fireEvent("editPart", this.record.get("id"));}, this) + }); + + /** + * Create the toolbar which holds our buttons + */ + this.tbar = Ext.create("Ext.toolbar.Toolbar", { + enableOverflow: true, + items: [ + this.addButton, + this.deleteButton, + this.editButton + ] + }); + + /** + * Add the event "editPart". This event is fired as soon as the "edit" button is clicked. + * + * @todo Add the events "addStock" and "removeStock" and manage these events from the PartManager. + */ + this.addEvents("editPart"); + + this.callParent(); + }, + /** + * Sets the values for the template. + * + * Note that the data of the record is applied with htmlentities(), i.e. <b>Test</b> will be + * displayed as such and not in bold. + */ + setValues: function (r) { + this.record = r; + + var values = {}; + for (var i in r.data) { + if (r.data[i] !== null) { + values[i] = htmlentities(r.data[i]); + } else { + values[i] = r.data[i]; + } + } + + this.tpl.overwrite(this.getTargetEl(), values); + }, + /** + * Prompt the user for the stock level he wishes to add. + */ + addPartPrompt: function () { + var j = new PartKeepr.PartStockWindow({ partUnitName: this.record.get("partUnitName") }); + j.addStock(this.addPartHandler, this); + }, + /** + * Callback after the "add stock" dialog is complete. + */ + addPartHandler: function (quantity, price) { + var call = new PartKeepr.ServiceCall( + "Part", + "addStock"); + call.setParameter("stock", quantity); + call.setParameter("price", price); + call.setParameter("part", this.record.get("id")); + call.setHandler(Ext.bind(this.reloadPart, this)); + call.doCall(); + }, + /** + * Prompts the user for the stock level to decrease for the item. + */ + deletePartPrompt: function () { + var j = new PartKeepr.PartStockWindow({ partUnitName: this.record.get("partUnitName") }); + j.removeStock(this.deletePartHandler, this); + }, + /** + * Callback after the "delete stock" dialog is complete. + */ + deletePartHandler: function (quantity) { + var call = new PartKeepr.ServiceCall( + "Part", + "deleteStock"); + call.setParameter("stock", quantity); + call.setParameter("part", this.record.get("id")); + call.setHandler(Ext.bind(this.reloadPart, this)); + call.doCall(); + }, + /** + * Reloads the current part + */ + reloadPart: function () { + this.loadPart(this.record.get("id")); + }, + /** + * Load the part from the database. + */ + loadPart: function (id) { + PartKeepr.Part.load(id, { + scope: this, + success: this.onPartLoaded + }); + }, + /** + * Callback after the part is loaded + */ + onPartLoaded: function (record) { + this.record = record; + this.setValues(this.record); + this.record.commit(); + } +});+ \ No newline at end of file diff --git a/src/frontend/js/Components/Part/PartFilterPanel.js b/src/frontend/js/Components/Part/PartFilterPanel.js @@ -0,0 +1,163 @@ +Ext.define('PartKeepr.PartFilterPanel', { + extend: 'Ext.form.Panel', + alias: 'widget.PartFilterPanel', + bodyPadding: '10px', + layout: 'column', + bodyStyle: 'background:#DBDBDB;', + initComponent: function () { + + // Create the filter fields + this.createFilterFields(); + + + // Creates the left column of the filter panel + this.leftColumn = { + xtype: 'container', + anchor: '100%', + layout: 'anchor', + columnWidth: 0.5, + items: [ + this.storageLocationFilter, + this.categoryFilter, + this.partsWithoutPrice + ] + }; + + // Creates the right column of the filter panel + this.rightColumn = { + xtype: 'container', + anchor: '100%', + columnWidth: 0.5, + layout: 'anchor', + items: [ + this.stockFilter + ] + }; + + // Apply both columns to this panel + this.items = [ this.leftColumn, this.rightColumn ]; + + // Create the reset button + this.resetButton = Ext.create("Ext.button.Button", { + text: i18n("Reset"), + handler: this.onReset, + cls: 'x-btn-text-icon', + icon: 'resources/diagona-icons/icons/16/101.png', + scope: this + }); + + // Create the apply button + this.applyButton = Ext.create("Ext.button.Button", { + text: i18n("Apply"), + cls: 'x-btn-text-icon', + icon: 'resources/diagona-icons/icons/16/102.png', + handler: this.onApply, + scope: this + }); + + // Append both buttons to a toolbar + this.dockedItems = [{ + xtype: 'toolbar', + enableOverflow: true, + dock: 'bottom', + defaults: {minWidth: 100}, + items: [ this.applyButton, this.resetButton ] + }]; + + this.callParent(); + }, + /** + * Applies the parameters from the filter panel to the proxy, then + * reload the store to refresh the grid. + */ + onApply: function () { + this.applyFilterParameters(this.store.getProxy().extraParams); + this.store.getProxy().extraParams.start = 0; + this.store.currentPage = 1; + this.store.load({ start: 0}); + }, + /** + * Resets the fields to their original values, then call onApply() + * to reload the store. + */ + onReset: function () { + this.storageLocationFilter.setValue(""); + this.categoryFilter.setValue({ category: 'all'}); + this.stockFilter.setValue({ stock: 'any'}); + + this.onApply(); + }, + /** + * Creates the filter fields required for this filter panel + */ + createFilterFields: function () { + + // Create the storage location filter field + this.storageLocationFilter = Ext.create("PartKeepr.StorageLocationComboBox", { + fieldLabel: i18n("Storage Location"), + forceSelection: true + }); + + // Create the category scope field + this.categoryFilter = Ext.create("Ext.form.RadioGroup", { + fieldLabel: i18n("Category Scope"), + columns: 1, + items: [{ + boxLabel: i18n("All Subcategories"), + name: 'category', + inputValue: "all", + checked: true + }, + { + boxLabel: i18n("Selected Category"), + name: 'category', + inputValue: "selected" + }] + }); + + // Create the stock level filter field + this.stockFilter = Ext.create("Ext.form.RadioGroup", { + fieldLabel: i18n("Stock Mode"), + columns: 1, + items: [{ + boxLabel: i18n("Any Stock Level"), + name: 'stock', + inputValue: "any", + checked: true + },{ + boxLabel: i18n("Stock Level = 0"), + name: 'stock', + inputValue: "zero" + },{ + boxLabel: i18n("Stock Level > 0"), + name: 'stock', + inputValue: "nonzero" + },{ + boxLabel: i18n("Stock Level < Minimum Stock Level"), + name: 'stock', + inputValue: "below" + }] + }); + + this.partsWithoutPrice = Ext.create("Ext.form.field.Checkbox", { + fieldLabel: i18n("Item Price"), + boxLabel: i18n("Show Parts without Price only") + }); + }, + /** + * Applies the filter parameters to the passed extraParams object. + * @param extraParams An object containing the extraParams from a proxy. + */ + applyFilterParameters: function (extraParams) { + extraParams.withoutPrice = this.partsWithoutPrice.getValue(); + extraParams.categoryScope = this.categoryFilter.getValue().category; + extraParams.stockMode = this.stockFilter.getValue().stock; + + /** + * Get the raw (=text) value. I really wish that ExtJS would handle selected values (from a store) + * distinct than entered values. + */ + extraParams.storageLocation = this.storageLocationFilter.getRawValue(); + } + +});+ \ No newline at end of file diff --git a/src/frontend/js/Components/Part/PartStockHistory.js b/src/frontend/js/Components/Part/PartStockHistory.js @@ -0,0 +1,137 @@ +Ext.define('PartKeepr.PartStockHistory', { + extend: 'Ext.grid.Panel', + alias: 'widget.PartStockHistory', + + columns: [ + { + header: "", + xtype:'actioncolumn', + dataIndex: 'direction', + renderer: function (val) { + if (val == "out") + { + return '<img title="'+i18n("Parts removed")+'" src="resources/silkicons/brick_delete.png"/>'; + } else { + return '<img title="'+i18n("Parts added")+'" src="resources/silkicons/brick_add.png"/>'; + } + }, + width: 20 + }, + { + header: i18n("User"), + dataIndex: 'user_id', + flex: 0.4, + minWidth: 80, + renderer: function (val) { + var rec = PartKeepr.getApplication().getUserStore().getById(val); + + if (rec) { + return rec.get("username"); + } else { + return i18n("Unknown user"); + } + + }, + editor: { + xtype: 'UserComboBox' + } + }, + {header: i18n("Amount"), dataIndex: 'amount', width: 50, + editor: { + xtype:'numberfield', + allowBlank:false + }}, + {header: i18n("Date"), dataIndex: 'datetime', width: 120}, + { + header: i18n("Price"), + editor: { + xtype:'numberfield', + allowBlank:false + }, + dataIndex: 'price', + width: 60, + renderer: function (val, p, rec) { + if (rec.get("dir") == "out") { + return "-"; + } else { + return val; + } + } + } + ], + model: 'PartKeepr.StockEntry', + /** + * Initializes the stock history grid. + */ + initComponent: function () { + var config = { + autoLoad: false, + autoSync: true, + remoteFilter: false, + remoteSort: false, + model: 'PartKeepr.StockEntry', + pageSize: -1}; + + this.store = Ext.create('Ext.data.Store', config); + + this.editing = Ext.create('Ext.grid.plugin.CellEditing', { + clicksToEdit: 1 + }); + + this.plugins = [ this.editing ]; + + this.editing.on("beforeedit", this.onBeforeEdit, this); + + this.on("activate", this.onActivate, this); + this.callParent(); + }, + /** + * Called before editing a cell. Checks if the user may actually make the requested changes. + * + * @param e Passed from ExtJS + * @returns {Boolean} + */ + onBeforeEdit: function (e) { + + // Checks if the usernames match + var sameUser = e.record.get("username") == PartKeepr.getApplication().getUsername(); + + switch (e.field) { + case "price": + // Check the direction is "out". If yes, editing the price field is not allowed + if (e.record.get("direction") == "out") { + return false; + } + + // If it's not the same user or an admin, editing is not allowed + if ( !sameUser && !PartKeepr.getApplication().isAdmin()) { + return false; + } + break; + case "amount": + // Only an admin may edit the amount. Regular users must put the stock back in manually. + if (!PartKeepr.getApplication().isAdmin()) { + return false; + } + break; + case "user": + if (!PartKeepr.getApplication().isAdmin()) { + return false; + } + break; + default: + return true; + } + + return true; + }, + /** + * Called when the view is activated. + */ + onActivate: function () { + var proxy = this.store.getProxy(); + proxy.extraParams.item = this.part; + + this.store.load(); + } +}); diff --git a/src/frontend/js/Components/Part/PartStockWindow.js b/src/frontend/js/Components/Part/PartStockWindow.js @@ -0,0 +1,152 @@ +/** + * This class defines a window which is used to in- or decrease the stock level + * for a specific part. Logic and service calls are not contained in this window, + * and need to be implemented from the caller. + */ +Ext.define('PartKeepr.PartStockWindow', { + extend: 'Ext.window.Window', + + // Configurations + constrainHeader: true, + width: 300, + height: 150, + + resizable: false, + layout: 'fit', + + // We set the title later + title: "", + + // Window title texts + removePartText: i18n("Remove Part(s)"), + addPartText: i18n("Add Part(s)"), + + layout: 'anchor', + bodyStyle: { + padding: "5px" + }, + + /* + * Initializes the window with the quantity and price fields. + * The price field is hidden when a stock decrease happens. + */ + initComponent: function () { + + this.quantityField = Ext.create("Ext.form.field.Number", { + value: 0, // The initial value is 0, to indicate that this is a number field + minValue: 1, // The minimum value is 1. That way we force the user to enter a value + width: 100, + listeners: { + specialkey: { + fn: function(field, e){ + if (e.getKey() == e.ENTER) { + this.onOKClick(); + } + }, + scope: this + } + } + }); + + this.priceField = Ext.create("Ext.form.field.Number", { + hideTrigger: true, + keyNavEnabled: false, + mouseWheelEnabled: false, + anchor: '100%', + value: 0, + fieldLabel: i18n("Price"), + listeners: { + specialkey: { + fn: function(field, e){ + if (e.getKey() == e.ENTER) { + this.onOKClick(); + } + }, + scope: this + } + } + }); + + this.priceCheckbox = Ext.create("Ext.form.field.Checkbox", { + boxLabel: i18n("Price per item"), + hideEmptyLabel: false, + checked: true + }); + + this.form = Ext.create("Ext.form.Panel", { + bodyStyle: 'background:#DBDBDB;', + border: false, + items: [{ + xtype: 'fieldcontainer', + fieldLabel: i18n("Quantity"), + layout: 'hbox', + items: [ this.quantityField, { width: 75, xtype: 'displayfield', margin: "0 0 0 5", value: this.partUnitName }] + }, this.priceField, this.priceCheckbox ] + }); + + this.items = this.form; + + this.buttons = [ + { + text: i18n("Close"), + handler: this.onCloseClick, + scope: this + },{ + text: i18n("OK"), + handler: this.onOKClick, + scope: this + }]; + this.on("show", function () { this.quantityField.focus(); }, this); + this.callParent(); + }, + /** + * Closes the window + */ + onCloseClick: function () { + this.close(); + }, + /** + * Checks if the form is valid. If yes, execute the callback. + */ + onOKClick: function () { + if (this.form.getForm().isValid()) { + var price; + if (this.priceCheckbox.getValue()) { + price = this.priceField.getValue(); + } else { + price = this.priceField.getValue() / this.quantityField.getValue(); + } + + Ext.callback(this.callbackFn, this.callbackScope, [ this.quantityField.getValue(), price ]); + this.close(); + } + }, + /** + * Opens the window in "add stock" mode. The target callback receives two parameters: + * the value of the quantity field and the value of the price field. + * + * @param fn The callback + * @param scope The scope in which to execute the callback + */ + addStock: function (fn, scope) { + this.callbackFn = fn; + this.callbackScope = scope; + this.setTitle(this.addPartText); + this.show(); + }, + /** + * Opens the window in "remove stock" mode. The target callback receives one parameters: + * the value of the quantity field + * + * @param fn The callback + * @param scope The scope in which to execute the callback + */ + removeStock: function (fn, scope) { + this.callbackFn = fn; + this.callbackScope = scope; + this.setTitle(this.removePartText); + this.priceField.hide(); + this.priceCheckbox.hide(); + this.show(); + } +});+ \ No newline at end of file diff --git a/src/frontend/js/Components/Part/PartsGrid.js b/src/frontend/js/Components/Part/PartsGrid.js @@ -0,0 +1,157 @@ +/** + * This class is the main part list grid. + * + */ +Ext.define('PartKeepr.PartsGrid', { + extend: 'PartKeepr.EditorGrid', + alias: 'widget.PartsGrid', + + // We want to display the texts for the add/delete buttons + buttonTextMode: 'show', + + addButtonText: i18n("Add Part"), + addButtonIcon: 'resources/silkicons/brick_add.png', + deleteButtonText: i18n("Delete Part"), + deleteButtonIcon: 'resources/silkicons/brick_delete.png', + + viewConfig: { + plugins: { + ddGroup: 'CategoryTree', + ptype: 'gridviewdragdrop', + enableDrop: false + } + }, + enableDragDrop : true, + stripeRows : true, + multiSelect : true, + autoScroll: false, + invalidateScrollerOnRefresh: true, + initComponent: function () { + + var groupingFeature = Ext.create('Ext.grid.feature.Grouping',{ + //enableGroupingMenu: false, + groupHeaderTpl: '{name} ({rows.length} ' + i18n("Part(s)")+")" + }); + + // Create the columns + this.defineColumns(); + + + this.features = [groupingFeature]; + + this.on("itemdblclick", this.onDoubleClick, this); + + this.addEvents("editPart"); + + // Bugfix for scroller becoming detached. + // @todo Remove with ExtJS 4.1 + this.on('scrollershow', function(scroller) { + if (scroller && scroller.scrollEl) { + scroller.clearManagedListeners(); + scroller.mon(scroller.scrollEl, 'scroll', scroller.onElScroll, scroller); + } + }); + + // Initialize the panel + this.callParent(); + + }, + /** + * Called when the record was double-clicked + */ + onDoubleClick: function (view, record) { + if (record) { + this.fireEvent("editPart", record.get("id")); + } + }, + /** + * Defines the columns used in this grid. + */ + defineColumns: function () { + this.columns = [ + { + header: "", + dataIndex: "", + width: 30, + renderer: this.iconRenderer + }, + { + header: i18n("Name"), + dataIndex: 'name', + flex: 1, + minWidth: 200, + renderer: Ext.util.Format.htmlEncode + },{ + header: i18n("Storage Location"), + dataIndex: 'storageLocationName' + },{ + header: i18n("Status"), + dataIndex: "status" + },{ + header: i18n("Stock"), + dataIndex: 'stockLevel', + renderer: this.stockLevelRenderer + },{ + header: i18n("Min. Stock"), + dataIndex: 'minStockLevel', + renderer: this.stockLevelRenderer + },{ + header: i18n("Avg. Price"), + dataIndex: 'averagePrice' + },{ + header: i18n("Footprint"), + dataIndex: 'footprintName' + },{ + header: i18n("Category"), + dataIndex: 'categoryPath', + hidden: true + },{ + header: i18n("Create Date"), + dataIndex: 'createDate', + hidden: true + } + + ]; + }, + /** + * Used as renderer for the stock level columns. + * + * If a part contains a non-default unit, we display it. + * Otherwise we hide it. + */ + stockLevelRenderer: function (val,q,rec) + { + if (rec.get("partUnitDefault") !== true) { + return val + " " + rec.get("partUnitName"); + } else { + return val; + } + }, + /** + * Used as renderer for the icon column. + */ + iconRenderer: function (val,q,rec) + { + var ret = ""; + if (rec.get("attachmentCount") > 0) { + ret += '<img src="resources/silkicons/attach.png" alt="'+i18n("Has attachments")+'" title="'+i18n("Has attachments")+'"/>'; + } + + return ret; + }, + /** + * Sets the category. Triggers a store reload with a category filter. + */ + setCategory: function (category) { + this.currentCategory = category; + + var proxy = this.store.getProxy(); + + proxy.extraParams.category = category; + this.searchField.onTrigger1Click(); + + proxy.extraParams.start = 0; + this.store.currentPage = 1; + this.store.load({ start: 0}); + } +});+ \ No newline at end of file diff --git a/src/frontend/js/Components/Part/PartsManager.js b/src/frontend/js/Components/Part/PartsManager.js @@ -0,0 +1,264 @@ +/** + * @class PartKeepr.PartManager + * @todo Document the editor system a bit better + * + * The part manager encapsulates the category tree, the part display grid and the part detail view. + */ +Ext.define('PartKeepr.PartManager', { + extend: 'Ext.panel.Panel', + alias: 'widget.PartManager', + layout: 'border', + border: false, + padding: 5, + initComponent: function () { + + /** + * Create the store with the default sorter "name ASC" + */ + this.createStore({ + model: 'PartKeepr.Part', + groupField: 'categoryPath', + sorters: [{ + property: 'name', + direction:'ASC' + }] + }); + + // Create the tree + this.tree = Ext.create("PartKeepr.PartCategoryTree", { + region: 'west', + categoryModel: 'PartKeepr.PartCategory', + categoryService: 'PartCategory', + split: true, + title: i18n("Categories"), + ddGroup: 'CategoryTree', + width: 300, // @todo Make this configurable + collapsible: true // We want to collapse the tree panel on small screens + }); + + // Trigger a grid reload on category change + this.tree.on("selectionchange", Ext.bind(function (t,s) { + if (s.length > 0) { + this.grid.setCategory(s[0].get("id")); + } + }, this)); + + // Create the detail panel + this.detail = Ext.create("PartKeepr.PartDisplay", { title: i18n("Part Details") }); + this.detail.on("editPart", this.onEditPart, this); + + // Create the grid + this.grid = Ext.create("PartKeepr.PartsGrid", { title: i18n("Parts List"), region: 'center', layout: 'fit', store: this.getStore()}); + this.grid.on("editPart", this.onEditPart, this); + + // Create the grid listeners + this.grid.on("itemSelect", this.onItemSelect, this); + this.grid.on("itemDeselect", this.onItemSelect, this); + this.grid.on("itemAdd", this.onItemAdd, this); + this.grid.on("itemDelete", this.onItemDelete, this); + this.tree.on("syncCategory", this.onSyncCategory, this); + + // Listen on the partChanged event, which is fired when the users edits the part + this.detail.on("partChanged", function () { this.grid.getStore().load(); }, this); + + // Create the stock level panel + this.stockLevel = Ext.create("PartKeepr.PartStockHistory", { title: "Stock History"}); + + this.detailPanel = Ext.create("Ext.tab.Panel", { + title: i18n("Part Details"), + hidden: true, + region: 'east', + split: true, + width: 300, + items: [ this.detail, this.stockLevel ] + }); + + this.filterPanel = Ext.create("PartKeepr.PartFilterPanel", { + region: 'south', + title: i18n("Filter"), + height: 200, + split: true, + collapsed: true, + collapsible: true, + store: this.store + }); + + this.items = [ this.tree, { + layout: 'border', + border: false, + region: 'center', + items: [ this.grid, this.filterPanel ] + }, this.detailPanel ]; + + + this.callParent(); + }, + /** + * Called when the sync button was clicked. Highlights the category + * of the selected part for a short time. We can't select the category + * as this would affect the parts grid. + */ + onSyncCategory: function () { + var r = this.grid.getSelectionModel().getLastSelected(); + + var rootNode = this.tree.getRootNode(); + var cat = r.get("category"); + + var node = rootNode.findChild("id", cat, true); + + this.tree.getView().ensureVisible(node); + this.tree.getView().scrollIntoView(node); + + var htmlNode = new Ext.Element(this.tree.getView().getNode(node)); + + htmlNode.highlight("2aaad3"); + }, + /** + * Called when the delete button was clicked. + * + * Prompts the user if he really wishes to delete the part. If yes, it calls deletePart. + */ + onItemDelete: function () { + var r = this.grid.getSelectionModel().getLastSelected(); + + Ext.Msg.confirm(i18n("Delete Part"), sprintf(i18n("Do you really wish to delete the part %s?"),r.get("name")), this.deletePart, this); + }, + /** + * Deletes the selected part. + * + * @param {String} btn The clicked button in the message box window. + * @todo We use the current selection of the grid. If for some reason the selection changes during the user is prompted, + * we delete the wrong part. Fix that to pass the selected item to the onItemDelete then to this function. + */ + deletePart: function (btn) { + var r = this.grid.getSelectionModel().getLastSelected(); + + if (btn == "yes") { + var call = new PartKeepr.ServiceCall( + "Part", + "deletePart"); + + call.setLoadMessage(sprintf(i18n("Deleting part %s"), r.get("name"))); + call.setParameter("part", r.get("id")); + call.setHandler(Ext.bind(function () { + this.store.load(); + }, this)); + call.doCall(); + } + }, + /** + * Creates a new, empty part editor window + */ + onItemAdd: function () { + var j = Ext.create("PartKeepr.PartEditorWindow", { + partMode: 'create' + }); + + var defaults = {}; + + var defaultPartUnit = PartKeepr.getApplication().getPartUnitStore().findRecord("default", true); + + defaults.partUnit = defaultPartUnit.get("id"); + defaults.category = this.grid.currentCategory; + + record = Ext.create("PartKeepr.Part", defaults); + + // Inject the defaults to the editor, so the editor can create a new item on its own + j.editor.partDefaults = defaults; + + j.editor.editItem(record); + j.show(); + }, + /** + * Called when a part was edited. Refreshes the grid. + */ + onEditPart: function (id) { + this.loadPart(id, Ext.bind(this.onPartLoaded, this)); + }, + /** + * Called when a part was loaded. Displays the part in the editor window. + */ + onPartLoaded: function (f,g) { + var j = Ext.create("PartKeepr.PartEditorWindow"); + j.editor.on("partSaved", this.onPartSaved, this); + j.editor.editItem(f); + j.show(); + }, + onPartSaved: function (record) { + + var idx = this.grid.store.find("id", record.get("id")); + + // Only reload the grid if the edited record is contained + if (idx !== -1) { + this.grid.store.load(); + } + + this.detail.setValues(record); + }, + /** + * Called when a part was selected in the grid. Displays the details for this part. + */ + onItemSelect: function () { + if (this.grid.getSelectionModel().getCount() > 1) { + this.detailPanel.hide(); + this.tree.syncButton.disable(); + } else if (this.grid.getSelectionModel().getCount() == 1) { + var r = this.grid.getSelectionModel().getLastSelected(); + + this.detailPanel.setActiveTab(this.detail); + this.detailPanel.show(); + this.detail.setValues(r); + this.stockLevel.part = r.get("id"); + + this.tree.syncButton.enable(); + } else { + this.tree.syncButton.disable(); + } + + }, + /** + * Triggers loading of a part + * @param {Integer} id The ID of the part to load + * @param {Function} handler The callback to call when the part was loaded + */ + loadPart: function (id, handler) { + // @todo we have this method duplicated in PartEditor + var model = Ext.ModelManager.getModel("PartKeepr.Part"); + + model.load(id, { + scope: this, + success: handler + }); + }, + /** + * Creates the store + */ + createStore: function (config) { + Ext.Object.merge(config, { + autoLoad: true, + autoSync: false, // Do not change. If true, new (empty) records would be immediately commited to the database. + remoteFilter: true, + remoteSort: true, + pageSize: 50}); + + this.store = Ext.create('Ext.data.Store', config); + + // Workaround for bug http://www.sencha.com/forum/showthread.php?133767-Store.sync()-does-not-update-dirty-flag&p=607093#post607093 + this.store.on('write', function(store, operation) { + var success=operation.wasSuccessful(); + if (success) { + Ext.each(operation.records, function(record){ + if (record.dirty) { + record.commit(); + } + }); + } + }); + }, + /** + * Returns the store + */ + getStore: function () { + return this.store; + } +});+ \ No newline at end of file diff --git a/src/frontend/js/Components/PartUnit/PartUnitEditor.js b/src/frontend/js/Components/PartUnit/PartUnitEditor.js @@ -0,0 +1,14 @@ +Ext.define('PartKeepr.PartUnitEditor', { + extend: 'PartKeepr.Editor', + alias: 'widget.PartUnitEditor', + items: [{ + xtype: 'textfield', + name: 'name', + fieldLabel: i18n("Measurement Unit Name") + },{ + xtype: 'textfield', + name: 'shortName', + fieldLabel: i18n("Short Name") + }], + saveText: i18n("Save Part Measurement Unit") +}); diff --git a/src/frontend/js/Components/PartUnit/PartUnitEditorComponent.js b/src/frontend/js/Components/PartUnit/PartUnitEditorComponent.js @@ -0,0 +1,20 @@ +Ext.define('PartKeepr.PartUnitEditorComponent', { + extend: 'PartKeepr.EditorComponent', + alias: 'widget.PartUnitEditorComponent', + navigationClass: 'PartKeepr.PartUnitGrid', + editorClass: 'PartKeepr.PartUnitEditor', + newItemText: i18n("New Part Measurement Unit"), + deleteMessage: i18n("Do you really wish to delete the part measurement unit'%s'?"), + deleteTitle: i18n("Delete Part Measurement Unit"), + model: 'PartKeepr.PartUnit', + initComponent: function () { + this.createStore({ + sorters: [{ + property: 'name', + direction:'ASC' + }] + }); + + this.callParent(); + } +});+ \ No newline at end of file diff --git a/src/frontend/js/Components/PartUnit/PartUnitGrid.js b/src/frontend/js/Components/PartUnit/PartUnitGrid.js @@ -0,0 +1,51 @@ +Ext.define('PartKeepr.PartUnitGrid', { + extend: 'PartKeepr.EditorGrid', + alias: 'widget.PartUnitGrid', + columns: [ + {header: i18n("Part Measurement Unit"), dataIndex: 'name', flex: 1}, + {header: i18n("Default"), dataIndex: 'default', width: 60, renderer: function (val) { if (val === true) { return "✓"; } else { return ""; }}} + ], + addButtonText: i18n("Add Part Measurement Unit"), + addButtonIcon: "resources/fugue-icons/icons/ruler--plus.png", + deleteButtonText: i18n("Delete Part Measurement Unit"), + deleteButtonIcon: "resources/fugue-icons/icons/ruler--minus.png", + defaultButtonIcon: "resources/fugue-icons/icons/ruler--pencil.png", + initComponent: function () { + this.callParent(); + + this.defaultButton = Ext.create("Ext.button.Button", { + icon: this.defaultButtonIcon, + tooltip: i18n('Mark Part Measurement Unit as Default'), + disabled: true, + handler: this.onDefaultClick, + scope: this + }); + + this.getSelectionModel().on("deselect", + Ext.bind(function (rsm, r, i) { + this.defaultButton.disable(); + }, this)); + + this.getSelectionModel().on("select", + Ext.bind(function (rsm, r, i) { + this.defaultButton.enable(); + }, this)); + this.topToolbar.insert(2, {xtype: 'tbseparator'}); + this.topToolbar.insert(3, this.defaultButton); + }, + onDefaultClick: function () { + var r = this.getSelectionModel().getLastSelected(); + + var call = new PartKeepr.ServiceCall( + "PartUnit", + "setDefault"); + + call.setParameter("id", r.get("id")); + + call.setHandler(Ext.bind(this.onDefaultHandler, this)); + call.doCall(); + }, + onDefaultHandler: function () { + this.store.load(); + } +});+ \ No newline at end of file diff --git a/src/frontend/js/Components/Statistics/CurrentStatisticsPanel.js b/src/frontend/js/Components/Statistics/CurrentStatisticsPanel.js @@ -0,0 +1,92 @@ +Ext.define('PartKeepr.CurrentStatisticsPanel', { + extend: 'Ext.panel.Panel', + width: 400, + height: 250, + title: i18n("Current Statistics"), + bodyStyle: { + padding: "5px" + }, + layout: 'fit', + /** + * Initializes the component and adds a template + */ + initComponent: function () { + /** + * Create the template + */ + this.tpl = new Ext.XTemplate( + '<h1>'+i18n("Current Statistics")+'</h1>', + '<table>', + '<tr>', + '<td style="width: 200px;" class="o">'+i18n("Different Parts")+':</td>', + '<td style="width: 200px;" class="o">{partCount}</td>', + '</tr>', + '<tr>', + '<td style="width: 200px;" class="e">'+i18n("Total Part Value")+':</td>', + '<td style="width: 200px;" class="e">{totalPrice}</td>', + '</tr>', + '<tr>', + '<td style="width: 200px;" class="o">'+i18n("Average Part Value")+':</td>', + '<td style="width: 200px;" class="o">{averagePrice}</td>', + '</tr>', + '<tr>', + '<td style="width: 200px;" class="e">'+i18n("Parts with price")+':</td>', + '<td style="width: 200px;" class="e">{partsWithPrice}</td>', + '</tr>', + '<tr>', + '<td style="width: 200px;" class="o">'+i18n("Parts without price")+':</td>', + '<td style="width: 200px;" class="o">{partsWithoutPrice}</td>', + '</tr>', + '<tr>', + '<td class="e">'+i18n("Categories")+':</td>', + '<td class="e">{categoryCount}</td>', + '</tr>', + '</table>', + '<h1>'+i18n("Counts per Unit")+'</h1>', + '<table>', + '<tpl for="units">', + '<tr>', + '<td style="width: 200px;" class="{[xindex % 2 === 0 ? "e" : "o"]}">{name}</td>', + '<td style="width: 200px;" class="{[xindex % 2 === 0 ? "e" : "o"]}">{stockLevel}</td>', + '</tr>', + '</tpl>', + '</table>'); + + this.tbButtons = [{ + text: i18n("Refresh"), + handler: this.loadStats, + scope: this + },{ + text: i18n("Close"), + handler: this.close, + scope: this + }]; + + this.dockedItems = [{ + xtype: 'toolbar', + dock: 'bottom', + ui: 'footer', + items: this.tbButtons + }]; + + this.view = Ext.create("Ext.panel.Panel", { + autoScroll: true + }); + + this.items = this.view; + this.callParent(); + + this.loadStats(); + }, + loadStats: function () { + var call = new PartKeepr.ServiceCall( + "Statistic", + "getCurrentStats"); + + call.setHandler(Ext.bind(this.onStatsLoaded, this)); + call.doCall(); + }, + onStatsLoaded: function (data) { + this.tpl.overwrite(this.view.getTargetEl(), data); + } +});+ \ No newline at end of file diff --git a/src/frontend/js/Components/Statistics/StatisticsChart.js b/src/frontend/js/Components/Statistics/StatisticsChart.js @@ -0,0 +1,133 @@ +Ext.define('PartKeepr.StatisticsChart', { + extend: 'Ext.chart.Chart', + animate: true, + shadow: true, + + style: 'border: 1px solid #AAA;background-color: white;box-shadow: 5px 5px 0px #aaa', + legend: { + position: 'right' + }, + theme: 'Base', + series: [{ + type: 'line', + highlight: { + size: 7, + radius: 7 + }, + axis: 'left', + xField: 'start', + yField: 'parts', + tips: { + trackMouse: true, + width: 170, + height: 28, + renderer: function(storeItem, item) { + this.setTitle(Ext.Date.format(storeItem.get('start'), "Y-m-d") + ": " + storeItem.get("parts") +" " + i18n("Parts")); + } + }, + title: i18n("Parts"), + markerConfig: { + type: 'cross', + size: 4, + radius: 4, + 'stroke-width': 0 + } + }, { + type: 'line', + highlight: { + size: 7, + radius: 7 + }, + tips: { + trackMouse: true, + width: 170, + height: 28, + renderer: function(storeItem, item) { + this.setTitle(Ext.Date.format(storeItem.get('start'), "Y-m-d") + ": " + storeItem.get("categories") +" " + i18n("Categories")); + } + }, + axis: 'left', + title: i18n("Categories"), + smooth: true, + xField: 'start', + yField: 'categories', + markerConfig: { + type: 'circle', + size: 4, + radius: 4, + 'stroke-width': 0 + } + }], + initComponent: function () { + + /** + * Defines the first axis, which indicates the count. + */ + this.axis1 = { + type: 'Numeric', + minimum: 0, + position: 'left', + fields: ['parts', 'categories'], + title: i18n("Count"), + minorTickSteps: 1, + grid: { + odd: { + opacity: 1, + fill: '#eee', + stroke: '#bbb', + 'stroke-width': 0.5 + }, + even: { + opacity: 1, + stroke: '#bbb', + 'stroke-width': 0.5 + } + } + }; + + /** + * Defines the second axis, which indicates the time. + */ + this.axis2 = { + type: 'Time', + dateFormat: 'Y-m-d', + position: 'bottom', + aggregateOp: "avg", + fields: ['start'], + title: i18n("Date"), + grid: true + }; + + this.axes = [ this.axis1, this.axis2 ]; + + this.store = Ext.create("Ext.data.Store", { + model: 'PartKeepr.StatisticSample', + proxy: { + type: 'ajax', + reader: { + type: 'json', + root: 'response.data' + }, + url : 'service.php', + extraParams: { + "service": "Statistic", + "call": "getSampledStatistics", + "startDateTime": "2011-01-01 00:00:00", + "endDateTime": "2011-12-01 00:00:00" + }, + headers: { + session :PartKeepr.getApplication().getSession() + } + }, + autoLoad: false + }); + + this.callParent(); + }, + setStart: function (date) { + this.store.getProxy().extraParams.startDateTime = Ext.Date.format(date, "Y-m-d H:i:s"); + }, + setEnd: function (date) { + this.store.getProxy().extraParams.endDateTime = Ext.Date.format(date, "Y-m-d H:i:s"); + } +});+ \ No newline at end of file diff --git a/src/frontend/js/Components/Statistics/StatisticsChartPanel.js b/src/frontend/js/Components/Statistics/StatisticsChartPanel.js @@ -0,0 +1,65 @@ +Ext.define('PartKeepr.StatisticsChartPanel', { + extend: 'Ext.form.Panel', + title: i18n("Statistics Chart"), + + layout: 'anchor', + bodyStyle: 'background:#DBDBDB;padding: 15px;', + + initComponent: function () { + this.chart = Ext.create("PartKeepr.StatisticsChart", { anchor: '100% -60' }); + + this.dateSelector1 = Ext.create("Ext.form.field.Date", { + style: 'margin-top: 10px', + fieldLabel: i18n("From"), + listeners: { + change: Ext.bind(this.onDateChanged, this) + } + }); + + this.dateSelector2 = Ext.create("Ext.form.field.Date", { + fieldLabel: i18n("To"), + listeners: { + change: Ext.bind(this.onDateChanged, this) + } + }); + + this.items = [ this.chart, this.dateSelector1, this.dateSelector2 ]; + + this.reloadDates(); + + this.callParent(); + }, + onDateChanged: function () { + this.chart.setStart(this.dateSelector1.getValue()); + this.chart.setEnd(this.dateSelector2.getValue()); + this.chart.store.load(); + }, + reloadDates: function () { + var call = new PartKeepr.ServiceCall("Statistic", "getStatisticRange"); + call.setHandler(Ext.bind(this.onReloadDates, this)); + call.doCall(); + }, + onReloadDates: function (data) { + var start = Ext.Date.parse(data.data.start, "Y-m-d H:i:s"); + var end = Ext.Date.parse(data.data.end, "Y-m-d H:i:s"); + + this.dateSelector1.setMinValue(start); + this.dateSelector1.setMaxValue(end); + this.dateSelector1.suspendEvents(); + + this.dateSelector1.setValue(start); + this.dateSelector1.resumeEvents(); + + + this.dateSelector2.setMinValue(start); + this.dateSelector2.setMaxValue(end); + + this.dateSelector2.suspendEvents(); + this.dateSelector2.setValue(end); + this.dateSelector2.resumeEvents(); + + this.chart.setStart(start); + this.chart.setEnd(end); + this.chart.store.load(); + } +});+ \ No newline at end of file diff --git a/src/frontend/js/Components/Statusbar.js b/src/frontend/js/Components/Statusbar.js @@ -0,0 +1,67 @@ +Ext.define('PartKeepr.Statusbar', { + extend: 'Ext.ux.statusbar.StatusBar', + + defaultText: i18n("Ready."), + defaultIconCls: 'x-status-valid', + iconCls: 'x-status-valid', + autoClear: 3000, + initComponent: function () { + + this.connectionButton = new PartKeepr.ConnectionButton(); + this.connectionButton.on("click", this.onConnectionButtonClick, this); + this.timeDisplay = new PartKeepr.TimeDisplay(); + this.currentUserDisplay = Ext.create("Ext.toolbar.TextItem"); + + this.currentUserDisplay.setText(i18n("Not logged in")); + + this.showMessageLog = Ext.create("Ext.Button",{ + icon: 'resources/silkicons/application_osx_terminal.png', + cls: 'x-btn-icon', + handler: function () { + PartKeepr.getApplication().toggleMessageLog(); + } + }); + + Ext.apply(this, { + items: [ + this.currentUserDisplay, + {xtype: 'tbseparator'}, + this.timeDisplay, + { xtype: 'tbseparator' }, + this.showMessageLog, + { xtype: 'tbseparator' }, + this.connectionButton + + ] + }); + + + this.callParent(); + }, + getConnectionButton: function () { + return this.connectionButton; + }, + setCurrentUser: function (username) { + this.currentUserDisplay.setText(i18n("Logged in as")+": "+username); + }, + startLoad: function (message) { + if (message !== null) { + this.showBusy({text: message, iconCls: "x-status-busy"}); + } else { + this.showBusy(); + } + }, + endLoad: function () { + this.clearStatus({useDefaults: true}); + }, + onConnectionButtonClick: function () { + if (PartKeepr.getApplication().getSession()) { + PartKeepr.getApplication().logout(); + } else { + var o = new PartKeepr.LoginDialog(); + o.show(); + } + } +}); + + diff --git a/src/frontend/js/Components/StorageLocation/StorageLocationEditor.js b/src/frontend/js/Components/StorageLocation/StorageLocationEditor.js @@ -0,0 +1,79 @@ +Ext.define('PartKeepr.StorageLocationEditor', { + extend: 'PartKeepr.Editor', + alias: 'widget.StorageLocationEditor', + saveText: i18n("Save Storage Location"), + + layout: 'column', + + initComponent: function () { + var config = {}; + + Ext.Object.merge(config, { + autoLoad: false, + model: "PartKeepr.Part", + autoSync: false, // Do not change. If true, new (empty) records would be immediately commited to the database. + remoteFilter: true, + remoteSort: true, + pageSize: 15}); + + this.store = Ext.create('Ext.data.Store', config); + + this.gridPanel = Ext.create("Ext.grid.Panel", { + store: this.store, + columnLines: true, + columns: [ + { + header: i18n("Name"), + dataIndex: 'name', + flex: 1, + minWidth: 200, + renderer: Ext.util.Format.htmlEncode + } + ] + }); + + var container = Ext.create("Ext.form.FieldContainer", { + fieldLabel: i18n("Contained Parts"), + labelWidth: 110, + layout: 'fit', + height: 246, + items: this.gridPanel + }); + + + + this.items = [{ + columnWidth: 1, + minWidth: 500, + layout: 'anchor', + xtype: 'container', + margin: '0 5 0 0', + items: [{ + xtype: 'textfield', + name: 'name', + labelWidth: 110, + fieldLabel: i18n("Storage Location") + }, + container + ]}, + { + width: 370, + height: 250, + xtype: 'remoteimagefield', + name: 'image_id', + imageType: 'storagelocation', + imageWidth: 256, + imageHeight: 256, + labelWidth: 110, + fieldLabel: i18n("Image") + }]; + + this.on("startEdit", this.onStartEdit, this); + this.callParent(); + }, + onStartEdit: function () { + this.store.getProxy().extraParams.storageLocation = this.record.get("name"); + this.store.load(); + } + +});+ \ No newline at end of file diff --git a/src/frontend/js/Components/StorageLocation/StorageLocationEditorComponent.js b/src/frontend/js/Components/StorageLocation/StorageLocationEditorComponent.js @@ -0,0 +1,18 @@ +Ext.define('PartKeepr.StorageLocationEditorComponent', { + extend: 'PartKeepr.EditorComponent', + alias: 'widget.StorageLocationEditorComponent', + navigationClass: 'PartKeepr.StorageLocationGrid', + editorClass: 'PartKeepr.StorageLocationEditor', + newItemText: i18n("New Storage Location"), + model: 'PartKeepr.StorageLocation', + initComponent: function () { + this.createStore({ + sorters: [{ + property: 'name', + direction:'ASC' + }] + }); + + this.callParent(); + } +});+ \ No newline at end of file diff --git a/src/frontend/js/Components/StorageLocation/StorageLocationGrid.js b/src/frontend/js/Components/StorageLocation/StorageLocationGrid.js @@ -0,0 +1,45 @@ +Ext.define('PartKeepr.StorageLocationGrid', { + extend: 'PartKeepr.EditorGrid', + alias: 'widget.StorageLocationGrid', + columns: [ + {header: i18n("Storage Location"), dataIndex: 'name', flex: 1} + ], + addButtonText: i18n("Add Storage Location"), + addButtonIcon: 'resources/fugue-icons/icons/wooden-box--plus.png', + deleteButtonText: i18n("Delete Storage Location"), + deleteButtonIcon: 'resources/fugue-icons/icons/wooden-box--minus.png', + initComponent: function () { + this.callParent(); + + // Adds a button which shows the multi-create window + this.multiCreateButton = Ext.create("Ext.button.Button", { + icon: 'resources/icons/storagelocation_multiadd.png', + tooltip: i18n("Multi-create storage locations"), + handler: this.onMultiCreateClick, + scope: this + }); + + this.topToolbar.insert(2, {xtype: 'tbseparator'}); + this.topToolbar.insert(3, this.multiCreateButton); + }, + /** + * Creates a new storage location multi-create window. + */ + onMultiCreateClick: function () { + var j = Ext.create("PartKeepr.StorageLocationMultiCreateWindow", { + listeners: { + destroy: { + fn: this.onMultiCreateWindowDestroy, + scope: this + } + } + }); + j.show(); + }, + /** + * Reloads the store after the multi-create window was closed + */ + onMultiCreateWindowDestroy: function () { + this.store.load(); + } +});+ \ No newline at end of file diff --git a/src/frontend/js/Components/StorageLocation/StorageLocationMultiAddDialog.js b/src/frontend/js/Components/StorageLocation/StorageLocationMultiAddDialog.js @@ -0,0 +1,206 @@ +/** + * Represents a form which is used to create multiple storage locations at once. + * @class PartKeepr.StorageLocationMultiAddDialog + */ +Ext.define('PartKeepr.StorageLocationMultiAddDialog', { + extend: 'Ext.form.Panel', + + // Layout settings + layout: 'anchor', + defaults: { + anchor: '100%' + }, + + // Styling + border: false, + bodyStyle: 'background:#DBDBDB;padding: 10px;', + + /** + * Initializes the component. Adds all form fields + */ + initComponent: function () { + + /** + * The prefix represents the first part of the storage location name, + * e.g. "A" for storage locations "A0001". + */ + this.storageLocationPrefix = Ext.create("Ext.form.field.Text", { + fieldLabel: i18n("Name Prefix"), + listeners: { + change: { + fn: this.onFormChange, + scope: this + } + } + }); + + /** + * Specifies the start of the numeric range. + */ + this.storageLocationStart = Ext.create("Ext.form.field.Number", { + fieldLabel: i18n("Start"), + value: 1, + minValue: 0, + columnWidth: 0.5, + listeners: { + change: { + fn: this.onFormChange, + scope: this + } + } + }); + + /** + * Specifies the end of the numeric range. + */ + this.storageLocationEnd = Ext.create("Ext.form.field.Number", { + fieldLabel: i18n("End"), + value: 10, + minValue: 1, + columnWidth: 0.5, + margin: "0 0 0 5", + listeners: { + change: { + fn: this.onFormChange, + scope: this + } + } + }); + + /** + * Specifies if the storage locations should be prefixed with a zero (e.g. creates A0001 instead of A1). + */ + this.storageLocationZeroPrefix = Ext.create("Ext.form.field.Checkbox", { + boxLabel: i18n("Prefix with zeroes"), + hideEmptyLabel: false, + columnWidth: 0.5, + listeners: { + change: { + fn: this.onFormChange, + scope: this + } + } + }); + + /** + * Specifies the overall length of the storage location name. If you have a prefix "A" and numbers up to + * 100, you can set the overall length to 5 to achieve "A0100", or to 6 to achieve "A00100". + */ + this.storageLocationOverallLength = Ext.create("Ext.form.field.Number", { + fieldLabel: i18n("Length"), + columnWidth: 0.5, + margin: "0 0 0 5", + disabled: true, + listeners: { + change: { + fn: this.onFormChange, + scope: this + } + } + }); + + /** + * Creates a field which displays the storage locations to be created. + */ + this.outputField = Ext.create("Ext.form.field.TextArea", { + fieldLabel: i18n("Sample"), + readOnly: true, + anchor: '100% -70' + }); + + this.items = [ + this.storageLocationPrefix, + { + layout: 'column', + border: false, + bodyStyle: 'background:#DBDBDB;', + items: [ + this.storageLocationStart, + this.storageLocationEnd + ] + }, + { + layout: 'column', + border: false, + plain: true, + bodyStyle: 'background:#DBDBDB;', + items: [ + this.storageLocationZeroPrefix, + this.storageLocationOverallLength + ] + }, + this.outputField + ]; + + this.callParent(); + + this.recalculateDemo(); + }, + /** + * Called when something in the form has changed. + */ + onFormChange: function () { + /** + * If the overall length is less than the prefix plus the length of the highest number, update it + */ + if (this.storageLocationOverallLength.getValue() < this.getMinLength()) { + this.storageLocationOverallLength.setValue(this.getMinLength()); + } + + /** + * Make sure that the end value is bigger than the start value. + */ + if (this.storageLocationStart.getValue() > this.storageLocationEnd.getValue()) { + this.storageLocationEnd.setValue(this.storageLocationStart.getValue()); + } + + /** + * Enable/Disable the length field if zero prefix is wanted + */ + if (this.storageLocationZeroPrefix.getValue()) { + this.storageLocationOverallLength.enable(); + } else { + this.storageLocationOverallLength.disable(); + } + + this.recalculateDemo(); + }, + /** + * Calculates the minimum length possible + * @returns int The minimum length possible + */ + getMinLength: function () { + return strlen(this.storageLocationPrefix.getValue()) + + strlen((this.storageLocationEnd.getValue()).toString()); + }, + /** + * Updates the sample field + */ + recalculateDemo: function () { + this.outputField.setValue(implode("\n", this.getStorageLocations())); + }, + /** + * Returns all storage locations which are to be created + * @returns {Array} The storage locations + */ + getStorageLocations: function () { + var j = []; + + for (var i=this.storageLocationStart.getValue();i<this.storageLocationEnd.getValue()+1;i++) { + if (!this.storageLocationZeroPrefix.getValue()) { + // No padding wanted + j.push(this.storageLocationPrefix.getValue()+i); + } else { + var padLength = this.storageLocationOverallLength.getValue() - + ( strlen(this.storageLocationPrefix.getValue()) + + strlen(i)); + + j.push(this.storageLocationPrefix.getValue() + str_repeat("0", padLength)+ i); + } + + } + + return j; + } + +});+ \ No newline at end of file diff --git a/src/frontend/js/Components/StorageLocation/StorageLocationMultiAddWindow.js b/src/frontend/js/Components/StorageLocation/StorageLocationMultiAddWindow.js @@ -0,0 +1,83 @@ +/** + * Represents the multi create window. + * @class PartKeepr.StorageLocationMultiCreateWindow + */ +Ext.define("PartKeepr.StorageLocationMultiCreateWindow", { + extend: 'Ext.Window', + + // Layout stuff + layout: 'fit', + width: 500, + height: 250, + + // Title + title: i18n("Multi-Create Storage Locations"), + + /** + * Initializes the window by adding the buttons and the form + */ + initComponent: function () { + this.form = Ext.create("PartKeepr.StorageLocationMultiAddDialog"); + + this.items = [ this.form ]; + + // Creates the add button as instance, so we can disable it easily. + this.addButton = Ext.create("Ext.button.Button", { + text: i18n("Create Storage Locations"), + icon: 'resources/silkicons/add.png', + handler: this.onAddClick, + scope: this + }); + + this.dockedItems = [{ + xtype: 'toolbar', + defaults: {minWidth: 100}, + dock: 'bottom', + ui: 'footer', + pack: 'start', + items: [this.addButton, + { + text: i18n("Close"), + handler: this.onCloseClick, + scope: this, + icon: 'resources/silkicons/cancel.png' + }] + }]; + + this.callParent(); + }, + /** + * Called when the "Add" button was clicked. Sends a call to the server + * to create the storage locations + */ + onAddClick: function () { + this.addButton.disable(); + var call = new PartKeepr.ServiceCall("StorageLocation", "massCreate"); + call.setParameter("storageLocations", this.form.getStorageLocations()); + call.setHandler(Ext.bind(this.onAdded, this)); + call.doCall(); + + }, + /** + * Called when the service call was completed. Displays an error dialog + * if something went wrong. + * @param response The server response + */ + onAdded: function (response) { + this.addButton.enable(); + + + if (response.data.length > 0) { + Ext.Msg.alert(i18n("Errors occured"), implode("<br>", response.data)); + } else { + this.close(); + } + }, + /** + * Close the dialog + */ + onCloseClick: function () { + this.close(); + } + +});+ \ No newline at end of file diff --git a/src/frontend/js/Components/SystemInformation/SystemInformationGrid.js b/src/frontend/js/Components/SystemInformation/SystemInformationGrid.js @@ -0,0 +1,101 @@ +/** + * This class represents a list of all system information records. + */ +Ext.define('PartKeepr.SystemInformationGrid', { + extend: 'Ext.grid.Panel', + + /* Define the columns */ + columns: [ + { + header: 'Name', + dataIndex: 'name', + width: 200 + },{ + header: 'Value', + dataIndex: 'value', + flex:1 + },{ + header: 'Category', + dataIndex: 'category', + hidden: true + } + ], + + /** + * Initializes the component + */ + initComponent: function () { + + /* Add grouping */ + var groupingFeature = Ext.create('Ext.grid.feature.Grouping',{ + groupHeaderTpl: '{name}' + }); + + this.features = [groupingFeature]; + + /* Create the store using an in-memory proxy */ + this.store = Ext.create("Ext.data.Store", { + model: 'PartKeepr.SystemInformationRecord', + sorters: ['category','name'], + groupField: 'category', + proxy: { + type: 'memory' + } + }); + + + /* Add the refresh button */ + this.refreshButton = Ext.create("Ext.button.Button", { + handler: this.requestSystemInformation, + scope: this, + text: i18n("Refresh") + }); + + this.bottomToolbar = Ext.create("Ext.toolbar.Toolbar", { + dock: 'bottom', + ui: 'footer', + items: [ this.refreshButton ] + }); + + this.dockedItems = [ this.bottomToolbar ]; + + // Initialize the panel + this.callParent(); + + // Retrieve the system information + this.requestSystemInformation(); + + }, + /** + * Requests the system information from the server. + */ + requestSystemInformation: function () { + var call = new PartKeepr.ServiceCall("System", "getSystemInformation"); + call.setHandler(Ext.bind(this.processSystemInformationRecords, this)); + call.doCall(); + }, + /** + * Processes the response given by the getSystemInformation call. + * + * Removes all records from the store and re-creates the records. + * + * @param response The response record + */ + processSystemInformationRecords: function (response) { + this.store.removeAll(); + + // Workaround for removeAll Bug - see http://www.sencha.com/forum/showthread.php?136673-4.0.2-store.removeAll()-does-not-perform-view.all.clear() + this.view.all.clear(); + + for (var i=0;i<response.data.length;i++) { + var rec = new PartKeepr.SystemInformationRecord({ + category: response.data[i].category, + name: response.data[i].name, + value: response.data[i].value + }); + + this.store.insert(0, rec); + + } + } +});+ \ No newline at end of file diff --git a/src/frontend/js/Components/TimeDisplay.js b/src/frontend/js/Components/TimeDisplay.js @@ -0,0 +1,29 @@ +Ext.define('PartKeepr.TimeDisplay', { + extend: 'Ext.Toolbar.TextItem', + el: null, + dt: null, + enable:Ext.emptyFn, + disable:Ext.emptyFn, + focus:Ext.emptyFn, + constructor: function () { + var s = document.createElement("span"); + s.className = "ytb-text"; + var dt = new Date(); + s.innerHTML = Ext.Date.format(dt, Ext.getDateFormat()); + + Ext.defer(this.onUpdate, 240, this); + this.el = s; + + this.callParent(arguments); + }, + onUpdate: function (obj) { + var dt = new Date(); + this.setText(Ext.Date.format(dt, Ext.getDateFormat())); + delete dt; + /* Sometimes the time display seems to be "stuck" (=skipping one second) + * because of micro-delays due to the "overhead" of calling this method. + */ + Ext.defer(this.onUpdate, 240, this); + } +}); + diff --git a/src/frontend/js/Components/TipOfTheDay/TipOfTheDayWindow.js b/src/frontend/js/Components/TipOfTheDay/TipOfTheDayWindow.js @@ -0,0 +1,318 @@ +/** + * This class represents the tip of the day window and its logic. + */ +Ext.define("PartKeepr.TipOfTheDayWindow", { + extend: 'Ext.window.Window', + + /* Defines the title template. */ + titleTemplate: i18n("Tip of the Day"), + + /* Cosmetic settings */ + width: 600, + height: 300, + + minWidth: 600, + minHeight: 300, + + layout: 'fit', + + /** + * Stores the currently displayed tip, or null if none is displayed + * @var Ext.data.Record + */ + currentTip: null, + + /** + * Holds an instance of the TipOfTheDay store. + */ + tipStore: null, + + /** + * Initializes the window. Adds the iframe used for displaying tips, as well + * as the user controls (prev/next buttons, config checkboxes). + */ + initComponent: function () { + // Initialize the window with the title template + this.title = this.titleTemplate; + + // Set the tip store + this.tipStore = PartKeepr.getApplication().getTipOfTheDayStore(); + + // Set the tip display iframe and add it to the items + this.tipDisplay = Ext.create("Ext.ux.SimpleIFrame", { + border: false + }); + + this.items = this.tipDisplay; + + // Initialize previous and next buttons + this.previousButton = Ext.create("Ext.button.Button", { + text: i18n("Previous Tip"), + handler: Ext.bind(this.displayPreviousTip, this), + cls: 'x-btn-text-icon', + icon: 'resources/icons/tip_previous.png', + disabled: true + }); + + this.nextButton = Ext.create("Ext.button.Button", { + text: i18n("Next Tip"), + cls: 'x-btn-text-icon', + icon: 'resources/icons/tip_next.png', + handler: Ext.bind(this.displayNextTip, this) + }); + + // Initializes the "show tips on login" checkbox as well as the "show read tips" checkbox + this.showTipsCheckbox = Ext.create("Ext.form.field.Checkbox", { + boxLabel: i18n("Show Tips on login"), + handler: Ext.bind(this.showTipsHandler, this) + }); + + this.displayReadTipsCheckbox = Ext.create("Ext.form.field.Checkbox", { + boxLabel: i18n("Show read tips"), + handler: Ext.bind(this.showReadTipsHandler, this) + }); + + // Initialize the "show tips" checkbox with the user preference + if (PartKeepr.getApplication().getUserPreference("partkeepr.tipoftheday.showtips") === false) { + this.showTipsCheckbox.setValue(false); + } else { + this.showTipsCheckbox.setValue(true); + } + + // Append the controls to the bottom toolbar + this.dockedItems = [{ + xtype: 'toolbar', + dock: 'bottom', + ui: 'footer', + defaults: {minWidth: 100}, + pack: 'start', + items: [ + this.previousButton, + this.nextButton, + '->', + this.showTipsCheckbox, + this.displayReadTipsCheckbox + ] + }]; + + // Auto-load the next unread tip on window display + this.on("show", this.displayNextTip, this); + + // Window destroy handler + this.on("destroy", this.onDestroy, this); + this.callParent(); + }, + /** + * If the "show read tips" checkbox was clicked, update the buttons + * to reflect the tip navigation. + */ + showReadTipsHandler: function () { + this.updateButtons(this.currentTip); + }, + /** + * Destroy handler. Removes the "read tip" timer. + */ + onDestroy: function () { + this.cancelReadTimer(); + }, + /** + * Cancels the read timer. + */ + cancelReadTimer: function () { + if (this.markAsReadTask) { + this.markAsReadTask.cancel(); + } + }, + /** + * Handler when the "show tips" checkbox was clicked. + */ + showTipsHandler: function (checkbox, checked) { + PartKeepr.getApplication().setUserPreference("partkeepr.tipoftheday.showtips", checked); + }, + /** + * Displays a specific tip of the day. + * @param record The record which contains the information regarding the tip + */ + displayTip: function (record) { + // Cancel the old read timer + this.cancelReadTimer(); + + // Update buttons to reflect position + this.updateButtons(record); + + // Set the title to the tip name + this.setTitle(this.titleTemplate+ ": " + record.get("name")); + + // Set iframe to the tip url + this.tipDisplay.setSrc(record.get("url")); + + // Fire up delayed task to mark the tip as read + this.markAsReadTask = new Ext.util.DelayedTask(this.markTipRead, this); + this.markAsReadTask.delay(5000); + + }, + /** + * Updates the navigation buttons. + * + * This method has two modes, depending on which state the "show read tips" checkbox is in. + * @param record The currently displayed tip + */ + updateButtons: function (record) { + if (this.displayReadTipsCheckbox.getValue() === true) { + if (this.tipStore.indexOf(record) > 0) { + this.previousButton.enable(); + } else { + this.previousButton.disable(); + } + + if (this.tipStore.indexOf(record) === this.tipStore.getTotalCount() - 1) { + this.nextButton.disable(); + } else { + this.nextButton.enable(); + } + } else { + if (this.tipStore.indexOf(record) > this.getFirstUnreadTip()) { + this.previousButton.enable(); + } else { + this.previousButton.disable(); + } + + + if (this.tipStore.indexOf(record) >= this.getLastUnreadTip()) { + this.nextButton.disable(); + } else { + this.nextButton.enable(); + } + } + + }, + /** + * Returns the index of the first unread tip, or null if there's no unread tip. + * @returns int The index of the first unread tip, or null + */ + getFirstUnreadTip: function () { + for (var i=0;i<this.tipStore.getTotalCount();i++) { + if (this.tipStore.getAt(i).get("read") === false) { + return i; + } + } + + return null; + }, + /** + * Returns the index of the last unread tip, or null if there's no unread tip. + * @returns int The index of the last unread tip, or null + */ + getLastUnreadTip: function () { + for (var i=this.tipStore.getTotalCount()-1;i>-1;i--) { + if (this.tipStore.getAt(i).get("read") === false) { + return i; + } + } + + return null; + }, + /** + * Marks the current tip as read. Commits the information to the server. + */ + markTipRead: function () { + this.currentTip.set("read", true); + this.currentTip.commit(); + + var call = new PartKeepr.ServiceCall("TipOfTheDay", "markTipAsRead"); + call.setLoadMessage(sprintf(i18n("Marking tip %s as read..."), this.currentTip.get("name"))); + call.setParameter("name", this.currentTip.get("name")); + call.doCall(); + }, + /** + * Displays the next tip + */ + displayNextTip: function () { + this.retrieveTip("ASC"); + }, + /** + * Displays the previous tip + */ + displayPreviousTip: function () { + this.retrieveTip("DESC"); + }, + /** + * Displays the next or previous tip. + * + * @param dir string Either "ASC" or "DESC", which denotes the direction to search for the next tip + */ + retrieveTip: function (dir) { + var startIdx = -1, record = null; + + if (this.currentTip) { + startIdx = this.tipStore.indexOf(this.currentTip); + } + + if (dir === "ASC") { + record = this.extractNextTip(startIdx); + } else { + record = this.extractPreviousTip(startIdx); + } + + if (record) { + this.currentTip = record; + this.displayTip(record); + } + }, + /** + * Returns the record with the next tip + * @param startIdx The index to start searching from + * @returns record The record with the next tip + */ + extractNextTip: function (startIdx) { + var record = null, foundRecord = null; + if (this.displayReadTipsCheckbox.getValue() === true) { + var tmpIdx = startIdx + 1; + if (tmpIdx > this.tipStore.getTotalCount() - 1) { + tmpIdx = this.tipStore.getTotalCount() - 1; + } + + foundRecord = this.tipStore.getAt(tmpIdx); + } else { + for (var i = startIdx+1; i < this.tipStore.getTotalCount();i++) { + record = this.tipStore.getAt(i); + if (record.get("read") === false) { + foundRecord = record; + break; + } + } + } + + return foundRecord; + }, + /** + * Returns the record with the previous tip + * @param startIdx The index to start searching from + * @returns record The record with the previous tip + */ + extractPreviousTip: function (startIdx) { + var record = null, foundRecord = null; + if (this.displayReadTipsCheckbox.getValue() === true) { + var tmpIdx = startIdx - 1; + if (tmpIdx < 0) { + tmpIdx = 0; + } + + foundRecord = this.tipStore.getAt(tmpIdx); + } else { + for (var i = startIdx - 1; i > -1;i--) { + record = this.tipStore.getAt(i); + + if (record.get("read") === false) { + foundRecord = record; + break; + } + } + } + + + return foundRecord; + } + + +});+ \ No newline at end of file diff --git a/src/frontend/js/Components/Unit/UnitEditor.js b/src/frontend/js/Components/Unit/UnitEditor.js @@ -0,0 +1,67 @@ +Ext.define('PartKeepr.UnitEditor', { + extend: 'PartKeepr.Editor', + alias: 'widget.UnitEditor', + saveText: i18n("Save Unit"), + initComponent: function () { + + var sm = Ext.create('Ext.selection.CheckboxModel',{ + checkOnly: true + }); + + this.gridPanel = Ext.create("Ext.grid.Panel", { + store: PartKeepr.getApplication().getSiPrefixStore(), + selModel: sm, + columnLines: true, + columns: [ + { text: i18n("Prefix"), dataIndex: "prefix", width: 60 }, + { text: i18n("Symbol"), dataIndex: "symbol", width: 60 }, + { text: i18n("Power"), dataIndex: "power", flex: 1, renderer: function (val) { return "10<sup>"+val+"</sup>"; } } + ] + }); + + var container = Ext.create("Ext.form.FieldContainer", { + fieldLabel: i18n("Allowed SI-Prefixes"), + labelWidth: 150, + items: this.gridPanel + }); + + this.items = [{ + xtype: 'textfield', + name: 'name', + fieldLabel: i18n("Unit Name") + },{ + xtype: 'textfield', + name: 'symbol', + fieldLabel: i18n("Symbol") + }, + container]; + + this.callParent(); + + this.on("startEdit", this.onStartEdit, this); + }, + onStartEdit: function () { + var records = this.record.prefixes().getRange(); + + var toSelect = []; + var pfxStore = PartKeepr.getApplication().getSiPrefixStore(); + + for (var i=0;i<records.length;i++) { + toSelect.push(pfxStore.getAt(pfxStore.find("id", records[i].get("id")))); + } + + // @todo I don't like defer too much, can we fix that somehow? + Ext.defer(function () { this.gridPanel.getSelectionModel().select(toSelect); }, 100, this); + }, + onItemSave: function () { + var selection = this.gridPanel.getSelectionModel().getSelection(); + + this.record.prefixes().removeAll(true); + + for (var i=0;i<selection.length;i++) { + this.record.prefixes().add({id: selection[i].get("id") }); + } + + this.callParent(); + } +}); diff --git a/src/frontend/js/Components/Unit/UnitEditorComponent.js b/src/frontend/js/Components/Unit/UnitEditorComponent.js @@ -0,0 +1,20 @@ +Ext.define('PartKeepr.UnitEditorComponent', { + extend: 'PartKeepr.EditorComponent', + alias: 'widget.UnitEditorComponent', + navigationClass: 'PartKeepr.UnitGrid', + editorClass: 'PartKeepr.UnitEditor', + newItemText: i18n("New Unit"), + deleteMessage: i18n("Do you really wish to delete the unit'%s'?"), + deleteTitle: i18n("Delete Unit"), + model: 'PartKeepr.Unit', + initComponent: function () { + this.createStore({ + sorters: [{ + property: 'name', + direction:'ASC' + }] + }); + + this.callParent(); + } +});+ \ No newline at end of file diff --git a/src/frontend/js/Components/Unit/UnitGrid.js b/src/frontend/js/Components/Unit/UnitGrid.js @@ -0,0 +1,15 @@ +Ext.define('PartKeepr.UnitGrid', { + extend: 'PartKeepr.EditorGrid', + alias: 'widget.UnitGrid', + columns: [ + {header: i18n("Unit"), dataIndex: 'name', flex: 1}, + {header: i18n("Symbol"), dataIndex: 'symbol', width: 60} + ], + addButtonText: i18n("Add Unit"), + addButtonIcon: 'resources/icons/unit_add.png', + deleteButtonText: i18n("Delete Unit"), + deleteButtonIcon: 'resources/icons/unit_delete.png', + initComponent: function () { + this.callParent(); + } +});+ \ No newline at end of file diff --git a/src/frontend/js/Components/User/TipOfTheDayPreferences.js b/src/frontend/js/Components/User/TipOfTheDayPreferences.js @@ -0,0 +1,48 @@ +Ext.define('PartKeepr.TipOfTheDayPreferencesPanel', { + extend: 'Ext.form.FormPanel', + title: i18n("Tip of the Day"), + bodyStyle: 'background:#DBDBDB;padding: 10px;', + initComponent: function () { + this.displayTipsOnLoginCheckbox = Ext.create("Ext.form.field.Checkbox", { + boxLabel: i18n("Display tips on login"), + handler: Ext.bind(this.showTipsHandler, this) + }); + + if (PartKeepr.getApplication().getUserPreference("partkeepr.tipoftheday.showtips") === false) { + this.displayTipsOnLoginCheckbox.setValue(false); + } else { + this.displayTipsOnLoginCheckbox.setValue(true); + } + + + this.resetTipsButton = Ext.create("Ext.button.Button", { + text: i18n("Mark all tips unread"), + handler: this.onMarkAllTipsUnreadClick, + scope: this + }); + + this.items = [ this.displayTipsOnLoginCheckbox, + this.resetTipsButton ]; + + this.callParent(); + }, + /** + * Handler when the "show tips" checkbox was clicked. + */ + showTipsHandler: function (checkbox, checked) { + PartKeepr.getApplication().setUserPreference("partkeepr.tipoftheday.showtips", checked); + }, + /** + * Marks all tips as unread + */ + onMarkAllTipsUnreadClick: function () { + var call = new PartKeepr.ServiceCall("TipOfTheDay", "markAllTipsAsUnread"); + call.setLoadMessage(i18n("Marking all tips as unerad...")); + call.setHandler(function () { + var msg = i18n("All tips have been marked as unread"); + Ext.Msg.alert(msg, msg); + }); + call.doCall(); + } +}); + + \ No newline at end of file diff --git a/src/frontend/js/Components/User/UserEditor.js b/src/frontend/js/Components/User/UserEditor.js @@ -0,0 +1,42 @@ +Ext.define('PartKeepr.UserEditor', { + extend: 'PartKeepr.Editor', + alias: 'widget.UserEditor', + + saveText: i18n("Save User"), + model: 'PartKeepr.User', + + initComponent: function () { + this.gridPanel = Ext.create("PartKeepr.UserPreferenceGrid"); + + var container = Ext.create("Ext.form.FieldContainer", { + fieldLabel: i18n("User Preferences"), + labelWidth: 150, + layout: 'fit', + height: 200, + items: this.gridPanel + }); + + this.items = [{ + xtype: 'textfield', + name: 'username', + fieldLabel: i18n("User") + },{ + xtype: 'textfield', + inputType: "password", + name: 'password', + fieldLabel: i18n("Password") + }, container ]; + + this.on("startEdit", this.onStartEdit, this); + this.callParent(); + }, + onStartEdit: function () { + this.gridPanel.store.getProxy().extraParams.user_id = this.record.get("id"); + this.gridPanel.store.load(); + }, + onItemSave: function () { + this.gridPanel.syncPreferences(); + + this.callParent(); + } +}); diff --git a/src/frontend/js/Components/User/UserEditorComponent.js b/src/frontend/js/Components/User/UserEditorComponent.js @@ -0,0 +1,22 @@ +Ext.define('PartKeepr.UserEditorComponent', { + extend: 'PartKeepr.EditorComponent', + alias: 'widget.UserEditorComponent', + navigationClass: 'PartKeepr.UserGrid', + editorClass: 'PartKeepr.UserEditor', + newItemText: i18n("New User"), + deleteMessage: i18n("Do you really wish to delete the user '%s'?"), + deleteTitle: i18n("Delete User"), + + model: 'PartKeepr.User', + + initComponent: function () { + this.createStore({ + sorters: [{ + property: 'username', + direction:'ASC' + }] + }); + + this.callParent(); + } +});+ \ No newline at end of file diff --git a/src/frontend/js/Components/User/UserGrid.js b/src/frontend/js/Components/User/UserGrid.js @@ -0,0 +1,11 @@ +Ext.define('PartKeepr.UserGrid', { + extend: 'PartKeepr.EditorGrid', + alias: 'widget.UserGrid', + columns: [ + {header: i18n("User"), dataIndex: 'username', flex: 1} + ], + addButtonText: i18n("Add User"), + addButtonIcon: 'resources/silkicons/user_add.png', + deleteButtonText: i18n("Delete User"), + deleteButtonIcon: 'resources/silkicons/user_delete.png' +});+ \ No newline at end of file diff --git a/src/frontend/js/Components/User/UserPasswordChangePanel.js b/src/frontend/js/Components/User/UserPasswordChangePanel.js @@ -0,0 +1,75 @@ +Ext.define('PartKeepr.UserPasswordChangePanel', { + extend: 'Ext.form.FormPanel', + title: i18n("Change Password"), + bodyStyle: 'background:#DBDBDB;padding: 10px;', + initComponent: function () { + + this.oldPassword = Ext.create("Ext.form.field.Text", { + inputType: "password", + name: 'password', + labelWidth: 150, + style: 'border-bottom: 1px solid grey; padding-bottom: 10px;', + width: 300, + fieldLabel: i18n("Current Password") + }); + + this.newPassword = Ext.create("Ext.form.field.Text", { + style: 'margin-top: 10px', + inputType: "password", + name: 'password', + labelWidth: 150, + width: 300, + fieldLabel: i18n("New Password") + }); + + this.newPasswordConfirm = Ext.create("Ext.form.field.Text", { + inputType: "password", + name: 'password', + labelWidth: 150, + width: 300, + validator: Ext.bind(this.validatePassword, this), + fieldLabel: i18n("New Password (Confirm)") + }); + + this.items = [ + this.oldPassword, + this.newPassword, + this.newPasswordConfirm, + { + xtype: 'fieldcontainer', + hideEmptyLabel: false, + width: 300, + labelWidth: 150, + items: { + xtype: 'button', + handler: this.onChangePassword, + scope: this, + width: 145, + icon: 'resources/silkicons/accept.png', + text: i18n("Change Password") + } + }]; + + this.callParent(); + }, + onChangePassword: function () { + if (this.getForm().isValid()) { + + var call = new PartKeepr.ServiceCall("UserPreference", "changePassword"); + call.setParameter("oldpassword", md5(this.oldPassword.getValue())); + call.setParameter("newpassword", md5(this.newPassword.getValue())); + call.setHandler(Ext.bind(this.onAfterPasswordChange, this)); + call.doCall(); + } + }, + onAfterPasswordChange: function (data) { + Ext.Msg.alert(data.data, data.data); + }, + validatePassword: function () { + if (this.newPassword.getValue() != this.newPasswordConfirm.getValue()) { + return i18n("Passwords don't match"); + } + + return true; + } +});+ \ No newline at end of file diff --git a/src/frontend/js/Components/User/UserPreferences.js b/src/frontend/js/Components/User/UserPreferences.js @@ -0,0 +1,14 @@ +Ext.define('PartKeepr.UserPreferencePanel', { + extend: 'Ext.tab.Panel', + title: i18n("User Preferences"), + tabPosition: 'bottom', + //bodyStyle: 'background:#DBDBDB;padding: 10px;', + initComponent: function () { + + this.passwordChangePanel = Ext.create("PartKeepr.UserPasswordChangePanel"); + this.tipsPanel = Ext.create("PartKeepr.TipOfTheDayPreferencesPanel"); + + this.items = [ this.tipsPanel, this.passwordChangePanel ]; + this.callParent(); + } +});+ \ No newline at end of file diff --git a/src/frontend/js/Components/Widgets/AttachmentGrid.js b/src/frontend/js/Components/Widgets/AttachmentGrid.js @@ -0,0 +1,178 @@ +Ext.define('PartKeepr.AttachmentGrid', { + extend: 'Ext.grid.Panel', + alias: 'widget.AttachmentGrid', + border: false, + model: null, + initComponent: function () { + if (this.model === null) { + alert("Error: Model can't be null!"); + } + + this.store = Ext.create("Ext.data.Store", { + model: this.model, + proxy: { + type: 'memory', + reader: { + type: 'json' + } + } + + }); + + this.editing = Ext.create('Ext.grid.plugin.CellEditing', { + clicksToEdit: 1 + }); + + this.plugins = [ this.editing ]; + + this.deleteButton = Ext.create("Ext.button.Button", { + text: i18n('Delete'), + disabled: true, + itemId: 'delete', + scope: this, + icon: 'resources/silkicons/delete.png', + handler: this.onDeleteClick + }); + + this.viewButton = Ext.create("Ext.button.Button", { + text: i18n("View"), + handler: this.onViewClick, + scope: this, + icon: 'resources/silkicons/zoom.png', + disabled: true + }); + + this.webcamButton = Ext.create("Ext.button.Button", { + text: i18n("Take image"), + handler: this.onWebcamClick, + scope: this, + icon: 'resources/fugue-icons/icons/webcam.png' + }); + + this.dockedItems = [{ + xtype: 'toolbar', + items: [{ + text: i18n('Add'), + scope: this, + icon: 'resources/silkicons/attach.png', + handler: this.onAddClick + }, + this.webcamButton, + this.viewButton, + this.deleteButton + ] + }]; + + this.columns = [ + { + dataIndex: 'extension', + width: 30, + renderer: function (val) { + return '<img src="resources/mimetypes/'+val+'.png"/>'; + } + }, + { + header: i18n("Filename"), + dataIndex: 'originalFilename', + width: 200 + }, + { + header: i18n("Size"), + dataIndex: 'size', + width: 80, + renderer: PartKeepr.bytesToSize + }, + { + header: i18n("Description"), + dataIndex: 'description', + flex: 0.4, + editor: { + xtype:'textfield', + allowBlank:true + } + } + ]; + + this.callParent(); + + this.getSelectionModel().on('selectionchange', this.onSelectChange, this); + this.on("itemdblclick", this.onDoubleClick, this); + }, + onWebcamClick: function () { + var wp = Ext.create("PartKeepr.WebcamPanel"); + wp.on("uploadComplete", this.onFileUploaded, this); + + var j = Ext.create("Ext.window.Window", { + title: i18n("Take Webcam Photo"), + items: [ + wp + ] + }); + + wp.on("uploadComplete", function () { j.close(); }); + + j.show(); + }, + onDoubleClick: function (view, record) { + if (record) { + this.viewAttachment(record); + } + }, + onAddClick: function () { + var j = Ext.create("PartKeepr.FileUploadDialog"); + j.on("fileUploaded", this.onFileUploaded, this); + j.show(); + }, + onFileUploaded: function (response) { + this.editing.cancelEdit(); + + this.store.insert(this.store.getCount(), Ext.create(this.model, { + id: "TMP:"+response.id, + extension: response.extension, + size: response.size, + originalFilename: response.originalFilename + })); + + }, + onDeleteClick: function () { + var selection = this.getView().getSelectionModel().getSelection()[0]; + if (selection) { + this.store.remove(selection); + } + }, + onSelectChange: function(selModel, selections){ + this.deleteButton.setDisabled(selections.length === 0); + this.viewButton.setDisabled(selections.length === 0); + }, + onViewClick: function () { + var selection = this.getView().getSelectionModel().getSelection()[0]; + if (selection) { + this.viewAttachment(selection); + } + }, + viewAttachment: function (record) { + var mySrc = "file.php?type="+this.model+"&"; + + if (record.get("id") === 0) { + mySrc += "id=0&tmpId=" + record.get("tmp_id"); + } else { + mySrc += "id=" + record.get("id"); + } + + new Ext.Window({ + title : i18n("Display File"), + width : 640, + height: 600, + maximizable: true, + constrain: true, + layout : 'fit', + items : [{ + xtype : "component", + autoEl : { + tag : "iframe", + src : mySrc + } + }] + }).show(); + } +});+ \ No newline at end of file diff --git a/src/frontend/js/Components/Widgets/CategoryComboBox.js b/src/frontend/js/Components/Widgets/CategoryComboBox.js @@ -0,0 +1,131 @@ +Ext.define("PartKeepr.CategoryComboBox",{ + extend:"Ext.form.field.Picker", + alias: 'widget.CategoryComboBox', + requires:["Ext.tree.Panel"], + selectedValue: null, + initComponent: function(){ + var self = this; + + Ext.apply(self,{ + pickerAlign:"tl-bl?", + editable: false + + }); + + self.callParent(); + + this.createPicker(); + + }, + createPicker: function(){ + var self = this; + + self.picker = new PartKeepr.CategoryTree({ + height:290, + categoryService: 'PartCategory', + categoryModel: 'PartKeepr.PartCategory', + floating: true, + focusOnToFront: false, + shadow: false, + ownerCt: this.ownerCt + }); + + self.picker.on({ + itemclick: Ext.bind(function(sm, record){ + this.setValue(record.get("name"), true); + this.setSelectedValue(record.get("id")); + this.collapse(); + },this), + show: { + fn: Ext.bind(function(cmp) { + var record = this.picker.getSelectionModel().getLastSelected(); + + this.picker.getView().focusRow(record); + }, this), + delay: 50 + } + }); + + self.picker.getView().on("render", Ext.bind(function () { + var record = this.picker.getSelectionModel().getLastSelected(); + this.picker.getView().ensureVisible(record); + + this.picker.getView().focusRow(record); + },this)); + + return self.picker; + }, + setSelectedValue: function (id) { + this.selectedValue = id; + }, + getValue: function () { + return this.selectedValue; + }, + setValue: function (val, parent) { + if (parent) { + this.callParent([val]); + } + + if (!this.picker) { return; } + + if (!this.picker.loaded) { + this.picker.on("categoriesLoaded", function () { this._setValue(val); }, this); + } else { + this._setValue(val); + } + }, + _setValue: function (val) { + var r = this.findById(val); + + /* We have found a record. Apply it */ + if (r !== null) { + this.setSelectedValue(r.get("id")); + this.setValue(r.get("name"), true); + + if (this.picker.getView().rendered) { + this._selectRecords(r); + } else { + this.picker.getView().on("render", function () { this._selectRecords(r); }, this); + } + + } + }, + _selectRecords: function (r) { + this.picker.getView().select(r); + this.picker.getView().ensureVisible(r); + this.picker.getView().scrollIntoView(r); + }, + findById: function (id) { + return this.picker.getRootNode().findChild("id", id, true); + }, + alignPicker: function() { + // override the original method because otherwise the height of the treepanel would be always 0 + var me = this, + picker, isAbove, + aboveSfx = '-above'; + + if (this.isExpanded) { + picker = me.getPicker(); + if (me.matchFieldWidth) { + // Auto the height (it will be constrained by min and max width) unless there are no records to display. + picker.setWidth( me.bodyEl.getWidth()); + } + if (picker.isFloating()) { + picker.alignTo(me.inputEl, me.pickerAlign, me.pickerOffset); + + // add the {openCls}-above class if the picker was aligned above + // the field due to hitting the bottom of the viewport + isAbove = picker.el.getY() < me.inputEl.getY(); + me.bodyEl[isAbove ? 'addCls' : 'removeCls'](me.openCls + aboveSfx); + picker.el[isAbove ? 'addCls' : 'removeCls'](picker.baseCls + aboveSfx); + } + } + }, + getErrors: function(value) { + if (this.getValue() === null) { + return [ i18n("You need to select a category")]; + } + + return []; + } +});+ \ No newline at end of file diff --git a/src/frontend/js/Components/Widgets/DistributorComboBox.js b/src/frontend/js/Components/Widgets/DistributorComboBox.js @@ -0,0 +1,27 @@ +Ext.define("PartKeepr.DistributorComboBox",{ + extend:"Ext.form.field.ComboBox", + alias: 'widget.DistributorComboBox', + displayField: 'name', + valueField: 'id', + autoSelect: true, + queryMode: 'local', + triggerAction: 'all', + forceSelection: true, + editable: true, + initComponent: function () { + this.store = PartKeepr.getApplication().getDistributorStore(); + + /* Workaround to remember the value when loading */ + this.store.on("beforeload", function () { + this._oldValue = this.getValue(); + }, this); + + /* Set the old value when load is complete */ + this.store.on("load", function () { + this.setValue(this._oldValue); + }, this); + + this.callParent(); + } +}); + diff --git a/src/frontend/js/Components/Widgets/FootprintComboBox.js b/src/frontend/js/Components/Widgets/FootprintComboBox.js @@ -0,0 +1,27 @@ +Ext.define("PartKeepr.FootprintComboBox",{ + extend:"Ext.form.field.ComboBox", + alias: 'widget.FootprintComboBox', + displayField: 'name', + valueField: 'id', + autoSelect: true, + queryMode: 'local', + triggerAction: 'all', + forceSelection: true, + editable: true, + initComponent: function () { + this.store = PartKeepr.getApplication().getFootprintStore(); + + /* Workaround to remember the value when loading */ + this.store.on("beforeload", function () { + this._oldValue = this.getValue(); + }, this); + + /* Set the old value when load is complete */ + this.store.on("load", function () { + this.setValue(this._oldValue); + }, this); + + this.callParent(); + } +}); + diff --git a/src/frontend/js/Components/Widgets/ManufacturerComboBox.js b/src/frontend/js/Components/Widgets/ManufacturerComboBox.js @@ -0,0 +1,27 @@ +Ext.define("PartKeepr.ManufacturerComboBox",{ + extend:"Ext.form.field.ComboBox", + alias: 'widget.ManufacturerComboBox', + displayField: 'name', + valueField: 'id', + autoSelect: true, + queryMode: 'local', + triggerAction: 'all', + forceSelection: true, + editable: true, + initComponent: function () { + this.store = PartKeepr.getApplication().getManufacturerStore(); + + /* Workaround to remember the value when loading */ + this.store.on("beforeload", function () { + this._oldValue = this.getValue(); + }, this); + + /* Set the old value when load is complete */ + this.store.on("load", function () { + this.setValue(this._oldValue); + }, this); + + this.callParent(); + } +}); + diff --git a/src/frontend/js/Components/Widgets/PartParameterComboBox.js b/src/frontend/js/Components/Widgets/PartParameterComboBox.js @@ -0,0 +1,42 @@ +Ext.define("PartKeepr.PartParameterComboBox",{ + extend:"Ext.form.field.ComboBox", + alias: 'widget.PartParameterComboBox', + displayField: 'name', + valueField: 'name', + autoSelect: false, + allowBlank: false, + queryMode: 'local', + triggerAction: 'all', + forceSelection: false, + editable: true, + initComponent: function () { + //this.store = PartKeepr.getApplication().getPartUnitStore(); + + this.store = Ext.create("Ext.data.Store", { + fields: [{ name: 'name' }], + proxy: { + type: 'ajax', + url: PartKeepr.getBasePath() + "/Part/getPartParameterNames", + reader: { + type: 'json', + root: 'response.data' + } + } + }); + + this.store.load(); + + /* Workaround to remember the value when loading */ + this.store.on("beforeload", function () { + this._oldValue = this.getValue(); + }, this); + + /* Set the old value when load is complete */ + this.store.on("load", function () { + this.setValue(this._oldValue); + }, this); + + this.callParent(); + } +}); + diff --git a/src/frontend/js/Components/Widgets/PartUnitComboBox.js b/src/frontend/js/Components/Widgets/PartUnitComboBox.js @@ -0,0 +1,27 @@ +Ext.define("PartKeepr.PartUnitComboBox",{ + extend:"Ext.form.field.ComboBox", + alias: 'widget.PartUnitComboBox', + displayField: 'name', + valueField: 'id', + autoSelect: true, + queryMode: 'local', + triggerAction: 'all', + forceSelection: true, + editable: true, + initComponent: function () { + this.store = PartKeepr.getApplication().getPartUnitStore(); + + /* Workaround to remember the value when loading */ + this.store.on("beforeload", function () { + this._oldValue = this.getValue(); + }, this); + + /* Set the old value when load is complete */ + this.store.on("load", function () { + this.setValue(this._oldValue); + }, this); + + this.callParent(); + } +}); + diff --git a/src/frontend/js/Components/Widgets/RemoteImageField.js b/src/frontend/js/Components/Widgets/RemoteImageField.js @@ -0,0 +1,113 @@ +/** + * @class PartKeepr.RemoteImageField + * <p>The RemoteImageField is a form field which can be used to upload one image. It automatically + * displays the remote image by id, assigns a temporary ID if it's a new image so the model can be + * syncronized at once. + * + */ +Ext.define('PartKeepr.RemoteImageField', { + extend:'Ext.form.field.Base', + alias: 'widget.remoteimagefield', + + type: 'remoteimagefield', + + // Default width and height + imageWidth: 32, + imageHeight: 32, + + // The field template for rendering this field + fieldSubTpl: [ + '<img id="{id}" style="{size}" class="remoteimagefield"/>', + { + compiled: true, + disableFormats: true + }], + + /** + * Initializes the field + */ + initComponent : function(){ + this.minHeight = this.imageHeight; + this.minWidth = this.imageWidth; + + this.imageId = Ext.id("remoteimagefield"); + this.callParent(); + }, + /** + * Return the template data for this field + */ + getSubTplData: function() { + return { + size: 'height:'+this.imageHeight+"px;width:"+this.imageWidth+"px;", + imageid: this.imageId + }; + }, + /** + * Renders this field. + */ + onRender: function () { + var me = this, + renderSelectors = me.renderSelectors; + + Ext.applyIf(renderSelectors, me.getLabelableSelectors()); + + Ext.applyIf(renderSelectors, { + imgEl: 'img.remoteimagefield' + }); + + me.callParent(arguments); + }, + /** + * Applies the image URL to the element after rendering + */ + afterRender: function () { + this.imgEl.dom.src = this.getImageURL(); + + this.imgEl.on("click", this.onClick, this); + }, + onClick: function () { + var j = Ext.create("PartKeepr.FileUploadDialog", { imageUpload: true }); + j.on("fileUploaded", this.onFileUploaded, this); + j.show(); + }, + onFileUploaded: function (data) { + this.setValue("TMP:"+data.id); + }, + /** + * Returns the URL for the image field. Applies the temporary image if TMP: is + * found within the value. + */ + getImageURL: function () { + var idparam; + + if (strpos(this.value, "TMP:") !== false) { + idparam = "id=0&tmpId="+str_replace("TMP:","",this.value); + } else { + idparam = "id="+this.value; + } + + return PartKeepr.getImagePath() + "?"+idparam+"&type="+this.imageType+"&w="+this.imageWidth+"&h="+this.imageHeight+"&m=fitpadding&_dc="+Ext.Date.now(); + + }, + /** + * Sets a value for the field. If the value is numeric, we call the image service + * with the specified id and the specified type. If the value is a string and prefixed + * with TMP:, we use the type "TempImage" and pass the id which has to be specified after TMP:. + * + * Example + * TMP:12 would retrieve the temporary image with the ID 12 + * @param {Mixed} value The value to set + * @return {Ext.form.field.Field} this + */ + setValue: function(value) { + var me = this; + + this.setRawValue(value); + this.value = value; + if (this.rendered) { + this.imgEl.dom.src = this.getImageURL(); + } + return this; + } +}); + diff --git a/src/frontend/js/Components/Widgets/RemoteImageFieldLayout.js b/src/frontend/js/Components/Widgets/RemoteImageFieldLayout.js @@ -0,0 +1,33 @@ +// Not sure if this one is really needed. + +Ext.define('PartKeepr.RemoteImageFieldLayout', { + + /* Begin Definitions */ + + alias: ['layout.remoteimagefield'], + + extend: 'Ext.layout.component.field.Field', + + /* End Definitions */ + + type: 'remoteimagefield', + + sizeBodyContents: function(width, height) { + var me = this, + owner = me.owner, + inputEl = owner.inputEl, + triggerWrap = owner.triggerWrap, + triggerWidth = owner.getTriggerWidth(); + + // If we or our ancestor is hidden, we can get a triggerWidth calculation + // of 0. We don't want to resize in this case. + if (owner.hideTrigger || owner.readOnly || triggerWidth > 0) { + // Decrease the field's width by the width of the triggers. Both the field and the triggerWrap + // are floated left in CSS so they'll stack up side by side. + me.setElementSize(inputEl, Ext.isNumber(width) ? width - triggerWidth : width); + + // Explicitly set the triggerWrap's width, to prevent wrapping + triggerWrap.setWidth(triggerWidth); + } + } +});+ \ No newline at end of file diff --git a/src/frontend/js/Components/Widgets/ResistorCalculator.js b/src/frontend/js/Components/Widgets/ResistorCalculator.js @@ -0,0 +1,29 @@ +Ext.define("PartKeepr.ResistorCalculator",{ + extend:"Ext.window.Window", + alias: 'widget.ResistorCalculator', + + width: 300, + height: 300, + layout: 'fit', + initComponent: function () { + + //this.resistorValueField = Ext.create("Ext.form.field.Number"); + this.resistorDisplay = Ext.create("PartKeepr.ResistorDisplay", { + viewBox: false + }); + + /*this.resistorDisplay = Ext.create('Ext.draw.Component', { + viewBox: false, + items: [{ + type: 'circle', + fill: '#79BB3F', + radius: 100, + x: 100, + y: 100 + }] + });*/ + + this.items = [ this.resistorDisplay ]; + this.callParent(); + } +});+ \ No newline at end of file diff --git a/src/frontend/js/Components/Widgets/ResistorDisplay.js b/src/frontend/js/Components/Widgets/ResistorDisplay.js @@ -0,0 +1,24 @@ +Ext.define("PartKeepr.ResistorDisplay",{ + extend:"Ext.draw.Component", + alias: 'widget.ResistorDisplay', + + viewBox: false, + initComponent: function () { + + this.circle = Ext.create("Ext.draw.Sprite", { + type: 'circle', + fill: '#79BB3F', + radius: 100, + x: 100, + y: 100 + }); + + this.items = [ this.circle ]; + + this.callParent(); + + this.circle = this.surface; + + + } +});+ \ No newline at end of file diff --git a/src/frontend/js/Components/Widgets/SiUnitField.js b/src/frontend/js/Components/Widgets/SiUnitField.js @@ -0,0 +1,390 @@ +/** + * This class represents a field which can handle a number (value) bound to a specific SI prefix. + * + * Internally, we use an object as value. Example: + * + * { + * value: 10 // The base value, in our case 10 + * symbol: "n" // The symbol for display + * power: -9 // The power + * siprefix_id: 5 // The ID of the siprefix record + * } + * + */ +Ext.define("PartKeepr.SiUnitField",{ + extend:"Ext.form.field.Picker", + alias: 'widget.SiUnitField', + + siPrefix: null, + + /** + * @cfg {RegExp} stripCharsRe @hide + */ + /** + * @cfg {RegExp} maskRe @hide + */ + + /** + * @cfg {Boolean} allowDecimals False to disallow decimal values (defaults to true) + */ + allowDecimals : true, + + /** + * @cfg {String} decimalSeparator Character(s) to allow as the decimal separator (defaults to '.') + */ + decimalSeparator : '.', + + /** + * @cfg {Number} decimalPrecision The maximum precision to display after the decimal separator (defaults to 2) + */ + decimalPrecision : 2, + + /** + * @cfg {Number} minValue The minimum allowed value (defaults to Number.NEGATIVE_INFINITY). Will be used by + * the field's validation logic. + */ + minValue: Number.NEGATIVE_INFINITY, + + /** + * @cfg {Number} maxValue The maximum allowed value (defaults to Number.MAX_VALUE). Will be used by + * the field's validation logic. + */ + maxValue: Number.MAX_VALUE, + + /** + * @cfg {String} minText Error text to display if the minimum value validation fails (defaults to 'The minimum + * value for this field is {minValue}') + */ + minText : 'The minimum value for this field is {0}', + + /** + * @cfg {String} maxText Error text to display if the maximum value validation fails (defaults to 'The maximum + * value for this field is {maxValue}') + */ + maxText : 'The maximum value for this field is {0}', + + /** + * @cfg {String} nanText Error text to display if the value is not a valid number. For example, this can happen + * if a valid character like '.' or '-' is left in the field with no number (defaults to '{value} is not a valid number') + */ + nanText : '{0} is not a valid number', + + /** + * @cfg {String} negativeText Error text to display if the value is negative and {@link #minValue} is set to + * <tt>0</tt>. This is used instead of the {@link #minText} in that circumstance only. + */ + negativeText : 'The value cannot be negative', + + /** + * @cfg {String} baseChars The base set of characters to evaluate as valid numbers (defaults to '0123456789'). + */ + baseChars : '0123456789', + + /** + * @cfg {Boolean} autoStripChars True to automatically strip not allowed characters from the field. Defaults to <tt>false</tt> + */ + autoStripChars: false, + + initComponent: function() { + var me = this, + allowed; + + me.callParent(); + + me.setMinValue(me.minValue); + me.setMaxValue(me.maxValue); + + // Build regexes for masking and stripping based on the configured options + if (me.disableKeyFilter !== true) { + allowed = me.baseChars + ''; + + var store = PartKeepr.getApplication().getSiPrefixStore(); + + for (var i=0;i<store.count();i++) { + allowed += store.getAt(i).get("symbol"); + } + + /** + * Fix because the µ-symbol on your keyboard is not greek "Mu" as defined by the Si standard. We wish that + * the user still can enter "µ", which automatically gets converted to "Mu". + */ + allowed += "µ"; + + if (me.allowDecimals) { + allowed += me.decimalSeparator; + } + if (me.minValue < 0) { + allowed += '-'; + } + allowed = Ext.String.escapeRegex(allowed); + me.maskRe = new RegExp('[' + allowed + ']'); + if (me.autoStripChars) { + me.stripCharsRe = new RegExp('[^' + allowed + ']', 'gi'); + } + } + }, + onTriggerClick: function () { + this.expand(); + + var node = this.picker.getNode(this.siPrefix); + + if (node) { + this.picker.highlightItem(node); + this.picker.listEl.scrollChildIntoView(node, false); + } + }, + getStore: function () { + if (this.store) { + return this.store; + } + + return PartKeepr.getApplication().getSiPrefixStore(); + }, + setStore: function (store) { + if (this.picker) { + this.picker.bindStore(store); + } else { + this.store = store; + } + }, + createPicker: function() { + var siprefixtpl = new Ext.XTemplate( + '<tpl for=".">', + '<div class="thumb-wrap">', + '{symbol} {prefix}', + '</div>', + '</tpl>'); + + var tmp = Ext.create('PartKeepr.SiUnitList', { + store: this.getStore(), + singleSelect: true, + ownerCt: this.ownerCt, + renderTo: document.body, + //width: 200, + //height:200, + floating: true, + maxHeight: 300, + shadow: 'sides', + focusOnToFront: false, + hidden: true, + focusOnShow: true, + displayField: 'symbol', + isteners: { + scope: this, + itemclick: this.onSelect + } + }); + + this.mon(tmp, { + itemclick: this.onSelect, + scope: this + }); + return tmp; + }, + onSelect: function (t, rec) { + var val = this.getValue(); + + val.symbol = rec.get("symbol"); + val.power = rec.get("power"); + val.siprefix_id = rec.get("id"); + + //this.siUnit = rec; + this.setValue(val); + this.collapse(); + }, + /** + * Runs all of Number's validations and returns an array of any errors. Note that this first + * runs Text's validations, so the returned array is an amalgamation of all field errors. + * The additional validations run test that the value is a number, and that it is within the + * configured min and max values. + * @param {Mixed} value The value to get errors for (defaults to the current field value) + * @return {Array} All validation errors for this field + */ + getErrors: function(value) { + var me = this, + errors = me.callParent(arguments), + format = Ext.String.format, + num, retVal; + + retVal = Ext.isDefined(value) ? value : this.processRawValue(this.getRawValue()); + + value = retVal.value; + + if (value.length < 1) { // if it's blank and textfield didn't flag it then it's valid + return errors; + } + + value = String(value).replace(me.decimalSeparator, '.'); + + if(isNaN(value)){ + errors.push(format(me.nanText, value)); + } + + num = me.parseValue(value); + + if (me.minValue === 0 && num < 0) { + errors.push(this.negativeText); + } + else if (num < me.minValue) { + errors.push(format(me.minText, me.minValue)); + } + + if (num > me.maxValue) { + errors.push(format(me.maxText, me.maxValue)); + } + + + return errors; + }, + rawToValue: function(rawValue) { + var processValue; + + if (Ext.isObject(rawValue)) { + processValue = rawValue.value; + } else { + processValue = rawValue; + } + + return this.fixPrecision(this.parseValue(processValue)) || processValue || null; + }, + + valueToRaw: function(value) { + var me = this, + decimalSeparator = me.decimalSeparator; + value = me.parseValue(value); + value = me.fixPrecision(value); + value = Ext.isNumber(value) ? value : parseFloat(String(value).replace(decimalSeparator, '.')); + value = isNaN(value) ? '' : String(value).replace('.', decimalSeparator); + + if (Ext.isObject(this.siPrefix) && this.siPrefix.get("symbol") !== "") { + return value + " "+this.siPrefix.get("symbol"); + } else { + return value; + } + + }, + + onChange: function() { + var me = this, + value = me.getValue(), + valueIsNull = value === null; + + me.callParent(arguments); + }, + getValue: function () { + var v = this.callParent(arguments); + + if (this.siPrefix) { + return { + value: v, + symbol: this.siPrefix.get("symbol"), + power: this.siPrefix.get("power"), + siprefix_id: this.siPrefix.get("id") + }; + } else { + return { + value: v, + symbol: "", + power: 1, + siprefix_id: null + }; + } + }, + /** + * Replaces any existing {@link #minValue} with the new value. + * @param {Number} value The minimum value + */ + setMinValue : function(value) { + this.minValue = Ext.Number.from(value, Number.NEGATIVE_INFINITY); + }, + + /** + * Replaces any existing {@link #maxValue} with the new value. + * @param {Number} value The maximum value + */ + setMaxValue: function(value) { + this.maxValue = Ext.Number.from(value, Number.MAX_VALUE); + }, + + // private + parseValue : function(value) { + value = parseFloat(String(value).replace(this.decimalSeparator, '.')); + return isNaN(value) ? null : value; + }, + + /** + * @private + * + */ + fixPrecision : function(value) { + var me = this, + nan = isNaN(value), + precision = me.decimalPrecision; + + if (nan || !value) { + return nan ? '' : value; + } else if (!me.allowDecimals || precision <= 0) { + precision = 0; + } + + return parseFloat(Ext.Number.toFixed(parseFloat(value), precision)); + }, + + beforeBlur : function() { + var me = this, + v = me.parseValue(me.getRawValue()); + + if (!Ext.isEmpty(v)) { + me.setValue(v); + } + }, + findSiPrefix: function (value) { + var store = PartKeepr.getApplication().getSiPrefixStore(); + var symbol; + + for (var i=0;i<store.count();i++) { + + symbol = store.getAt(i).get("symbol"); + + if (symbol !== "") { + if (strpos(value, symbol) !== false) { + return store.getAt(i); + } + } else { + emptyPrefix = store.getAt(i); + } + + } + + if (emptyPrefix) { + return emptyPrefix; + } else { + return null; + } + }, + setValue: function (v) { + if (Ext.isObject(v)) { + this.siPrefix = PartKeepr.getApplication().getSiPrefixStore().getById(v.siprefix_id); + + return this.callParent([v.value]); + } else { + return v; + } + }, + processRawValue: function (value) { + var prefix; + + value = PartKeepr.getApplication().convertMicroToMu(value); + + var siPrefix = this.findSiPrefix(value); + + this.siPrefix = siPrefix; + + if (siPrefix !== null) { + value = str_replace(siPrefix.get("symbol"), "", value); + return { value: value, symbol: siPrefix.get("symbol"), power: siPrefix.get("power"), siprefix_id: siPrefix.get("id") }; + } else { + return { value: value, symbol: "", power: 0, siprefix_id: null }; + } + } +});+ \ No newline at end of file diff --git a/src/frontend/js/Components/Widgets/SiUnitList.js b/src/frontend/js/Components/Widgets/SiUnitList.js @@ -0,0 +1,7 @@ +Ext.define('PartKeepr.SiUnitList', { + extend: 'Ext.view.BoundList', + alias: 'widget.siunitlist', + getInnerTpl: function(displayField) { + return '<span style="display: inline-block; width: 15px;">{' + displayField + '}</span><span style="display: inline-block; width: 40px;">{prefix}</span>(10<sup>{power}</span>)'; + } +});+ \ No newline at end of file diff --git a/src/frontend/js/Components/Widgets/StorageLocationComboBox.js b/src/frontend/js/Components/Widgets/StorageLocationComboBox.js @@ -0,0 +1,26 @@ +Ext.define("PartKeepr.StorageLocationComboBox",{ + extend:"Ext.form.field.ComboBox", + alias: 'widget.StorageLocationComboBox', + displayField: 'name', + valueField: 'id', + autoSelect: true, + queryMode: 'local', + triggerAction: 'all', + + initComponent: function () { + this.store = PartKeepr.getApplication().getStorageLocationStore(); + + /* Workaround to remember the value when loading */ + this.store.on("beforeload", function () { + this._oldValue = this.getValue(); + }, this); + + /* Set the old value when load is complete */ + this.store.on("load", function () { + this.setValue(this._oldValue); + }, this); + + this.callParent(); + } +}); + diff --git a/src/frontend/js/Components/Widgets/UnitComboBox.js b/src/frontend/js/Components/Widgets/UnitComboBox.js @@ -0,0 +1,27 @@ +Ext.define("PartKeepr.UnitComboBox",{ + extend:"Ext.form.field.ComboBox", + alias: 'widget.UnitComboBox', + displayField: 'name', + valueField: 'id', + autoSelect: true, + queryMode: 'local', + triggerAction: 'all', + forceSelection: true, + editable: true, + initComponent: function () { + this.store = PartKeepr.getApplication().getUnitStore(); + + /* Workaround to remember the value when loading */ + this.store.on("beforeload", function () { + this._oldValue = this.getValue(); + }, this); + + /* Set the old value when load is complete */ + this.store.on("load", function () { + this.setValue(this._oldValue); + }, this); + + this.callParent(); + } +}); + diff --git a/src/frontend/js/Components/Widgets/UserComboBox.js b/src/frontend/js/Components/Widgets/UserComboBox.js @@ -0,0 +1,27 @@ +Ext.define("PartKeepr.UserComboBox",{ + extend:"Ext.form.field.ComboBox", + alias: 'widget.UserComboBox', + displayField: 'username', + valueField: 'id', + autoSelect: true, + queryMode: 'local', + triggerAction: 'all', + forceSelection: true, + editable: true, + initComponent: function () { + this.store = PartKeepr.getApplication().getUserStore(); + + /* Workaround to remember the value when loading */ + this.store.on("beforeload", function () { + this._oldValue = this.getValue(); + }, this); + + /* Set the old value when load is complete */ + this.store.on("load", function () { + this.setValue(this._oldValue); + }, this); + + this.callParent(); + } +}); + diff --git a/src/frontend/js/Components/Widgets/UserPreferenceGrid.js b/src/frontend/js/Components/Widgets/UserPreferenceGrid.js @@ -0,0 +1,71 @@ +Ext.define('PartKeepr.UserPreferenceGrid', { + extend: 'Ext.grid.Panel', + + columnLines: true, + + columns: [{ + header: i18n("Key"), + dataIndex: 'key', + flex: 0.3, + minWidth: 200, + renderer: Ext.util.Format.htmlEncode + },{ + header: i18n("Value"), + dataIndex: 'value', + flex: 0.7, + minWidth: 200, + renderer: Ext.util.Format.htmlEncode + }], + userId: null, + + initComponent: function () { + this.deleteButton = Ext.create("Ext.button.Button", { + text: i18n('Delete'), + disabled: true, + itemId: 'delete', + scope: this, + icon: 'resources/silkicons/delete.png', + handler: this.onDeleteClick + }); + + this.dockedItems = [{ + xtype: 'toolbar', + items: [ + this.deleteButton + ] + }]; + this.store = Ext.create("Ext.data.Store", { + model: 'PartKeepr.UserPreference', + pageSize: -1 + }); + + this.callParent(); + + this.getSelectionModel().on('selectionchange', this.onSelectChange, this); + }, + onDeleteClick: function () { + var selection = this.getView().getSelectionModel().getSelection()[0]; + if (selection) { + // Set phantom to false because ExtJS has problems with PK-less thingies + selection.phantom = false; + this.store.remove(selection); + } + }, + onSelectChange: function(selModel, selections){ + this.deleteButton.setDisabled(selections.length === 0); + }, + syncPreferences: function () { + /* Iterate through all removed records and issue an AJAX + * call. This is necessary because the server side doesn't suport string + * keys and ExtJS can't handle composite keys. + */ + for (var j=0;j<this.store.removed.length;j++) { + var call = new PartKeepr.ServiceCall("UserPreference", "destroy"); + call.setParameter("key", this.store.removed[j].get("key")); + call.setParameter("user_id", this.store.removed[j].get("user_id")); + call.doCall(); + } + + this.store.removed = []; + } +}); diff --git a/src/frontend/js/Components/Widgets/WebcamPanel.js b/src/frontend/js/Components/Widgets/WebcamPanel.js @@ -0,0 +1,62 @@ +/** + * Creates a panel with a webcam widget. The webcam widget is + * a flash (jpegcam). + */ +Ext.define('PartKeepr.WebcamPanel', { + extend: 'Ext.panel.Panel', + alias: 'widget.WebcamPanel', + initComponent: function () { + + this.takePhotoButton = Ext.create("Ext.button.Button", { + text: i18n("Take picture and upload"), + icon: 'resources/fugue-icons/icons/webcam.png', + handler: this.takePhoto + }); + + // Create a toolbar with the "take photo" button + this.bbar = Ext.create("Ext.toolbar.Toolbar", { + enableOverflow: true, + items: [ this.takePhotoButton ] + }); + + // Render the SWF + this.on("afterrender", this.renderWebcam, this); + + // Fires when the image upload is complete + this.addEvents("uploadComplete"); + this.callParent(); + }, + /** + * Renders the webcam swf. + * @param e The element for this component + */ + renderWebcam: function (e) { + webcam.set_swf_url("resources/webcam.swf"); + webcam.set_quality(90); + webcam.set_api_url(PartKeepr.getBasePath()+"?service=TempFile&call=uploadCam&session="+PartKeepr.getApplication().getSession()); + webcam.set_shutter_sound(false); + webcam.set_hook('onComplete', Ext.bind(this.onUploadComplete, this)); + + e.body.insertHtml('beforeEnd', webcam.get_html(640,480, 640, 480)); + }, + /** + * Takes a photo using the webcam. + */ + takePhoto: function () { + webcam.snap(); + this.takePhotoButton.disable(); + this.takePhotoButton.setText(i18n("Uploading...")); + }, + /** + * Called when the upload is complete. Resumes webcam operation + * and fires the event. 'uploadComplete' + * @param message The server side message + */ + onUploadComplete: function (message) { + var response = Ext.decode(message); + + webcam.reset(); + this.fireEvent("uploadComplete", response.response); + + } +});+ \ No newline at end of file diff --git a/src/frontend/js/Dialogs/Auth/LoginDialog.js b/src/frontend/js/Dialogs/Auth/LoginDialog.js @@ -0,0 +1,117 @@ +Ext.define('PartKeepr.LoginDialog', { + extend: 'Ext.Window', + title: i18n("PartKeepr: Login"), + loginField: null, + + width: 400, + height: 125, + + modal: true, + resizable: false, + + layout: 'anchor', + + initComponent: function () { + + this.loginField = Ext.ComponentMgr.create({ + xtype: 'textfield', + value: "", + fieldLabel: i18n("Username"), + anchor: '100%' + }); + + this.passwordField = Ext.ComponentMgr.create({ + xtype: 'textfield', + inputType: "password", + value: "", + fieldLabel: i18n("Password"), + anchor: '100%' + }); + + Ext.apply(this, { + + keys: [{ + key: Ext.EventObject.ENTER, + handler: this.login, + scope: this + }], + bodyStyle: 'padding: 5px;', + items: [ + this.loginField, + this.passwordField + ], + dockedItems: [{ + xtype: 'toolbar', + enableOverflow: true, + dock: 'bottom', + ui: 'footer', + pack: 'start', + defaults: {minWidth: 100}, + items: [ + { + cls: 'x-btn-text-icon', + text: i18n("Connect"), + icon: 'resources/silkicons/connect.png', + handler: Ext.bind(this.login, this) + },{ + cls: 'x-btn-text-icon', + text: i18n("Close"), + handler: Ext.bind(this.close, this), + icon: 'resources/silkicons/cancel.png' + }] + }] + }); + + this.callParent(arguments); + + this.on("show", function () { this.loginField.focus(); }, this); + + if (PartKeepr.autoLoginUsername) { + this.loginField.setValue(PartKeepr.autoLoginUsername); + this.passwordField.setValue(PartKeepr.autoLoginPassword); + this.login(); + + PartKeepr.autoLoginUsername = null; + } + }, + login: function () { + var call = new PartKeepr.ServiceCall("Auth", "login"); + + call.setParameter("username", this.loginField.getValue()); + call.setParameter("password", md5(this.passwordField.getValue())); + call.setLoadMessage(i18n("Logging in...")); + call.enableAnonymous(); + call.setHandler(Ext.bind(this.onLogin, this)); + call.doCall(); + }, + /** + * Callback after the login call was completed. + * + * @param obj The response object from the server + */ + onLogin: function (obj) { + // Set session + username + PartKeepr.getApplication().setSession(obj.sessionid); + PartKeepr.getApplication().setUsername(obj.username); + + // @todo Disable the "edit users" menu somehow else + if (!obj.admin) { + Ext.getCmp("edit-users").hide(); + } else { + Ext.getCmp("edit-users").show(); + } + + // Set the admin flag + PartKeepr.getApplication().setAdmin(obj.admin); + + // Call the "login" method, which initializes the system with the user + PartKeepr.getApplication().login(); + + // Write out a logging message + PartKeepr.log(i18n("Logged in as")+" "+obj.username); + + // Close the window + this.close(); + + } +});+ \ No newline at end of file diff --git a/src/frontend/js/Dialogs/ExceptionWindow.js b/src/frontend/js/Dialogs/ExceptionWindow.js @@ -0,0 +1,132 @@ +Ext.define('PartKeepr.ExceptionWindow', { + extend: 'Ext.window.Window', + autoScroll: true, + resizable: true, + layout: 'anchor', + width: 500, + height: 300, + cls: Ext.baseCSSPrefix + 'message-box', + initComponent: function () { + + this.iconComponent = Ext.create('Ext.Component', { + cls: 'ext-mb-icon', + width: 40, + height: 35, + style: { + 'float': 'left' + } + }); + + this.messageDiv = Ext.create('Ext.Component', { autoEl: { tag: 'div' }, + cls: 'ext-mb-text', + style: 'margin-left: 40px;' + }); + + this.detailDiv = Ext.create('Ext.Component', { autoEl: { tag: 'div' }, + cls: 'ext-mb-text', + style: 'margin-left: 40px; margin-top: 20px;' + }); + + this.exceptionDiv = Ext.create('Ext.Component', { autoEl: { tag: 'div' }, + cls: 'ext-mb-text' + }); + + this.traceDiv = Ext.create('Ext.Component', { autoEl: { tag: 'div' }, + cls: 'ext-mb-text' + }); + + this.exceptionDetails = Ext.create('Ext.form.FieldSet', { + style: 'margin-left: 40px; margin-top: 20px', + title: 'Exception Details', + collapsible: true, + collapsed: true, + items: this.exceptionDiv + }); + + this.backtraceDetails = Ext.create('Ext.form.FieldSet', { + style: 'margin-left: 40px', + title: 'Backtrace', + collapsible: true, + collapsed: true, + items: this.traceDiv + }); + + this.topContainer = Ext.create("Ext.container.Container", { + xtype: 'container', + style: 'padding: 10px', + layout: 'anchor', + anchor: '100% 100%', + items: [this.iconComponent, this.messageDiv, this.detailDiv, + this.exceptionDetails, this.backtraceDetails] + }); + + this.items = this.topContainer; + + this.dockedItems = [{ + xtype: 'toolbar', + dock: 'bottom', + ui: 'footer', + defaults: {minWidth: 80}, + layout: { + pack: 'center' + }, + items: [ + { xtype: 'button', text: 'OK', handler: Ext.bind(function () { this.hide(); }, this) } + //{ xtype: 'button', text: 'Details >>', handler: Ext.bind(function () { this.showDetails(); }, this) } + ] + }]; + + this.callParent(); + }, + setIcon : function(icon) { + this.iconComponent.removeCls(this.iconCls); + + if (icon) { + this.iconComponent.show(); + this.iconComponent.addCls(Ext.baseCSSPrefix + 'dlg-icon'); + this.iconComponent.addCls(icon); + } else { + this.iconComponent.removeCls(Ext.baseCSSPrefix + 'dlg-icon'); + this.iconComponent.hide(); + } + }, + _showException: function (exception) { + this.setIcon(Ext.MessageBox.ERROR); + + this.messageDiv.update(exception.message); + this.setTitle(exception.message); + + if (exception.detail) { + this.detailDiv.update(exception.detail); + } else { + this.detailDiv.update(""); + } + + + if (exception.exception) { + this.exceptionDiv.update(exception.exception); + } else { + this.exceptionDiv.update("No information available"); + } + + if (exception.backtrace) { + this.traceDiv.update(exception.backtrace); + } else { + this.traceDiv.update("No backtrace available"); + } + + this.show(); + + }, + + statics: { + showException: function (exception) { + if (!PartKeepr.ExceptionWindow.activeInstance) { + PartKeepr.ExceptionWindow.activeInstance = new PartKeepr.ExceptionWindow(); + } + + PartKeepr.ExceptionWindow.activeInstance._showException(exception); + } + + } +});+ \ No newline at end of file diff --git a/src/frontend/js/Dialogs/FileUploadDialog.js b/src/frontend/js/Dialogs/FileUploadDialog.js @@ -0,0 +1,141 @@ +Ext.define('PartKeepr.FileUploadDialog', { + extend: 'Ext.window.Window', + + title: i18n("File Upload"), + fileFieldLabel: i18n("File"), + uploadButtonText: i18n('Select File...'), + uploadURL: PartKeepr.getBasePath()+"/TempFile", + layout: 'fit', + resizable: false, + modal: true, + iconCls: 'icon-drive-upload', + initComponent: function () { + + if (this.imageUpload) { + this.uploadURL = PartKeepr.getBasePath()+"/TempImage"; + } + + this.addEvents("fileUploaded"); + + this.uploadButton = Ext.create("Ext.button.Button", + { + text: i18n('Upload'), + iconCls: 'icon-drive-upload', + width: 120, + handler: Ext.bind(function() { + var form = this.form.getForm(); + + var values = form.getValues(); + + if (this.fileField.getValue() === "" && this.urlField.getValue() === "") { + Ext.Msg.alert(i18n("Error"), i18n("Please select a file to upload or enter an URL")); + return; + } + + + if(form.isValid()){ + form.submit({ + url: this.uploadURL, + params: { + call: "upload", + session: PartKeepr.getApplication().getSession() + }, + success: Ext.bind(function(fp, o) { + this.fireEvent("fileUploaded", o.result.response); + this.close(); + },this), + failure: function(form, action) { + } + }); + } + }, this) + }); + + this.urlField = Ext.create("Ext.form.field.Text", { + fieldLabel: i18n("URL"), + labelWidth: 50, + name: "url", + anchor: '100%' + }); + + this.tbButtons = [ this.uploadButton ]; + + if (this.imageUpload) { + + this.title = i18n("Image Upload"); + this.fileFieldLabel = i18n("Image"); + this.uploadButtonText = i18n("Select Image..."); + + this.fileFormatButton = Ext.create("Ext.button.Button", { + text: i18n("Available Formats"), + width: 120, + iconCls: 'icon-infocard', + handler: this.showAvailableFormats, + scope: this + }); + + this.tbButtons.push(this.fileFormatButton); + } + + this.fileField = Ext.create("Ext.form.field.File",{ + xtype: 'filefield', + name: 'userfile', + fieldLabel: this.fileFieldLabel, + labelWidth: 50, + msgTarget: 'side', + anchor: '100%', + buttonText: this.uploadButtonText + }); + + this.form = Ext.create('Ext.form.Panel', { + width: 400, + bodyPadding: 10, + border: false, + items: [{ + html: i18n("Select a file to upload or enter an URL to load the file from"), + border: false, + style: "margin-bottom: 20px;" + }, + this.fileField, + { + html: sprintf(i18n("Maximum upload size: %s"), PartKeepr.bytesToSize(PartKeepr.getMaxUploadSize())), + style: 'margin-bottom: 10px;', + border: false + }, + this.urlField], + + buttons: this.tbButtons + }); + + this.on("beforedestroy", this.onBeforeDestroy, this); + + this.items = this.form; + this.callParent(); + }, + /** + * Shows a tooltip for all available image formats. + */ + showAvailableFormats: function () { + if (!this.tip) { + this.tip = Ext.create("Ext.tip.ToolTip", { + title: i18n("Available Image Formats"), + anchor: 'left', + width: 200, + height: 300, + autoScroll: true, + target: this.fileFormatButton.getEl(), + closable: true, + html: implode("<br>", PartKeepr.getAvailableImageFormats()), + autoHide: false + }); + } + + + this.tip.show(); + }, + onBeforeDestroy: function () { + if (this.tip) { + this.tip.destroy(); + } + } +}); diff --git a/src/frontend/js/Ext.ux/ClearableComboBox.js b/src/frontend/js/Ext.ux/ClearableComboBox.js @@ -0,0 +1,29 @@ +Ext.define('Ext.ux.ClearableComboBox', { + extend: "Ext.form.ComboBox", + alias: "widget.clearcombo", + initComponent: function() { + this.triggerConfig = { + tag:'span', cls:'x-form-twin-triggers', cn:[ + {tag: "img", src: Ext.BLANK_IMAGE_URL, cls: "x-form-trigger x-form-clear-trigger"}, + {tag: "img", src: Ext.BLANK_IMAGE_URL, cls: "x-form-trigger"} + ]}; + + this.callParent(); + }, + onTrigger1Click : function() + { + this.collapse(); + this.setValue(''); + this.fireEvent('cleared'); + }, + setValue : function(v){ + Ext.form.ClearableComboBox.superclass.setValue.call(this, v); + if (this.rendered) { + this.triggers[0][!Ext.isEmpty(v) ? 'show': 'hide'](); + } + }, + onDestroy: function(){ + Ext.destroy(this.triggers); + Ext.form.ClearableComboBox.superclass.onDestroy.apply(this, arguments); + } +}); diff --git a/src/frontend/js/Ext.ux/Iframe.js b/src/frontend/js/Ext.ux/Iframe.js @@ -0,0 +1,119 @@ +// vim: sw=2:ts=2:nu:nospell:fdc=2:expandtab +/** +* @class Ext.ux.SimpleIFrame +* @extends Ext.Panel +* +* A simple ExtJS 4 implementaton of an iframe providing basic functionality. +* For example: +* +* var panel=Ext.create('Ext.ux.SimpleIFrame', { +* border: false, +* src: 'http://localhost' +* }); +* panel.setSrc('http://www.sencha.com'); +* panel.reset(); +* panel.reload(); +* panel.getSrc(); +* panel.update('<div><b>Some Content....</b></div>'); +* panel.destroy(); +* +* @author Conor Armstrong +* @copyright (c) 2011 Conor Armstrong +* @date 12 April 2011 +* @version 0.1 +* +* @license Ext.ux.SimpleIFrame.js is licensed under the terms of the Open Source +* LGPL 3.0 license. Commercial use is permitted to the extent that the +* code/component(s) do NOT become part of another Open Source or Commercially +* licensed development library or toolkit without explicit permission. +* +* <p>License details: <a href="http://www.gnu.org/licenses/lgpl.html" +* target="_blank">http://www.gnu.org/licenses/lgpl.html</a></p> +* +*/ + +Ext.require([ + 'Ext.panel.*' +]); + +Ext.define('Ext.ux.SimpleIFrame', { + extend: 'Ext.Panel', + alias: 'widget.simpleiframe', + src: 'about:blank', + loadingText: 'Loading ...', + initComponent: function(){ + this.updateHTML(); + this.callParent(arguments); + }, + updateHTML: function() { + this.html='<iframe id="iframe-'+this.id+'"'+ + ' style="overflow:auto;width:100%;height:100%;"'+ + ' frameborder="0" '+ + ' src="'+this.src+'"'+ + '></iframe>'; + }, + reload: function() { + this.setSrc(this.src); + }, + reset: function() { + var iframe=this.getDOM(); + var iframeParent=iframe.parentNode; + if (iframe && iframeParent) { + iframe.src='about:blank'; + iframe.parentNode.removeChild(iframe); + }