partkeepr

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

commit 468af12675b8b01e99ba9f454120028a8e75b178
parent 7f9ad0d84e4d09866d947d6d2adb44d9a89eb992
Author: Felicitus <felicitus@felicitus.org>
Date:   Thu,  5 Feb 2015 21:52:18 +0100

Moved files to the new Frontend Controller to rework it. The frontend from web/ now loads everything fine. Next step requires to migrate to ExtJS5

Diffstat:
Mapp/config/config.yml | 2+-
Mcomposer.json | 3+++
Mcomposer.lock | 2+-
Asrc/PartKeepr/FrontendBundle/Resources/public/css/PartKeepr.css | 227+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/PartKeepr/FrontendBundle/Resources/public/css/partkeepr-theme.css | 1+
Rsrc/frontend/js/Components/Auth/LoginDialog.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Auth/LoginDialog.js | 0
Rsrc/frontend/js/Components/CategoryEditor/CategoryEditorForm.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/CategoryEditor/CategoryEditorForm.js | 0
Rsrc/frontend/js/Components/CategoryEditor/CategoryEditorTree.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/CategoryEditor/CategoryEditorTree.js | 0
Asrc/PartKeepr/FrontendBundle/Resources/public/js/Components/CategoryEditor/CategoryEditorWindow.js | 65+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/PartKeepr/FrontendBundle/Resources/public/js/Components/CategoryStore.js | 31+++++++++++++++++++++++++++++++
Asrc/PartKeepr/FrontendBundle/Resources/public/js/Components/CategoryTree.js | 118+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Rsrc/frontend/js/Components/ContextMenu/CharPickerMenu.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/ContextMenu/CharPickerMenu.js | 0
Rsrc/frontend/js/Components/Distributor/DistributorEditor.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Distributor/DistributorEditor.js | 0
Rsrc/frontend/js/Components/Distributor/DistributorEditorComponent.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Distributor/DistributorEditorComponent.js | 0
Rsrc/frontend/js/Components/Distributor/DistributorGrid.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Distributor/DistributorGrid.js | 0
Asrc/PartKeepr/FrontendBundle/Resources/public/js/Components/Editor/Editor.js | 133+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Rsrc/frontend/js/Components/Editor/EditorComponent.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Editor/EditorComponent.js | 0
Asrc/PartKeepr/FrontendBundle/Resources/public/js/Components/Editor/EditorGrid.js | 224+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Rsrc/frontend/js/Components/Footprint/FootprintAttachmentGrid.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Footprint/FootprintAttachmentGrid.js | 0
Rsrc/frontend/js/Components/Footprint/FootprintEditor.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Footprint/FootprintEditor.js | 0
Rsrc/frontend/js/Components/Footprint/FootprintEditorComponent.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Footprint/FootprintEditorComponent.js | 0
Asrc/PartKeepr/FrontendBundle/Resources/public/js/Components/Footprint/FootprintTree.js | 216+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Rsrc/frontend/js/Components/Grid/BaseGrid.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Grid/BaseGrid.js | 0
Rsrc/frontend/js/Components/Grid/GridMenuPlugin.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Grid/GridMenuPlugin.js | 0
Rsrc/frontend/js/Components/Manufacturer/ManufacturerEditor.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Manufacturer/ManufacturerEditor.js | 0
Rsrc/frontend/js/Components/Manufacturer/ManufacturerEditorComponent.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Manufacturer/ManufacturerEditorComponent.js | 0
Rsrc/frontend/js/Components/Manufacturer/ManufacturerGrid.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Manufacturer/ManufacturerGrid.js | 0
Rsrc/frontend/js/Components/Menu.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Menu.js | 0
Rsrc/frontend/js/Components/MenuBar.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/MenuBar.js | 0
Rsrc/frontend/js/Components/MessageLog.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/MessageLog.js | 0
Rsrc/frontend/js/Components/Part/Editor/PartAttachmentGrid.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Part/Editor/PartAttachmentGrid.js | 0
Rsrc/frontend/js/Components/Part/Editor/PartDistributorGrid.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Part/Editor/PartDistributorGrid.js | 0
Asrc/PartKeepr/FrontendBundle/Resources/public/js/Components/Part/Editor/PartEditor.js | 455+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Rsrc/frontend/js/Components/Part/Editor/PartEditorWindow.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Part/Editor/PartEditorWindow.js | 0
Rsrc/frontend/js/Components/Part/Editor/PartManufacturerGrid.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Part/Editor/PartManufacturerGrid.js | 0
Rsrc/frontend/js/Components/Part/Editor/PartParameterGrid.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Part/Editor/PartParameterGrid.js | 0
Asrc/PartKeepr/FrontendBundle/Resources/public/js/Components/Part/PartCategoryTree.js | 53+++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/PartKeepr/FrontendBundle/Resources/public/js/Components/Part/PartDisplay.js | 230+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Rsrc/frontend/js/Components/Part/PartFilterPanel.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Part/PartFilterPanel.js | 0
Rsrc/frontend/js/Components/Part/PartImageDisplay.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Part/PartImageDisplay.js | 0
Rsrc/frontend/js/Components/Part/PartStockHistory.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Part/PartStockHistory.js | 0
Rsrc/frontend/js/Components/Part/PartStockWindow.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Part/PartStockWindow.js | 0
Asrc/PartKeepr/FrontendBundle/Resources/public/js/Components/Part/PartsGrid.js | 485+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Rsrc/frontend/js/Components/Part/PartsManager.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Part/PartsManager.js | 0
Rsrc/frontend/js/Components/PartUnit/PartUnitEditor.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/PartUnit/PartUnitEditor.js | 0
Rsrc/frontend/js/Components/PartUnit/PartUnitEditorComponent.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/PartUnit/PartUnitEditorComponent.js | 0
Rsrc/frontend/js/Components/PartUnit/PartUnitGrid.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/PartUnit/PartUnitGrid.js | 0
Rsrc/frontend/js/Components/Picker/CharPicker.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Picker/CharPicker.js | 0
Rsrc/frontend/js/Components/Printing/PageBasicLayoutEditor.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Printing/PageBasicLayoutEditor.js | 0
Rsrc/frontend/js/Components/Printing/PageBasicLayoutEditorComponent.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Printing/PageBasicLayoutEditorComponent.js | 0
Rsrc/frontend/js/Components/Printing/PageBasicLayoutGrid.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Printing/PageBasicLayoutGrid.js | 0
Rsrc/frontend/js/Components/Printing/PrintStorageLocations.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Printing/PrintStorageLocations.js | 0
Rsrc/frontend/js/Components/Printing/PrintingExecutor.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Printing/PrintingExecutor.js | 0
Rsrc/frontend/js/Components/Printing/PrintingJobConfigurationEditor.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Printing/PrintingJobConfigurationEditor.js | 0
Rsrc/frontend/js/Components/Printing/PrintingJobConfigurationEditorComponent.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Printing/PrintingJobConfigurationEditorComponent.js | 0
Rsrc/frontend/js/Components/Printing/PrintingJobConfigurationGrid.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Printing/PrintingJobConfigurationGrid.js | 0
Rsrc/frontend/js/Components/Printing/PrintingWindow.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Printing/PrintingWindow.js | 0
Rsrc/frontend/js/Components/Project/ProjectAttachmentGrid.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Project/ProjectAttachmentGrid.js | 0
Rsrc/frontend/js/Components/Project/ProjectEditor.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Project/ProjectEditor.js | 0
Rsrc/frontend/js/Components/Project/ProjectEditorComponent.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Project/ProjectEditorComponent.js | 0
Rsrc/frontend/js/Components/Project/ProjectGrid.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Project/ProjectGrid.js | 0
Rsrc/frontend/js/Components/Project/ProjectPartGrid.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Project/ProjectPartGrid.js | 0
Rsrc/frontend/js/Components/Project/ProjectReport.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Project/ProjectReport.js | 0
Asrc/PartKeepr/FrontendBundle/Resources/public/js/Components/Session/SessionManager.js | 96+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Rsrc/frontend/js/Components/Statistics/CurrentStatisticsPanel.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Statistics/CurrentStatisticsPanel.js | 0
Asrc/PartKeepr/FrontendBundle/Resources/public/js/Components/Statistics/StatisticsChart.js | 150+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Rsrc/frontend/js/Components/Statistics/StatisticsChartPanel.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Statistics/StatisticsChartPanel.js | 0
Rsrc/frontend/js/Components/Statusbar.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Statusbar.js | 0
Rsrc/frontend/js/Components/StockReport/AbstractStockHistoryGrid.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/StockReport/AbstractStockHistoryGrid.js | 0
Asrc/PartKeepr/FrontendBundle/Resources/public/js/Components/StockReport/StockHistoryGrid.js | 40++++++++++++++++++++++++++++++++++++++++
Rsrc/frontend/js/Components/StorageLocation/StorageLocationEditor.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/StorageLocation/StorageLocationEditor.js | 0
Rsrc/frontend/js/Components/StorageLocation/StorageLocationEditorComponent.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/StorageLocation/StorageLocationEditorComponent.js | 0
Rsrc/frontend/js/Components/StorageLocation/StorageLocationGrid.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/StorageLocation/StorageLocationGrid.js | 0
Rsrc/frontend/js/Components/StorageLocation/StorageLocationMultiAddDialog.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/StorageLocation/StorageLocationMultiAddDialog.js | 0
Rsrc/frontend/js/Components/StorageLocation/StorageLocationMultiAddWindow.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/StorageLocation/StorageLocationMultiAddWindow.js | 0
Rsrc/frontend/js/Components/SystemInformation/SystemInformationGrid.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/SystemInformation/SystemInformationGrid.js | 0
Rsrc/frontend/js/Components/SystemNotice/SystemNoticeEditor.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/SystemNotice/SystemNoticeEditor.js | 0
Rsrc/frontend/js/Components/SystemNotice/SystemNoticeEditorComponent.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/SystemNotice/SystemNoticeEditorComponent.js | 0
Rsrc/frontend/js/Components/SystemNotice/SystemNoticeGrid.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/SystemNotice/SystemNoticeGrid.js | 0
Rsrc/frontend/js/Components/TimeDisplay.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/TimeDisplay.js | 0
Rsrc/frontend/js/Components/TipOfTheDay/TipOfTheDayWindow.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/TipOfTheDay/TipOfTheDayWindow.js | 0
Rsrc/frontend/js/Components/Unit/UnitEditor.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Unit/UnitEditor.js | 0
Rsrc/frontend/js/Components/Unit/UnitEditorComponent.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Unit/UnitEditorComponent.js | 0
Rsrc/frontend/js/Components/Unit/UnitGrid.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Unit/UnitGrid.js | 0
Rsrc/frontend/js/Components/User/Preferences/DisplayPreferencesPanel.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/User/Preferences/DisplayPreferencesPanel.js | 0
Rsrc/frontend/js/Components/User/Preferences/FormattingPreferences.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/User/Preferences/FormattingPreferences.js | 0
Rsrc/frontend/js/Components/User/Preferences/StockPreferences.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/User/Preferences/StockPreferences.js | 0
Rsrc/frontend/js/Components/User/Preferences/TipOfTheDayPreferences.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/User/Preferences/TipOfTheDayPreferences.js | 0
Rsrc/frontend/js/Components/User/Preferences/UserPasswordChangePanel.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/User/Preferences/UserPasswordChangePanel.js | 0
Rsrc/frontend/js/Components/User/UserEditor.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/User/UserEditor.js | 0
Rsrc/frontend/js/Components/User/UserEditorComponent.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/User/UserEditorComponent.js | 0
Rsrc/frontend/js/Components/User/UserGrid.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/User/UserGrid.js | 0
Rsrc/frontend/js/Components/User/UserPreferences.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/User/UserPreferences.js | 0
Rsrc/frontend/js/Components/Widgets/AttachmentGrid.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Widgets/AttachmentGrid.js | 0
Rsrc/frontend/js/Components/Widgets/CategoryComboBox.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Widgets/CategoryComboBox.js | 0
Rsrc/frontend/js/Components/Widgets/ConnectionButton.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Widgets/ConnectionButton.js | 0
Rsrc/frontend/js/Components/Widgets/CurrencyNumberField.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Widgets/CurrencyNumberField.js | 0
Rsrc/frontend/js/Components/Widgets/DistributorComboBox.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Widgets/DistributorComboBox.js | 0
Rsrc/frontend/js/Components/Widgets/FadingButton.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Widgets/FadingButton.js | 0
Rsrc/frontend/js/Components/Widgets/FootprintComboBox.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Widgets/FootprintComboBox.js | 0
Rsrc/frontend/js/Components/Widgets/ManufacturerComboBox.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Widgets/ManufacturerComboBox.js | 0
Rsrc/frontend/js/Components/Widgets/PartParameterComboBox.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Widgets/PartParameterComboBox.js | 0
Rsrc/frontend/js/Components/Widgets/PartUnitComboBox.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Widgets/PartUnitComboBox.js | 0
Rsrc/frontend/js/Components/Widgets/ReloadableComboBox.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Widgets/ReloadableComboBox.js | 0
Rsrc/frontend/js/Components/Widgets/RemoteImageField.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Widgets/RemoteImageField.js | 0
Rsrc/frontend/js/Components/Widgets/RemotePartComboBox.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Widgets/RemotePartComboBox.js | 0
Rsrc/frontend/js/Components/Widgets/ResistorCalculator.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Widgets/ResistorCalculator.js | 0
Rsrc/frontend/js/Components/Widgets/SiUnitField.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Widgets/SiUnitField.js | 0
Rsrc/frontend/js/Components/Widgets/SiUnitList.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Widgets/SiUnitList.js | 0
Rsrc/frontend/js/Components/Widgets/StorageLocationComboBox.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Widgets/StorageLocationComboBox.js | 0
Rsrc/frontend/js/Components/Widgets/SystemNoticeButton.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Widgets/SystemNoticeButton.js | 0
Rsrc/frontend/js/Components/Widgets/UnitComboBox.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Widgets/UnitComboBox.js | 0
Rsrc/frontend/js/Components/Widgets/UserComboBox.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Widgets/UserComboBox.js | 0
Rsrc/frontend/js/Components/Widgets/UserPreferenceGrid.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Components/Widgets/UserPreferenceGrid.js | 0
Asrc/PartKeepr/FrontendBundle/Resources/public/js/Components/Widgets/WebcamPanel.js | 61+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Rsrc/frontend/js/Dialogs/ExceptionWindow.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Dialogs/ExceptionWindow.js | 0
Asrc/PartKeepr/FrontendBundle/Resources/public/js/Dialogs/FileUploadDialog.js | 188+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Rsrc/frontend/js/Dialogs/RememberChoiceMessageBox.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Dialogs/RememberChoiceMessageBox.js | 0
Asrc/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux.Wizard.Card.js | 234+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux.Wizard.CardLayout.js | 57+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux.Wizard.Header.js | 188+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux.Wizard.js | 552+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Rsrc/frontend/js/Ext.ux/ClearableComboBox.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/ClearableComboBox.js | 0
Asrc/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/Ext.ux.Exporter/Base64.js | 65+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/Ext.ux.Exporter/Button.js | 62++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/Ext.ux.Exporter/Exporter.js | 84+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/Ext.ux.Exporter/Ext.ux.Exporter.jsb | 38++++++++++++++++++++++++++++++++++++++
Asrc/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/Ext.ux.Exporter/Formatter.js | 19+++++++++++++++++++
Asrc/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/Ext.ux.Exporter/README.textile | 9+++++++++
Asrc/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/Ext.ux.Exporter/build | 22++++++++++++++++++++++
Asrc/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/Ext.ux.Exporter/csvFormatter/CsvFormatter.js | 113+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/Ext.ux.Exporter/download.png | 0
Asrc/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/Ext.ux.Exporter/downloadify.min.js | 4++++
Asrc/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/Ext.ux.Exporter/downloadify.swf | 0
Asrc/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/Ext.ux.Exporter/excelFormatter/Cell.js | 28++++++++++++++++++++++++++++
Asrc/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/Ext.ux.Exporter/excelFormatter/ExcelFormatter.js | 24++++++++++++++++++++++++
Asrc/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/Ext.ux.Exporter/excelFormatter/Style.js | 102+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/Ext.ux.Exporter/excelFormatter/Workbook.js | 326+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/Ext.ux.Exporter/excelFormatter/Worksheet.js | 184+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/Ext.ux.Exporter/wikiFormatter/WikiFormatter.js | 116+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Rsrc/frontend/js/Ext.ux/Iframe.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/Iframe.js | 0
Rsrc/frontend/js/Ext.ux/NumericField.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/NumericField.js | 0
Rsrc/frontend/js/Ext.ux/SearchField.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/SearchField.js | 0
Rsrc/frontend/js/ExtJS/Bugfixes/Ext.panel.Table-scrollDelta.js -> src/PartKeepr/FrontendBundle/Resources/public/js/ExtJS/Bugfixes/Ext.panel.Table-scrollDelta.js | 0
Rsrc/frontend/js/ExtJS/Bugfixes/Ext.selection.RowModel-EXTJSIV-4312.js -> src/PartKeepr/FrontendBundle/Resources/public/js/ExtJS/Bugfixes/Ext.selection.RowModel-EXTJSIV-4312.js | 0
Rsrc/frontend/js/ExtJS/Enhancements/Ext.data.Connection-sessionInjection.js -> src/PartKeepr/FrontendBundle/Resources/public/js/ExtJS/Enhancements/Ext.data.Connection-sessionInjection.js | 0
Rsrc/frontend/js/ExtJS/Enhancements/Ext.data.Model-setDataWithAssociations.js -> src/PartKeepr/FrontendBundle/Resources/public/js/ExtJS/Enhancements/Ext.data.Model-setDataWithAssociations.js | 0
Rsrc/frontend/js/ExtJS/Enhancements/Ext.data.reader.Json-exceptionHandling.js -> src/PartKeepr/FrontendBundle/Resources/public/js/ExtJS/Enhancements/Ext.data.reader.Json-exceptionHandling.js | 0
Rsrc/frontend/js/ExtJS/Enhancements/Ext.form.field.Trigger-themeAdjustment.js -> src/PartKeepr/FrontendBundle/Resources/public/js/ExtJS/Enhancements/Ext.form.field.Trigger-themeAdjustment.js | 0
Rsrc/frontend/js/ExtJS/Enhancements/Ext.grid.Column-injectDefaultRenderer.js -> src/PartKeepr/FrontendBundle/Resources/public/js/ExtJS/Enhancements/Ext.grid.Column-injectDefaultRenderer.js | 0
Rsrc/frontend/js/ExtJS/Enhancements/Ext.grid.feature.Grouping.expandCollapseAll.js -> src/PartKeepr/FrontendBundle/Resources/public/js/ExtJS/Enhancements/Ext.grid.feature.Grouping.expandCollapseAll.js | 0
Rsrc/frontend/js/ExtJS/Enhancements/Ext.input.CharContextMenu.js -> src/PartKeepr/FrontendBundle/Resources/public/js/ExtJS/Enhancements/Ext.input.CharContextMenu.js | 0
Rsrc/frontend/js/ExtJS/Enhancements/Ext.layout.component.field.Trigger-theme.js -> src/PartKeepr/FrontendBundle/Resources/public/js/ExtJS/Enhancements/Ext.layout.component.field.Trigger-theme.js | 0
Rsrc/frontend/js/ExtJS/Enhancements/Ext.tree.View-missingMethods.js -> src/PartKeepr/FrontendBundle/Resources/public/js/ExtJS/Enhancements/Ext.tree.View-missingMethods.js | 0
Rsrc/frontend/js/Models/AbstractCategory.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Models/AbstractCategory.js | 0
Rsrc/frontend/js/Models/Distributor.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Models/Distributor.js | 0
Rsrc/frontend/js/Models/Footprint.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Models/Footprint.js | 0
Rsrc/frontend/js/Models/FootprintAttachment.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Models/FootprintAttachment.js | 0
Rsrc/frontend/js/Models/FootprintCategory.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Models/FootprintCategory.js | 0
Rsrc/frontend/js/Models/Manufacturer.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Models/Manufacturer.js | 0
Rsrc/frontend/js/Models/ManufacturerICLogo.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Models/ManufacturerICLogo.js | 0
Rsrc/frontend/js/Models/Message.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Models/Message.js | 0
Asrc/PartKeepr/FrontendBundle/Resources/public/js/Models/Part.js | 61+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Rsrc/frontend/js/Models/PartAttachment.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Models/PartAttachment.js | 0
Rsrc/frontend/js/Models/PartCategory.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Models/PartCategory.js | 0
Rsrc/frontend/js/Models/PartDistributor.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Models/PartDistributor.js | 0
Rsrc/frontend/js/Models/PartManufacturer.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Models/PartManufacturer.js | 0
Rsrc/frontend/js/Models/PartParameter.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Models/PartParameter.js | 0
Rsrc/frontend/js/Models/PartUnit.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Models/PartUnit.js | 0
Rsrc/frontend/js/Models/PrintingPageBasicLayout.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Models/PrintingPageBasicLayout.js | 0
Rsrc/frontend/js/Models/PrintingPrintingJobConfiguration.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Models/PrintingPrintingJobConfiguration.js | 0
Rsrc/frontend/js/Models/PrintingRenderer.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Models/PrintingRenderer.js | 0
Rsrc/frontend/js/Models/PrintingResponse.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Models/PrintingResponse.js | 0
Rsrc/frontend/js/Models/PrintingType.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Models/PrintingType.js | 0
Rsrc/frontend/js/Models/Project.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Models/Project.js | 0
Rsrc/frontend/js/Models/ProjectAttachment.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Models/ProjectAttachment.js | 0
Rsrc/frontend/js/Models/ProjectPart.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Models/ProjectPart.js | 0
Rsrc/frontend/js/Models/ProjectReport.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Models/ProjectReport.js | 0
Rsrc/frontend/js/Models/ProjectReportList.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Models/ProjectReportList.js | 0
Rsrc/frontend/js/Models/SiPrefix.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Models/SiPrefix.js | 0
Rsrc/frontend/js/Models/StatisticSample.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Models/StatisticSample.js | 0
Asrc/PartKeepr/FrontendBundle/Resources/public/js/Models/StockEntry.js | 16++++++++++++++++
Rsrc/frontend/js/Models/StorageLocation.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Models/StorageLocation.js | 0
Rsrc/frontend/js/Models/SystemInformationRecord.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Models/SystemInformationRecord.js | 0
Rsrc/frontend/js/Models/SystemNotice.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Models/SystemNotice.js | 0
Rsrc/frontend/js/Models/TipOfTheDay.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Models/TipOfTheDay.js | 0
Rsrc/frontend/js/Models/Unit.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Models/Unit.js | 0
Rsrc/frontend/js/Models/User.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Models/User.js | 0
Rsrc/frontend/js/Models/UserPreference.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Models/UserPreference.js | 0
Asrc/PartKeepr/FrontendBundle/Resources/public/js/PartKeepr.js | 670+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Rsrc/frontend/js/Util/JsonWithAssociationsWriter.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Util/JsonWithAssociationsWriter.js | 0
Rsrc/frontend/js/Util/ServiceCall.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Util/ServiceCall.js | 0
Rsrc/frontend/js/Util/i18n.js -> src/PartKeepr/FrontendBundle/Resources/public/js/Util/i18n.js | 0
Rsrc/frontend/js/compat.js -> src/PartKeepr/FrontendBundle/Resources/public/js/compat.js | 0
Rsrc/frontend/js/org.jerrymouse.util.locale/locale.js -> src/PartKeepr/FrontendBundle/Resources/public/js/org.jerrymouse.util.locale/locale.js | 0
Asrc/PartKeepr/FrontendBundle/Resources/public/js/php.default.min.js | 822+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Rsrc/frontend/js/webcam.js -> src/PartKeepr/FrontendBundle/Resources/public/js/webcam.js | 0
Msrc/PartKeepr/FrontendBundle/Resources/views/index.html.twig | 257++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------
Dsrc/frontend/css/PartKeepr.css | 227-------------------------------------------------------------------------------
Dsrc/frontend/css/partkeepr-theme.css | 1-
Dsrc/frontend/js/Components/CategoryEditor/CategoryEditorWindow.js | 67-------------------------------------------------------------------
Dsrc/frontend/js/Components/CategoryStore.js | 31-------------------------------
Dsrc/frontend/js/Components/CategoryTree.js | 120-------------------------------------------------------------------------------
Dsrc/frontend/js/Components/Editor/Editor.js | 145-------------------------------------------------------------------------------
Dsrc/frontend/js/Components/Editor/EditorGrid.js | 231-------------------------------------------------------------------------------
Dsrc/frontend/js/Components/Footprint/FootprintTree.js | 218-------------------------------------------------------------------------------
Dsrc/frontend/js/Components/Part/Editor/PartEditor.js | 457-------------------------------------------------------------------------------
Dsrc/frontend/js/Components/Part/PartCategoryTree.js | 54------------------------------------------------------
Dsrc/frontend/js/Components/Part/PartDisplay.js | 231-------------------------------------------------------------------------------
Dsrc/frontend/js/Components/Part/PartsGrid.js | 487-------------------------------------------------------------------------------
Dsrc/frontend/js/Components/Session/SessionManager.js | 100-------------------------------------------------------------------------------
Dsrc/frontend/js/Components/Statistics/StatisticsChart.js | 150-------------------------------------------------------------------------------
Dsrc/frontend/js/Components/StockReport/StockHistoryGrid.js | 40----------------------------------------
Dsrc/frontend/js/Components/Widgets/RemoteImageFieldLayout.js | 34----------------------------------
Dsrc/frontend/js/Components/Widgets/ResistorDisplay.js | 25-------------------------
Dsrc/frontend/js/Components/Widgets/WebcamPanel.js | 63---------------------------------------------------------------
Dsrc/frontend/js/Dialogs/FileUploadDialog.js | 190-------------------------------------------------------------------------------
Dsrc/frontend/js/Models/Part.js | 61-------------------------------------------------------------
Dsrc/frontend/js/Models/StockEntry.js | 16----------------
Dsrc/frontend/js/PartKeepr.js | 670-------------------------------------------------------------------------------
220 files changed, 6808 insertions(+), 3643 deletions(-)

diff --git a/app/config/config.yml b/app/config/config.yml @@ -43,7 +43,7 @@ framework: assetic: debug: %kernel.debug% use_controller: false - bundles: [ ] + bundles: [ PartKeeprFrontendBundle ] #java: /usr/bin/java filters: cssrewrite: ~ diff --git a/composer.json b/composer.json @@ -68,6 +68,9 @@ "extra": { "incenteev-parameters": { "file": "app/config/parameters.yml" + }, + "installer-paths": { + "web/js/packages/{$name}": ["zendmaniacs/extjs5"] } } } diff --git a/composer.lock b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "c300c6220e55036c39d1f09dcc68cc7e", + "hash": "3864152761705eb89257f9257c60f505", "packages": [ { "name": "cbsi/doctrine2-nestedset", diff --git a/src/PartKeepr/FrontendBundle/Resources/public/css/PartKeepr.css b/src/PartKeepr/FrontendBundle/Resources/public/css/PartKeepr.css @@ -0,0 +1,226 @@ +.x-form-spinner-down { + right: 16px; +} + +.manufacturer-ic-logos .thumb{ + background: #ffffff; + padding: 3px; +} + +.x-trigger-cell:last-child .x-form-trigger { + border-bottom-right-radius: 5px; + border-top-right-radius: 5px; + border: 1px solid #B5B8C8; + border-left-width: 0; +} + +.x-form-spinner-up { + border-top-right-radius: 5px; + border-right: 1px solid #B5B8C8 !important; + border-bottom: 0 !important; + border-top: 1px solid #B5B8C8 !important; +} + +.x-form-spinner-down { + border-bottom-right-radius: 5px; + border-bottom-width: 1px !important; + border-top: 0 !important; + border-right: 1px solid #B5B8C8 !important; + border-bottom: 1px solid #B5B8C8 !important; + +} +.x-form-trigger { + background-color: white; + border: 1px solid #B5B8C8; + border-left-width: 0; + border-right-width: 0; +} + +.x-form-trigger-input-cell .x-form-field { + border-right-width: 0; + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.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(../../../../../frontend/resources/images/over.gif) repeat-x left top; + padding: 4px; +} + +.manufacturer-ic-logos .x-item-selected{ + background: #eff5fb url(../../../../../frontend/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(../../../../../frontend/resources/images/loading.gif) no-repeat; position: absolute; display: block; top: 25px; left: 22px; width: 120px; height: 120px; } + +.icon-footprint { + background-image: url(../../../../../frontend/resources/fugue-icons/icons/fingerprint.png) !important; +} + +.icon-system-monitor { + background-image: url(../../../../../frontend/resources/fugue-icons/icons/system-monitor.png) !important; +} + +.icon-chart-bar { + background-image: url(../../../../../frontend/resources/silkicons/chart_bar.png) !important; +} + +.icon-wooden-box { + background-image: url(../../../../../frontend/resources/fugue-icons/icons/wooden-box.png) !important; +} + +.icon-unit { + background-image: url(../../../../../frontend/resources/icons/unit.png) !important; +} + +.icon-building { + background-image: url(../../../../../frontend/resources/silkicons/building.png) !important; +} + +.icon-lorry { + background-image: url(../../../../../frontend/resources/silkicons/lorry.png) !important; +} + +.icon-user { + background-image: url(../../../../../frontend/resources/silkicons/user.png) !important; +} + +.icon-ruler { + background-image: url(../../../../../frontend/resources/fugue-icons/icons/ruler.png) !important; +} + +.icon-gear { + background-image: url(../../../../../frontend/resources/fugue-icons/icons/gear.png) !important; +} + +.icon-drive-upload { + background-image: url(../../../../../frontend/resources/fugue-icons/icons/drive-upload.png) !important; +} + +.icon-infocard { + background-image: url(../../../../../frontend/resources/fugue-icons/icons/infocard.png) !important; +} + +.icon-drill { + background-image: url(../../../../../frontend/resources/fugue-icons/icons/drill.png) !important; +} + +.icon-service-bell { + background-image: url(../../../../../frontend/resources/fugue-icons/icons/service-bell.png) !important; +} + +.icon-brick { + background-image: url(../../../../../frontend/resources/silkicons/brick.png) !important; +} + +.icon-table { + background-image: url(../../../../../frontend/resources/fugue-icons/icons/table.png) !important; +} + +.icon-attach { + background-image: url(../../../../../frontend/resources/silkicons/attach.png) !important; +} + +.icon-notebook { + background-image: url(../../../../../frontend/resources/fugue-icons/icons/notebook.png) !important; +} + +.x-char-picker { + width:520px; + height:286px; + cursor:pointer +} + +.x-char-picker a { + border:1px solid #fff; + float:left; + padding:2px; + text-decoration:none; + -moz-outline: 0 none; + outline:0 none; + cursor:pointer; + color: black; +} + +.x-char-picker a:hover, .x-char-picker a.x-char-picker-selected { + border-color:#8bb8f3; + background-color:#deecfd; +} + +.x-char-picker em { + display:block; + border:1px solid #aca899 +} + +.x-char-picker em span { + cursor:pointer; + display:block; + height:18px; + vertical-align: top; + text-align: center; + width:18px; + line-height:18px +} + +.x-form-trigger-help { + background-image: url('../../../../../frontend/resources/images/trigger-help.gif'),-webkit-linear-gradient(top, #dee3e6 0%, #fcfcfd 12%, #fff 100%); +} + +.x-form-trigger-link { + background-image: url('../../../../../frontend/resources/images/trigger-link.png'),-webkit-linear-gradient(top, #dee3e6 0%, #fcfcfd 12%, #fff 100%); +}+ \ No newline at end of file diff --git a/src/PartKeepr/FrontendBundle/Resources/public/css/partkeepr-theme.css b/src/PartKeepr/FrontendBundle/Resources/public/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-border-box *{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-rtl{direction:rtl}.x-ltr{direction:ltr}.x-clear{overflow:hidden;clear:both;font-size:0;line-height:0;display:table}.x-strict .x-ie7 .x-clear{height:0;width:0}.x-layer{position:absolute !important;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 .x-form-item-label,.x-item-disabled .x-form-field,.x-item-disabled .x-form-cb-label,.x-item-disabled .x-form-trigger{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=30);opacity:0.3}.x-ie6 .x-item-disabled{filter:none}.x-hidden,.x-hide-offsets{display:block !important;visibility:hidden !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;-webkit-border-radius:5px 5px;-moz-border-radius:5px 5px;-ms-border-radius:5px 5px;-o-border-radius:5px 5px;border-radius:5px 5px}.x-ie-shadow{background-color:#777;display:none;position:absolute;overflow:hidden;zoom:1}.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('../../../../../frontend/themes/images/partkeepr/box/corners.gif')}.x-box-tc{background-image:url('../../../../../frontend/themes/images/partkeepr/box/tb.gif')}.x-box-tr{background-image:url('../../../../../frontend/themes/images/partkeepr/box/corners.gif')}.x-box-ml{background-image:url('../../../../../frontend/themes/images/partkeepr/box/l.gif')}.x-box-mc{background-color:#eee;background-image:url('../../../../../frontend/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('../../../../../frontend/themes/images/partkeepr/box/r.gif')}.x-box-bl{background-image:url('../../../../../frontend/themes/images/partkeepr/box/corners.gif')}.x-box-bc{background-image:url('../../../../../frontend/themes/images/partkeepr/box/tb.gif')}.x-box-br{background-image:url('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/themes/images/partkeepr/box/l-blue.gif')}.x-box-blue .x-box-mr{background-image:url('../../../../../frontend/themes/images/partkeepr/box/r-blue.gif')}.x-container{zoom:1}.x-container:before{content:"";clear:both;display:table}table.x-container:before,tbody.x-container:before,tr.x-container:before{display:none}.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('../../../../../frontend/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-strict .x-ie6 .x-boundlist-list-ct,.x-strict .x-ie7 .x-boundlist-list-ct{position:relative}.x-boundlist-item{padding:2px;user-select:none;-o-user-select:none;-ms-user-select:none;-moz-user-select:-moz-none;-webkit-user-select:none;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}.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;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:block;color:inherit;width:100%;zoom:1}.x-btn button{width:100%;display:block;margin:0;padding:0;border:0;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;background-color:transparent;background-repeat:no-repeat;background-position:left center;overflow:hidden}.x-btn .x-btn-left .x-btn-inner{text-align:left}.x-btn .x-btn-center .x-btn-inner{text-align:center}.x-btn .x-btn-right .x-btn-inner{text-align:right}.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}.x-ie9 .x-btn button{overflow:visible!important}* 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-btn .x-frame-mc{vertical-align:middle;white-space:nowrap;cursor:pointer}.x-btn-noicon .x-frame-mc{text-align:center}.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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/themes/images/partkeepr/button/s-arrow-b.gif');padding-bottom:14px}.x-toolbar .x-btn-split-right{background-image:url('../../../../../frontend/themes/images/partkeepr/button/s-arrow-noline.gif');padding-right:12px !important}.x-toolbar .x-btn-split-bottom{background-image:url('../../../../../frontend/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('../../../../../frontend/themes/images/partkeepr/button/s-arrow-o.gif')}.x-btn-over .x-btn-split-bottom{background-image:url('../../../../../frontend/themes/images/partkeepr/button/s-arrow-bo.gif')}.x-btn-default-small{border-color:#b9b9b9}.x-btn-default-small{-webkit-border-radius:5px;-moz-border-radius:5px;-ms-border-radius:5px;-o-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:linear-gradient(top, #ededed,#c7c7c7)}.x-nlg .x-btn-default-small-mc{background-image:url('../../../../../frontend/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;-webkit-border-radius:0px;-moz-border-radius:0px;-ms-border-radius:0px;-o-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('../../../../../frontend/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('../../../../../frontend/themes/images/partkeepr/btn/btn-default-small-sides.gif');background-position:0 0}.x-nbr .x-btn-default-small-mc{padding:0px 0px 0px 0px}.x-strict .x-ie7 .x-btn-default-small-tl,.x-strict .x-ie7 .x-btn-default-small-bl{position:relative;right: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 a,.x-btn-default-small-icon .x-btn-inner,.x-btn-default-small-noicon button,.x-btn-default-small-noicon a,.x-btn-default-small-noicon .x-btn-inner{height:16px;line-height:16px}.x-btn-default-small-icon button,.x-btn-default-small-icon a{padding:0}.x-btn-default-small-icon .x-btn-inner{width:16px;padding:0}.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,.x-btn-default-small-icon-text-left a{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,.x-btn-default-small-icon-text-right a{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-ie .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-ie .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: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:linear-gradient(top, #fafafa,#c7c7c7)}.x-btn-default-small-menu-active,.x-btn-default-small-pressed{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:linear-gradient(top, #c7c7c7,#cccccc)}.x-btn-default-small-disabled{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: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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/themes/images/partkeepr/btn/btn-default-small-disabled-bg.gif')}.x-nlg .x-btn-default-small{background-repeat:repeat-x;background-image:url('../../../../../frontend/themes/images/partkeepr/btn/btn-default-small-bg.gif')}.x-nlg .x-btn-default-small-over{background-repeat:repeat-x;background-image:url('../../../../../frontend/themes/images/partkeepr/btn/btn-default-small-over-bg.gif')}.x-nlg .x-btn-default-small-focus{background-repeat:repeat-x;background-image:url('../../../../../frontend/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('../../../../../frontend/themes/images/partkeepr/btn/btn-default-small-pressed-bg.gif')}.x-nlg .x-btn-default-small-disabled{background-repeat:repeat-x;background-image:url('../../../../../frontend/themes/images/partkeepr/btn/btn-default-small-disabled-bg.gif')}.x-btn-default-medium{border-color:#b9b9b9}.x-btn-default-medium{-webkit-border-radius:3px;-moz-border-radius:3px;-ms-border-radius:3px;-o-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:linear-gradient(top, #ededed,#c7c7c7)}.x-nlg .x-btn-default-medium-mc{background-image:url('../../../../../frontend/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;-webkit-border-radius:0px;-moz-border-radius:0px;-ms-border-radius:0px;-o-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('../../../../../frontend/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('../../../../../frontend/themes/images/partkeepr/btn/btn-default-medium-sides.gif');background-position:0 0}.x-nbr .x-btn-default-medium-mc{padding:1px 1px 1px 1px}.x-strict .x-ie7 .x-btn-default-medium-tl,.x-strict .x-ie7 .x-btn-default-medium-bl{position:relative;right:0}.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 a,.x-btn-default-medium-icon .x-btn-inner,.x-btn-default-medium-noicon button,.x-btn-default-medium-noicon a,.x-btn-default-medium-noicon .x-btn-inner{height:24px;line-height:24px}.x-btn-default-medium-icon button,.x-btn-default-medium-icon a{padding:0}.x-btn-default-medium-icon .x-btn-inner{width:24px;padding:0}.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,.x-btn-default-medium-icon-text-left a{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,.x-btn-default-medium-icon-text-right a{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-ie .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-ie .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: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:linear-gradient(top, #fafafa,#c7c7c7)}.x-btn-default-medium-menu-active,.x-btn-default-medium-pressed{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:linear-gradient(top, #c7c7c7,#cccccc)}.x-btn-default-medium-disabled{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: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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/themes/images/partkeepr/btn/btn-default-medium-disabled-bg.gif')}.x-nlg .x-btn-default-medium{background-repeat:repeat-x;background-image:url('../../../../../frontend/themes/images/partkeepr/btn/btn-default-medium-bg.gif')}.x-nlg .x-btn-default-medium-over{background-repeat:repeat-x;background-image:url('../../../../../frontend/themes/images/partkeepr/btn/btn-default-medium-over-bg.gif')}.x-nlg .x-btn-default-medium-focus{background-repeat:repeat-x;background-image:url('../../../../../frontend/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('../../../../../frontend/themes/images/partkeepr/btn/btn-default-medium-pressed-bg.gif')}.x-nlg .x-btn-default-medium-disabled{background-repeat:repeat-x;background-image:url('../../../../../frontend/themes/images/partkeepr/btn/btn-default-medium-disabled-bg.gif')}.x-btn-default-large{border-color:#b9b9b9}.x-btn-default-large{-webkit-border-radius:3px;-moz-border-radius:3px;-ms-border-radius:3px;-o-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:linear-gradient(top, #ededed,#c7c7c7)}.x-nlg .x-btn-default-large-mc{background-image:url('../../../../../frontend/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;-webkit-border-radius:0px;-moz-border-radius:0px;-ms-border-radius:0px;-o-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('../../../../../frontend/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('../../../../../frontend/themes/images/partkeepr/btn/btn-default-large-sides.gif');background-position:0 0}.x-nbr .x-btn-default-large-mc{padding:1px 1px 1px 1px}.x-strict .x-ie7 .x-btn-default-large-tl,.x-strict .x-ie7 .x-btn-default-large-bl{position:relative;right:0}.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 a,.x-btn-default-large-icon .x-btn-inner,.x-btn-default-large-noicon button,.x-btn-default-large-noicon a,.x-btn-default-large-noicon .x-btn-inner{height:32px;line-height:32px}.x-btn-default-large-icon button,.x-btn-default-large-icon a{padding:0}.x-btn-default-large-icon .x-btn-inner{width:32px;padding:0}.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,.x-btn-default-large-icon-text-left a{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,.x-btn-default-large-icon-text-right a{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-ie .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-ie .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: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:linear-gradient(top, #fafafa,#c7c7c7)}.x-btn-default-large-menu-active,.x-btn-default-large-pressed{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:linear-gradient(top, #c7c7c7,#cccccc)}.x-btn-default-large-disabled{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: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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/themes/images/partkeepr/btn/btn-default-large-disabled-bg.gif')}.x-nlg .x-btn-default-large{background-repeat:repeat-x;background-image:url('../../../../../frontend/themes/images/partkeepr/btn/btn-default-large-bg.gif')}.x-nlg .x-btn-default-large-over{background-repeat:repeat-x;background-image:url('../../../../../frontend/themes/images/partkeepr/btn/btn-default-large-over-bg.gif')}.x-nlg .x-btn-default-large-focus{background-repeat:repeat-x;background-image:url('../../../../../frontend/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('../../../../../frontend/themes/images/partkeepr/btn/btn-default-large-pressed-bg.gif')}.x-nlg .x-btn-default-large-disabled{background-repeat:repeat-x;background-image:url('../../../../../frontend/themes/images/partkeepr/btn/btn-default-large-disabled-bg.gif')}.x-btn-default-toolbar-small{border-color:#b9b9b9}.x-btn-default-toolbar-small{-webkit-border-radius:5px;-moz-border-radius:5px;-ms-border-radius:5px;-o-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:linear-gradient(top, #ededed,#c7c7c7)}.x-nlg .x-btn-default-toolbar-small-mc{background-image:url('../../../../../frontend/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;-webkit-border-radius:0px;-moz-border-radius:0px;-ms-border-radius:0px;-o-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('../../../../../frontend/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('../../../../../frontend/themes/images/partkeepr/btn/btn-default-toolbar-small-sides.gif');background-position:0 0}.x-nbr .x-btn-default-toolbar-small-mc{padding:0px 0px 0px 0px}.x-strict .x-ie7 .x-btn-default-toolbar-small-tl,.x-strict .x-ie7 .x-btn-default-toolbar-small-bl{position:relative;right: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 a,.x-btn-default-toolbar-small-icon .x-btn-inner,.x-btn-default-toolbar-small-noicon button,.x-btn-default-toolbar-small-noicon a,.x-btn-default-toolbar-small-noicon .x-btn-inner{height:16px;line-height:16px}.x-btn-default-toolbar-small-icon button,.x-btn-default-toolbar-small-icon a{padding:0}.x-btn-default-toolbar-small-icon .x-btn-inner{width:16px;padding:0}.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,.x-btn-default-toolbar-small-icon-text-left a{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,.x-btn-default-toolbar-small-icon-text-right a{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-ie .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-ie .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: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:linear-gradient(top, #fafafa,#c7c7c7)}.x-btn-default-toolbar-small-menu-active,.x-btn-default-toolbar-small-pressed{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:linear-gradient(top, #c7c7c7,#cccccc)}.x-btn-default-toolbar-small-disabled{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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/themes/images/partkeepr/btn/btn-default-toolbar-small-pressed-bg.gif')}.x-btn-default-toolbar-medium{border-color:#b9b9b9}.x-btn-default-toolbar-medium{-webkit-border-radius:3px;-moz-border-radius:3px;-ms-border-radius:3px;-o-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:linear-gradient(top, #ededed,#c7c7c7)}.x-nlg .x-btn-default-toolbar-medium-mc{background-image:url('../../../../../frontend/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;-webkit-border-radius:0px;-moz-border-radius:0px;-ms-border-radius:0px;-o-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('../../../../../frontend/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('../../../../../frontend/themes/images/partkeepr/btn/btn-default-toolbar-medium-sides.gif');background-position:0 0}.x-nbr .x-btn-default-toolbar-medium-mc{padding:1px 1px 1px 1px}.x-strict .x-ie7 .x-btn-default-toolbar-medium-tl,.x-strict .x-ie7 .x-btn-default-toolbar-medium-bl{position:relative;right:0}.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 a,.x-btn-default-toolbar-medium-icon .x-btn-inner,.x-btn-default-toolbar-medium-noicon button,.x-btn-default-toolbar-medium-noicon a,.x-btn-default-toolbar-medium-noicon .x-btn-inner{height:24px;line-height:24px}.x-btn-default-toolbar-medium-icon button,.x-btn-default-toolbar-medium-icon a{padding:0}.x-btn-default-toolbar-medium-icon .x-btn-inner{width:24px;padding:0}.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,.x-btn-default-toolbar-medium-icon-text-left a{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,.x-btn-default-toolbar-medium-icon-text-right a{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-ie .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-ie .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: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:linear-gradient(top, #fafafa,#c7c7c7)}.x-btn-default-toolbar-medium-menu-active,.x-btn-default-toolbar-medium-pressed{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:linear-gradient(top, #c7c7c7,#cccccc)}.x-btn-default-toolbar-medium-disabled{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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/themes/images/partkeepr/btn/btn-default-toolbar-medium-pressed-bg.gif')}.x-btn-default-toolbar-large{border-color:#b9b9b9}.x-btn-default-toolbar-large{-webkit-border-radius:3px;-moz-border-radius:3px;-ms-border-radius:3px;-o-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:linear-gradient(top, #ededed,#c7c7c7)}.x-nlg .x-btn-default-toolbar-large-mc{background-image:url('../../../../../frontend/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;-webkit-border-radius:0px;-moz-border-radius:0px;-ms-border-radius:0px;-o-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('../../../../../frontend/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('../../../../../frontend/themes/images/partkeepr/btn/btn-default-toolbar-large-sides.gif');background-position:0 0}.x-nbr .x-btn-default-toolbar-large-mc{padding:1px 1px 1px 1px}.x-strict .x-ie7 .x-btn-default-toolbar-large-tl,.x-strict .x-ie7 .x-btn-default-toolbar-large-bl{position:relative;right:0}.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 a,.x-btn-default-toolbar-large-icon .x-btn-inner,.x-btn-default-toolbar-large-noicon button,.x-btn-default-toolbar-large-noicon a,.x-btn-default-toolbar-large-noicon .x-btn-inner{height:32px;line-height:32px}.x-btn-default-toolbar-large-icon button,.x-btn-default-toolbar-large-icon a{padding:0}.x-btn-default-toolbar-large-icon .x-btn-inner{width:32px;padding:0}.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,.x-btn-default-toolbar-large-icon-text-left a{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,.x-btn-default-toolbar-large-icon-text-right a{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-ie .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-ie .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: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:linear-gradient(top, #fafafa,#c7c7c7)}.x-btn-default-toolbar-large-menu-active,.x-btn-default-toolbar-large-pressed{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:linear-gradient(top, #c7c7c7,#cccccc)}.x-btn-default-toolbar-large-disabled{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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-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;-webkit-border-radius:0px;-moz-border-radius:0px;-ms-border-radius:0px;-o-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('../../../../../frontend/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('../../../../../frontend/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:0px 0px 0px 0px}.x-strict .x-ie7 .x-btn-group-default-framed-tl,.x-strict .x-ie7 .x-btn-group-default-framed-bl{position:relative;right:0}.x-btn-group-default-framed{border-color:#b7c8d7;-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;-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;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;border-top-left-radius:2px;-moz-border-radius-topright:2px;-webkit-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: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('../../../../../frontend/themes/images/partkeepr/shared/right-btn.gif')}.x-datepicker-prev{left:5px}.x-datepicker-prev a{background-image:url('../../../../../frontend/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-image:url('../../../../../frontend/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: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}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:#000;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: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;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('../../../../../frontend/themes/images/partkeepr/tools/tool-sprites.gif');height:15px;width:15px;padding:0;margin:6px 12px 5px 15px;border:0;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('../../../../../frontend/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('../../../../../frontend/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{user-select:none;-o-user-select:none;-ms-user-select:none;-moz-user-select:-moz-none;-webkit-user-select:none;cursor:default;background:#f0f0f0 !important;padding:2px}.x-menu-item .x-form-text{user-select:text;-webkit-user-select:text;-o-user-select:text;-ie-user-select:text;-moz-user-select:text;-ie-user-select:text}.x-menu-icon-separator{position:absolute;top:0px;left:27px;z-index:0;border-left:solid 1px #e0e0e0;background-color:#fff;width:2px;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;margin:1px;padding:6px 2px 3px 32px;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;position:absolute;top:5px;left:4px;background:no-repeat center center}.x-menu-item-text{font-size:11px;color:#222}.x-menu-item-checked .x-menu-item-icon{background-image:url('../../../../../frontend/themes/images/partkeepr/menu/checked.gif')}.x-menu-item-checked .x-menu-group-icon{background-image:url('../../../../../frontend/themes/images/partkeepr/menu/group-checked.gif')}.x-menu-item-unchecked .x-menu-item-icon{background-image:url('../../../../../frontend/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:no-repeat center center;background-image:url('../../../../../frontend/themes/images/partkeepr/menu/menu-parent.gif')}.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%, #f8f9fa), color-stop(100%, #e3e7ea));background-image:-webkit-linear-gradient(top, #f8f9fa,#e3e7ea);background-image:-moz-linear-gradient(top, #f8f9fa,#e3e7ea);background-image:-o-linear-gradient(top, #f8f9fa,#e3e7ea);background-image:linear-gradient(top, #f8f9fa,#e3e7ea);margin:0px;border:1px solid #ceb1b1;cursor:pointer;-webkit-border-radius:3px;-moz-border-radius:3px;-ms-border-radius:3px;-o-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-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:transparent}.x-strict .x-ie7m .x-ie .x-menu-icon-separator{width:1px}.x-strict .x-ie7m .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 repeat-x left top;background-image:url('../../../../../frontend/themes/images/partkeepr/menu/menu-item-active-bg.gif')}.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{visibility:hidden}.x-grid-empty{padding:10px;color:gray;font:normal 11px tahoma, arial, helvetica, sans-serif}.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-autowidth-table table.x-grid-table{table-layout:auto;width:auto!important}.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;border-bottom-color:#c5c5c5;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:linear-gradient(top, #f9f9f9,#e3e4e6)}.x-accordion-item .x-grid-header-ct{border-width:0 0 1px 0!important}.x-column-header{padding:0;position:absolute;overflow:hidden;border-right:1px solid #c5c5c5;border-left:0 none;border-top:0 none;border-bottom:0 none;text-shadow:0 1px 0 rgba(255,255,255,0.3);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: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:15px;padding:3px 6px 4px}.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;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:linear-gradient(top, #eff1f3,#b0bcc5)}.x-nlg .x-grid-header-ct,.x-nlg .x-column-header{background:repeat-x 0 top;background-image:url('../../../../../frontend/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('../../../../../frontend/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-color:#c3daf9;background-image:url('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/themes/images/partkeepr/grid/sort_desc.png')}.x-grid-row{vertical-align:top}.x-grid-row .x-grid-cell{color:null;font:normal 11px/15px tahoma,arial,verdana,sans-serif;background-color:#fff;border-color:#ededed;border-style:solid;border-top-color:#fafafa;border-width:0}.x-grid-with-row-lines .x-grid-cell{border-width:1px 0}.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: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: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}.x-grid-cell-inner{overflow:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis;padding:2px 6px 3px;white-space:nowrap}.x-grid-with-row-lines .x-grid-cell-inner{line-height:13px;padding-bottom:4px}.x-action-col-cell .x-grid-cell-inner{line-height:0;padding:2px}.x-action-col-cell .x-item-disabled{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=30);opacity:0.3}.x-grid-with-row-lines .x-action-col-cell .x-grid-cell-inner{padding-top:1px}.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:linear-gradient(left, #f6f6f6,#e9e9e9)}.x-grid-row .x-grid-cell-row-checker{vertical-align:middle}.x-ie6 .x-grid-header-row,.x-ie7 .x-grid-header-row,.x-quirks .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:linear-gradient(left, #2aaad3,#2699be)}.x-grid-dirty-cell{background-image:url('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/themes/images/partkeepr/grid/cell-special-selected-bg.gif')}.x-grid-with-col-lines .x-grid-cell{padding-right:0;border-right:1px solid #c1c1c1}.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('../../../../../frontend/themes/images/partkeepr/grid/property-cell-bg.gif');background-repeat:no-repeat;background-position:-16px 2px}.x-grid-with-row-lines.x-property-grid .x-grid-row .x-grid-property-name .x-grid-cell-inner,.x-grid-with-row-lines.x-property-grid .x-grid-row-over .x-grid-property-name .x-grid-cell-inner{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{user-select:none;-o-user-select:none;-ms-user-select:none;-moz-user-select:-moz-none;-webkit-user-select:none;cursor:default}.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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/themes/images/partkeepr/grid/col-move-top.gif')}.col-move-bottom{background-image:url('../../../../../frontend/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-hd-collapsible .x-grid-group-title{background:transparent no-repeat 0 -1px;background-image:url('../../../../../frontend/themes/images/partkeepr/grid/group-collapse.gif');padding:0 0 0 14px}.x-grid-group-title{color:#5c5c5c;font:bold 11px tahoma,arial,verdana,sans-serif}.x-grid-group-hd-collapsed .x-grid-group-title{background-image:url('../../../../../frontend/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('../../../../../frontend/themes/images/partkeepr/grid/group-expand.gif')}.x-group-by-icon{background-image:url('../../../../../frontend/themes/images/partkeepr/grid/group-by.gif')}.x-show-groups-icon{background-image:url('../../../../../frontend/themes/images/partkeepr/grid/group-by.gif')}.x-column-header-checkbox .x-column-header-inner{padding:0}.x-grid-cell-special .x-grid-cell-inner{padding-left:4px;padding-right:4px}.x-grid-row-checker,.x-column-header-checkbox .x-column-header-text{height:14px;width:14px;line-height:0;background-image:url('../../../../../frontend/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:0 5px}.x-quirks .x-ie .x-grid-row-checker,.x-quirks .x-ie .x-column-header-checkbox .x-column-header-text,.x-ie7m .x-grid-row-checker,.x-ie7m .x-column-header-checkbox .x-column-header-text{margin-left:3px}.x-grid-hd-checker-on .x-column-header-text{background-image:url('../../../../../frontend/themes/images/partkeepr/grid/checked.gif')}.x-grid-cell-row-checker .x-grid-cell-inner{padding-top:4px;padding-bottom:2px;line-height:14px}.x-grid-with-row-lines .x-grid-cell-row-checker .x-grid-cell-inner{padding-top:3px}.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('../../../../../frontend/themes/images/partkeepr/grid/checked.gif')}.x-tbar-page-first{background-image:url('../../../../../frontend/themes/images/partkeepr/grid/page-first.gif') !important}.x-tbar-loading{background-image:url('../../../../../frontend/themes/images/partkeepr/grid/refresh.gif') !important}.x-tbar-page-last{background-image:url('../../../../../frontend/themes/images/partkeepr/grid/page-last.gif') !important}.x-tbar-page-next{background-image:url('../../../../../frontend/themes/images/partkeepr/grid/page-next.gif') !important}.x-tbar-page-prev{background-image:url('../../../../../frontend/themes/images/partkeepr/grid/page-prev.gif') !important}.x-item-disabled .x-tbar-loading{background-image:url('../../../../../frontend/themes/images/partkeepr/grid/refresh-disabled.gif') !important}.x-item-disabled .x-tbar-page-first{background-image:url('../../../../../frontend/themes/images/partkeepr/grid/page-first-disabled.gif') !important}.x-item-disabled .x-tbar-page-last{background-image:url('../../../../../frontend/themes/images/partkeepr/grid/page-last-disabled.gif') !important}.x-item-disabled .x-tbar-page-next{background-image:url('../../../../../frontend/themes/images/partkeepr/grid/page-next-disabled.gif') !important}.x-item-disabled .x-tbar-page-prev{background-image:url('../../../../../frontend/themes/images/partkeepr/grid/page-prev-disabled.gif') !important}.x-hmenu-sort-asc .x-menu-item-icon{background-image:url('../../../../../frontend/themes/images/partkeepr/grid/hmenu-asc.gif')}.x-hmenu-sort-desc .x-menu-item-icon{background-image:url('../../../../../frontend/themes/images/partkeepr/grid/hmenu-desc.gif')}.x-hmenu-lock .x-menu-item-icon{background-image:url('../../../../../frontend/themes/images/partkeepr/grid/hmenu-lock.gif')}.x-hmenu-unlock .x-menu-item-icon{background-image:url('../../../../../frontend/themes/images/partkeepr/grid/hmenu-unlock.gif')}.x-group-by-icon{background-image:url('../../../../../frontend/themes/images/partkeepr/grid/group-by.gif')}.x-cols-icon .x-menu-item-icon{background-image:url('../../../../../frontend/themes/images/partkeepr/grid/columns.gif')}.x-show-groups-icon{background-image:url('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/themes/images/partkeepr/grid/dd-insert-arrow-left.png');height:16px;width:16px}.x-ie6 .x-grid-drop-indicator-left{background-image:url('../../../../../frontend/themes/images/partkeepr/grid/dd-insert-arrow-right.gif')}.x-ie6 .x-grid-drop-indicator-right{background-image:url('../../../../../frontend/themes/images/partkeepr/grid/dd-insert-arrow-left.gif')}.x-grid-editor .x-form-text{padding:0 4px}.x-grid-editor .x-form-cb-wrap{padding-top:3px}.x-grid-row-editor{position:absolute !important;z-index:1;zoom:1;overflow:visible !important}.x-grid-row-editor .x-form-text{padding:0 2px}.x-grid-row-editor .x-form-cb-wrap{padding-top:0}.x-grid-row-editor .x-form-checkbox{margin-left:-4px}.x-grid-row-editor .x-form-display-field{font:normal 11px/15px tahoma,arial,verdana,sans-serif;padding-top:0;padding-left:2px}.x-grid-row-editor .x-panel-body{background-color:#e6e0e0;border-top:1px solid #aaa !important;border-bottom:1px solid #aaa !important}.x-grid-editor .x-form-cb-wrap,.x-grid-row-editor .x-form-cb-wrap{text-align:center}.x-grid-editor .x-form-trigger,.x-grid-row-editor .x-form-trigger{height:19px}.x-grid-editor .x-form-trigger-wrap .x-form-spinner-up,.x-grid-editor .x-form-trigger-wrap .x-form-spinner-down,.x-grid-row-editor .x-form-trigger-wrap .x-form-spinner-up,.x-grid-row-editor .x-form-trigger-wrap .x-form-spinner-down{background-image:url('../../../../../frontend/themes/images/partkeepr/form/spinner-small.gif');height:10px !important}.x-grid-editor .x-form-text,.x-grid-row-editor .x-form-text{font:normal 11px/15px tahoma,arial,verdana,sans-serif;height:18px}.x-border-box .x-grid-editor .x-form-trigger,.x-border-box .x-grid-row-editor .x-form-trigger{height:20px}.x-border-box .x-grid-editor .x-form-text,.x-border-box .x-grid-row-editor .x-form-text{height:20px;padding-bottom:1px}.x-ie .x-grid-editor .x-form-text{padding-left:5px}.x-ie .x-grid-row-editor .x-form-text{padding-left:3px}.x-ie8m .x-grid-editor .x-form-text,.x-ie8m .x-grid-row-editor .x-form-text{padding-top:1px}.x-strict .x-ie6 .x-grid-editor .x-form-text,.x-strict .x-ie6 .x-grid-row-editor .x-form-text,.x-strict .x-ie7 .x-grid-editor .x-form-text,.x-strict .x-ie7 .x-grid-row-editor .x-form-text{height:17px}.x-quirks .x-ie9 .x-grid-editor .x-form-text,.x-quirks .x-ie9 .x-grid-row-editor .x-form-text{line-height:17px}.x-opera .x-grid-editor .x-form-text{padding-left:5px}.x-opera .x-grid-row-editor .x-form-text{padding-left:3px}.x-grid-row-editor-buttons{background-color:#e6e0e0;position:absolute;bottom:-31px;padding:4px;height:32px}.x-strict .x-ie7m .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('../../../../../frontend/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{vertical-align:top;table-layout:fixed}.x-autocontainer-form-item,.x-anchor-form-item,.x-vbox-form-item,.x-checkboxgroup-form-item,.x-table-form-item{margin-bottom:5px}.x-form-layout-table{border-collapse:separate;border-spacing:0 2px}.x-form-item-body{position:relative}.x-form-form-item td{border-top:1px solid transparent}.x-ie6 .x-form-layout-table{border-collapse:collapse;border-spacing:0}.x-ie6 .x-form-form-item td{border-top-width:0}.x-ie6 td.x-form-item-pad{height:5px}.x-editor .x-form-item-body{padding-bottom:0}.x-form-item-label{display:block;padding:3px 0 0;font-size:12px;user-select:none;-o-user-select:none;-ms-user-select:none;-moz-user-select:-moz-none;-webkit-user-select:none;cursor:default}.x-form-item-label-top{padding:0}.x-form-item-label-right{text-align:right}.x-form-invalid-under{padding:2px 2px 2px 18px;color:#c0272b;font:normal 11px tahoma,arial,verdana,sans-serif;line-height:16px;background:no-repeat 0 2px;background-image:url('../../../../../frontend/themes/images/partkeepr/form/exclamation.gif')}.x-external-error-icon{position:absolute;right:10px;height:22px}.x-quirks .x-ie .x-external-error-icon{right:0}.x-form-invalid-icon{width:18px;background:no-repeat 2px 3px;background-image:url('../../../../../frontend/themes/images/partkeepr/form/exclamation.gif');overflow:hidden}.x-form-invalid-icon ul{display:block;width:18px}.x-form-invalid-icon ul li{display:none}.x-form-field,.x-form-display-field{margin:0 0 0 0;font:normal 12px tahoma,arial,verdana,sans-serif;color:#000}.x-form-item-hidden{margin:0}.x-form-text,textarea.x-form-field{padding:1px 3px;background:repeat-x 0 0;border:1px solid;background-color:#fff;background-image:url('../../../../../frontend/themes/images/partkeepr/form/text-bg.gif');border-color:#b5b8c8}.x-form-text{height:18px;line-height:15px;vertical-align:top;border-radius:5px}.x-ie8m .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('../../../../../frontend/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('../../../../../frontend/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-quirks .x-ie9p .x-form-text,.x-ie7m .x-form-text{margin-top:-1px;margin-bottom:-1px}.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;padding:10px;margin-bottom:10px;display:block;position:relative}.x-ie .x-fieldset{padding-top:0}.x-ie .x-fieldset .x-fieldset-body{padding-top:10px}.x-fieldset-header-checkbox{line-height:14px}.x-fieldset-header{font:11px/14px bold tahoma,arial,verdana,sans-serif;color:#4c3635;padding:0 3px 1px;overflow:hidden}.x-fieldset-header .x-fieldset-header-text{float:left;padding:1px 0}.x-fieldset-header .x-fieldset-header-text-collapsible{cursor:pointer}.x-fieldset-header .x-form-item,.x-fieldset-header .x-tool{float:left;margin:1px 0 0 0}.x-fieldset-header .x-form-cb-wrap{padding:1px 0;font-size:0;line-height:0}.x-fieldset-with-title .x-fieldset-header-checkbox,.x-fieldset-with-title .x-tool{margin-right:3px}.x-webkit .x-fieldset-header{-webkit-padding-start:3px;-webkit-padding-end:3px}.x-opera .x-fieldset-with-legend{margin-top:-1px}.x-opera.x-mac .x-fieldset-header-text{padding:2px 0 0}.x-strict .x-ie8 .x-fieldset-header{margin-bottom:-1px}.x-strict .x-ie8 .x-fieldset-header .x-tool,.x-strict .x-ie8 .x-fieldset-header .x-fieldset-header-text,.x-strict .x-ie8 .x-fieldset-header .x-fieldset-header-checkbox{position:relative;top:-1px}.x-quirks .x-ie .x-fieldset-header,.x-ie8m .x-fieldset-header{padding-left:1px;padding-right: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}.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{vertical-align:-1px;width:13px;height:13px;background:no-repeat;background-image:url('../../../../../frontend/themes/images/partkeepr/form/checkbox.png');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('../../../../../frontend/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:1px 4px 1px 4px}.x-form-invalid .x-form-checkboxgroup-body{border:1px solid #c30;background:transparent repeat-x bottom;background-image:url('../../../../../frontend/themes/images/partkeepr/grid/invalid_line.gif');padding:0 3px 0 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{vertical-align:top}.x-form-trigger{background-image:url('../../../../../frontend/themes/images/partkeepr/form/trigger.png'),-moz-linear-gradient(top, #dee3e6 0%, #fcfcfd 12%, #fff 100%);background-image:url('../../../../../frontend/themes/images/partkeepr/form/trigger.png'),-webkit-linear-gradient(top, #dee3e6 0%, #fcfcfd 12%, #fff 100%);background-image:url('../../../../../frontend/themes/images/partkeepr/form/trigger.png'),-o-linear-gradient(top, #dee3e6 0%, #fcfcfd 12%, #fff 100%);background-image:url('../../../../../frontend/themes/images/partkeepr/form/trigger.png'),-ms-linear-gradient(top, #dee3e6 0%, #fcfcfd 12%, #fff 100%);background-image:url('../../../../../frontend/themes/images/partkeepr/form/trigger.png'),linear-gradient(top, #dee3e6 0%,#fcfcfd 12%,#ffffff 100%);background-position:0 0;width:17px;height:22px;border:0;cursor:pointer;cursor:hand;overflow:hidden}.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;border-bottom-left-radius:0;-moz-border-radius-bottomright:0;-webkit-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;border-bottom-left-radius:3px;-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0}.x-form-arrow-trigger .x-form-trigger-icon{background-image:url('../../../../../frontend/themes/images/partkeepr/boundlist/trigger-arrow.png')}.x-form-date-trigger{background-image:url('../../../../../frontend/themes/images/partkeepr/form/date-trigger.png'),-moz-linear-gradient(top, #dee3e6 0%, #fcfcfd 12%, #fff 100%);background-image:url('../../../../../frontend/themes/images/partkeepr/form/date-trigger.png'),-webkit-linear-gradient(top, #dee3e6 0%, #fcfcfd 12%, #fff 100%);background-image:url('../../../../../frontend/themes/images/partkeepr/form/date-trigger.png'),-o-linear-gradient(top, #dee3e6 0%, #fcfcfd 12%, #fff 100%);background-image:url('../../../../../frontend/themes/images/partkeepr/form/date-trigger.png'),-ms-linear-gradient(top, #dee3e6 0%, #fcfcfd 12%, #fff 100%);background-image:url('../../../../../frontend/themes/images/partkeepr/form/date-trigger.png'),linear-gradient(top, #dee3e6 0%,#fcfcfd 12%,#ffffff 100%)}.x-form-trigger-wrap .x-form-spinner-up,.x-form-trigger-wrap .x-form-spinner-down{background-image:url('../../../../../frontend/themes/images/partkeepr/form/spinner.png');width:17px !important;height:11px !important;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('../../../../../frontend/themes/images/partkeepr/form/spinner-small.gif');height:11px !important}.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-item-disabled .x-trigger-noedit,.x-item-disabled .x-form-trigger{cursor:auto}.x-form-clear-trigger{background-image:url('../../../../../frontend/themes/images/partkeepr/form/clear-trigger.png'),-moz-linear-gradient(top, #dee3e6 0%, #fcfcfd 12%, #fff 100%);background-image:url('../../../../../frontend/themes/images/partkeepr/form/clear-trigger.png'),-webkit-linear-gradient(top, #dee3e6 0%, #fcfcfd 12%, #fff 100%);background-image:url('../../../../../frontend/themes/images/partkeepr/form/clear-trigger.png'),-o-linear-gradient(top, #dee3e6 0%, #fcfcfd 12%, #fff 100%);background-image:url('../../../../../frontend/themes/images/partkeepr/form/clear-trigger.png'),-ms-linear-gradient(top, #dee3e6 0%, #fcfcfd 12%, #fff 100%);background-image:url('../../../../../frontend/themes/images/partkeepr/form/clear-trigger.png'),linear-gradient(top, #dee3e6 0%,#fcfcfd 12%,#ffffff 100%)}.x-form-search-trigger{background-image:url('../../../../../frontend/themes/images/partkeepr/form/search-trigger.png'),-moz-linear-gradient(top, #dee3e6 0%, #fcfcfd 12%, #fff 100%);background-image:url('../../../../../frontend/themes/images/partkeepr/form/search-trigger.png'),-webkit-linear-gradient(top, #dee3e6 0%, #fcfcfd 12%, #fff 100%);background-image:url('../../../../../frontend/themes/images/partkeepr/form/search-trigger.png'),-o-linear-gradient(top, #dee3e6 0%, #fcfcfd 12%, #fff 100%);background-image:url('../../../../../frontend/themes/images/partkeepr/form/search-trigger.png'),-ms-linear-gradient(top, #dee3e6 0%, #fcfcfd 12%, #fff 100%);background-image:url('../../../../../frontend/themes/images/partkeepr/form/search-trigger.png'),linear-gradient(top, #dee3e6 0%,#fcfcfd 12%,#ffffff 100%)}.x-form-reload-trigger{background-image:url('../../../../../frontend/themes/images/partkeepr/form/reload-trigger.png'),-moz-linear-gradient(top, #dee3e6 0%, #fcfcfd 12%, #fff 100%);background-image:url('../../../../../frontend/themes/images/partkeepr/form/reload-trigger.png'),-webkit-linear-gradient(top, #dee3e6 0%, #fcfcfd 12%, #fff 100%);background-image:url('../../../../../frontend/themes/images/partkeepr/form/reload-trigger.png'),-o-linear-gradient(top, #dee3e6 0%, #fcfcfd 12%, #fff 100%);background-image:url('../../../../../frontend/themes/images/partkeepr/form/reload-trigger.png'),-ms-linear-gradient(top, #dee3e6 0%, #fcfcfd 12%, #fff 100%);background-image:url('../../../../../frontend/themes/images/partkeepr/form/reload-trigger.png'),linear-gradient(top, #dee3e6 0%,#fcfcfd 12%,#ffffff 100%)}.x-quirks .prefixie6 .x-form-trigger-input-cell{height:22px}.x-quirks .prefixie6 .x-field-default-toolbar .x-form-trigger-input-cell{height:22px}.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 no-repeat;background-image:url('../../../../../frontend/themes/images/partkeepr/editor/tb-sprite.gif')}.x-html-editor-tb .x-edit-bold,.x-menu-item img.x-edit-bold{background-position:0 0;background-image:url('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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-horizontal{padding:3px 5px 4px}.x-panel-header-vertical{padding:5px 4px}.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}.x-vertical .x-panel-header-icon,.x-vertical .x-window-header-icon{margin:0 0 4px}.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-text-container{overflow:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis}.x-panel-header-text{user-select:none;-o-user-select:none;-ms-user-select:none;-moz-user-select:-moz-none;-webkit-user-select:none;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{padding-left:1px}.x-opera .x-panel-header-vertical .x-surface,.x-strict .x-ie9 .x-panel-header-vertical .x-surface{padding-left:2px}.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;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:linear-gradient(top, #535353,#363636);-webkit-box-shadow:#eae8e8 0 1px 0px 0 inset;-moz-box-shadow:#eae8e8 0 1px 0px 0 inset;box-shadow:#eae8e8 0 1px 0px 0 inset}.x-nlg .x-panel-header-default-top{background-image:url('../../../../../frontend/themes/images/partkeepr/panel-header/panel-header-default-top-bg.gif')}.x-nlg .x-panel-header-default-bottom{background-image:url('../../../../../frontend/themes/images/partkeepr/panel-header/panel-header-default-bottom-bg.gif')}.x-nlg .x-panel-header-default-left{background-image:url('../../../../../frontend/themes/images/partkeepr/panel-header/panel-header-default-left-bg.gif')}.x-nlg .x-panel-header-default-right{background-image:url('../../../../../frontend/themes/images/partkeepr/panel-header/panel-header-default-right-bg.gif')}.x-nlg .x-panel-header-default-right{background-position:top right}.x-nlg .x-panel-header-default-bottom{background-position:bottom left}.x-panel-header-text-default{color:#eee;font-size:11px;font-weight:bold;font-family:tahoma,arial,verdana,sans-serif;line-height:17px}.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:linear-gradient(right, #535353,#363636)}.x-panel-collapsed .x-panel-header-default-top{-moz-border-radius-bottomleft:null;-webkit-border-bottom-left-radius:null;border-bottom-left-radius:null;-moz-border-radius-bottomright:null;-webkit-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;border-top-left-radius:null;-moz-border-radius-bottomleft:null;-webkit-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;border-top-left-radius:null;-moz-border-radius-topright:null;-webkit-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;border-top-right-radius:null;-moz-border-radius-bottomright:null;-webkit-border-bottom-right-radius:null;border-bottom-right-radius:null}.x-panel-header-default-top{-webkit-box-shadow:#eae8e8 0 1px 0px 0 inset;-moz-box-shadow:#eae8e8 0 1px 0px 0 inset;box-shadow:#eae8e8 0 1px 0px 0 inset}.x-panel-header-default-right{-webkit-box-shadow:#eae8e8 -1px 0 0px 0 inset;-moz-box-shadow:#eae8e8 -1px 0 0px 0 inset;box-shadow:#eae8e8 -1px 0 0px 0 inset}.x-panel-header-default-bottom{-webkit-box-shadow:#eae8e8 0 -1px 0px 0 inset;-moz-box-shadow:#eae8e8 0 -1px 0px 0 inset;box-shadow:#eae8e8 0 -1px 0px 0 inset}.x-panel-header-default-left{-webkit-box-shadow:#eae8e8 1px 0 0px 0 inset;-moz-box-shadow:#eae8e8 1px 0 0px 0 inset;box-shadow:#eae8e8 1px 0 0px 0 inset}.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;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:linear-gradient(top, #535353,#363636);-webkit-box-shadow:#eae8e8 0 1px 0px 0 inset;-moz-box-shadow:#eae8e8 0 1px 0px 0 inset;box-shadow:#eae8e8 0 1px 0px 0 inset}.x-nlg .x-panel-header-default-framed-top{background-image:url('../../../../../frontend/themes/images/partkeepr/panel-header/panel-header-default-framed-top-bg.gif')}.x-nlg .x-panel-header-default-framed-bottom{background-image:url('../../../../../frontend/themes/images/partkeepr/panel-header/panel-header-default-framed-bottom-bg.gif')}.x-nlg .x-panel-header-default-framed-left{background-image:url('../../../../../frontend/themes/images/partkeepr/panel-header/panel-header-default-framed-left-bg.gif')}.x-nlg .x-panel-header-default-framed-right{background-image:url('../../../../../frontend/themes/images/partkeepr/panel-header/panel-header-default-framed-right-bg.gif')}.x-nlg .x-panel-header-default-framed-right{background-position:top right}.x-nlg .x-panel-header-default-framed-bottom{background-position:bottom left}.x-nbr .x-panel-header-default-framed{background-image:none}.x-strict .x-ie9 .x-panel-header-default-framed-top,.x-nlg.x-opera .x-panel-header-default-framed-top,.x-nlg.x-safari .x-panel-header-default-framed-top{background-image:url('../../../../../frontend/themes/images/partkeepr/panel-header/panel-header-default-top-bg.gif')}.x-strict .x-ie9 .x-panel-header-default-framed-bottom,.x-nlg.x-opera .x-panel-header-default-framed-bottom,.x-nlg.x-safari .x-panel-header-default-framed-bottom{background-image:url('../../../../../frontend/themes/images/partkeepr/panel-header/panel-header-default-bottom-bg.gif')}.x-strict .x-ie9 .x-panel-header-default-framed-left,.x-nlg.x-opera .x-panel-header-default-framed-left,.x-nlg.x-safari .x-panel-header-default-framed-left{background-image:url('../../../../../frontend/themes/images/partkeepr/panel-header/panel-header-default-left-bg.gif')}.x-strict .x-ie9 .x-panel-header-default-framed-right,.x-nlg.x-opera .x-panel-header-default-framed-right,.x-nlg.x-safari .x-panel-header-default-framed-right{background-image:url('../../../../../frontend/themes/images/partkeepr/panel-header/panel-header-default-right-bg.gif')}.x-panel-header-text-default-framed{color:#eee;font-size:11px;font-weight:bold;font-family:tahoma,arial,verdana,sans-serif;line-height:17px}.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:linear-gradient(right, #535353,#363636)}.x-panel-default-framed{-webkit-border-radius:4px;-moz-border-radius:4px;-ms-border-radius:4px;-o-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;-webkit-border-radius:0px;-moz-border-radius:0px;-ms-border-radius:0px;-o-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('../../../../../frontend/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('../../../../../frontend/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:1px 1px 1px 1px}.x-strict .x-ie7 .x-panel-default-framed-tl,.x-strict .x-ie7 .x-panel-default-framed-bl{position:relative;right:0}.x-panel-header-default-framed-top{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;padding:3px 5px 4px 5px;border-width:1px 1px 0 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:linear-gradient(top, #535353,#363636)}.x-nlg .x-panel-header-default-framed-top-mc{background-image:url('../../../../../frontend/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;-webkit-border-radius:0px;-moz-border-radius:0px;-ms-border-radius:0px;-o-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('../../../../../frontend/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('../../../../../frontend/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 2px 4px 2px}.x-strict .x-ie7 .x-panel-header-default-framed-top-tl,.x-strict .x-ie7 .x-panel-header-default-framed-top-bl{position:relative;right:0}.x-panel-header-default-framed-right{-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;padding:5px 4px 5px 4px;border-width:1px 1px 1px 0;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:linear-gradient(right, #535353,#363636)}.x-nlg .x-panel-header-default-framed-right-mc{background-image:url('../../../../../frontend/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;-webkit-border-radius:0px;-moz-border-radius:0px;-ms-border-radius:0px;-o-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('../../../../../frontend/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('../../../../../frontend/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:2px 1px 2px 4px}.x-strict .x-ie7 .x-panel-header-default-framed-right-tl,.x-strict .x-ie7 .x-panel-header-default-framed-right-bl{position:relative;right:0}.x-panel-header-default-framed-bottom{-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;padding:3px 5px 4px 5px;border-width:0 1px 1px 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:linear-gradient(top, #535353,#363636)}.x-nlg .x-panel-header-default-framed-bottom-mc{background-image:url('../../../../../frontend/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;-webkit-border-radius:0px;-moz-border-radius:0px;-ms-border-radius:0px;-o-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('../../../../../frontend/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('../../../../../frontend/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:3px 2px 1px 2px}.x-strict .x-ie7 .x-panel-header-default-framed-bottom-tl,.x-strict .x-ie7 .x-panel-header-default-framed-bottom-bl{position:relative;right:0}.x-panel-header-default-framed-left{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;padding:5px 4px 5px 4px;border-width:1px 0 1px 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:linear-gradient(right, #535353,#363636)}.x-nlg .x-panel-header-default-framed-left-mc{background-image:url('../../../../../frontend/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;-webkit-border-radius:0px;-moz-border-radius:0px;-ms-border-radius:0px;-o-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('../../../../../frontend/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('../../../../../frontend/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:2px 4px 2px 1px}.x-strict .x-ie7 .x-panel-header-default-framed-left-tl,.x-strict .x-ie7 .x-panel-header-default-framed-left-bl{position:relative;right:0}.x-panel-header-default-framed-top{-webkit-box-shadow:#eae8e8 0 1px 0px 0 inset,#eae8e8 -1px 0 0px 0 inset,#eae8e8 1px 0 0px 0 inset;-moz-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{-webkit-box-shadow:#eae8e8 0 1px 0px 0 inset,#eae8e8 0 -1px 0px 0 inset,#eae8e8 -1px 0 0px 0 inset;-moz-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{-webkit-box-shadow:#eae8e8 0 -1px 0px 0 inset,#eae8e8 -1px 0 0px 0 inset,#eae8e8 1px 0 0px 0 inset;-moz-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-left{-webkit-box-shadow:#eae8e8 0 1px 0px 0 inset,#eae8e8 0 -1px 0px 0 inset,#eae8e8 1px 0 0px 0 inset;-moz-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 .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{-webkit-border-radius:4px;-moz-border-radius:4px;-ms-border-radius:4px;-o-border-radius:4px;border-radius:4px}.x-panel-header-default-framed-collapsed-top{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;padding:3px 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:linear-gradient(top, #535353,#363636)}.x-nlg .x-panel-header-default-framed-collapsed-top-mc{background-image:url('../../../../../frontend/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;-webkit-border-radius:0px;-moz-border-radius:0px;-ms-border-radius:0px;-o-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('../../../../../frontend/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('../../../../../frontend/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 2px 1px 2px}.x-strict .x-ie7 .x-panel-header-default-framed-collapsed-top-tl,.x-strict .x-ie7 .x-panel-header-default-framed-collapsed-top-bl{position:relative;right:0}.x-panel-header-default-framed-collapsed-right{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;padding:5px 4px 5px 4px;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:linear-gradient(right, #535353,#363636)}.x-nlg .x-panel-header-default-framed-collapsed-right-mc{background-image:url('../../../../../frontend/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;-webkit-border-radius:0px;-moz-border-radius:0px;-ms-border-radius:0px;-o-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('../../../../../frontend/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('../../../../../frontend/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:2px 1px 2px 1px}.x-strict .x-ie7 .x-panel-header-default-framed-collapsed-right-tl,.x-strict .x-ie7 .x-panel-header-default-framed-collapsed-right-bl{position:relative;right:0}.x-panel-header-default-framed-collapsed-bottom{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;padding:3px 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:linear-gradient(top, #535353,#363636)}.x-nlg .x-panel-header-default-framed-collapsed-bottom-mc{background-image:url('../../../../../frontend/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;-webkit-border-radius:0px;-moz-border-radius:0px;-ms-border-radius:0px;-o-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('../../../../../frontend/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('../../../../../frontend/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 2px 1px 2px}.x-strict .x-ie7 .x-panel-header-default-framed-collapsed-bottom-tl,.x-strict .x-ie7 .x-panel-header-default-framed-collapsed-bottom-bl{position:relative;right:0}.x-panel-header-default-framed-collapsed-left{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;padding:5px 4px 5px 4px;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:linear-gradient(right, #535353,#363636)}.x-nlg .x-panel-header-default-framed-collapsed-left-mc{background-image:url('../../../../../frontend/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;-webkit-border-radius:0px;-moz-border-radius:0px;-ms-border-radius:0px;-o-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('../../../../../frontend/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('../../../../../frontend/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:2px 1px 2px 1px}.x-strict .x-ie7 .x-panel-header-default-framed-collapsed-left-tl,.x-strict .x-ie7 .x-panel-header-default-framed-collapsed-left-bl{position:relative;right:0}.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{-webkit-border-radius:3px;-moz-border-radius:3px;-ms-border-radius:3px;-o-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:linear-gradient(top, #ededed,#c7c7c7)}.x-nlg .x-tip-mc{background-image:url('../../../../../frontend/themes/images/partkeepr/tip/tip-bg.gif');background-color:#c7c7c7}.x-nbr .x-tip{padding:0 !important;border-width:0 !important;-webkit-border-radius:0px;-moz-border-radius:0px;-ms-border-radius:0px;-o-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('../../../../../frontend/themes/images/partkeepr/tip/tip-corners.gif')}.x-nbr .x-tip-ml,.x-nbr .x-tip-mr{zoom:1;background-image:url('../../../../../frontend/themes/images/partkeepr/tip/tip-sides.gif');background-position:0 0}.x-nbr .x-tip-mc{padding:0px 0px 0px 0px}.x-strict .x-ie7 .x-tip-tl,.x-strict .x-ie7 .x-tip-bl{position:relative;right:0}.x-tip-header-text{user-select:none;-o-user-select:none;-ms-user-select:none;-moz-user-select:-moz-none;-webkit-user-select:none;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;-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;-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;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('../../../../../frontend/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{-webkit-border-radius:5px;-moz-border-radius:5px;-ms-border-radius:5px;-o-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:linear-gradient(top, #ededed,#c7c7c7)}.x-nlg .x-form-invalid-tip-default-mc{background-image:url('../../../../../frontend/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;-webkit-border-radius:0px;-moz-border-radius:0px;-ms-border-radius:0px;-o-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('../../../../../frontend/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('../../../../../frontend/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:0px 0px 0px 0px}.x-strict .x-ie7 .x-form-invalid-tip-default-tl,.x-strict .x-ie7 .x-form-invalid-tip-default-bl{position:relative;right: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;user-select:none;-o-user-select:none;-ms-user-select:none;-moz-user-select:-moz-none;-webkit-user-select:none;cursor:default;display:block;overflow:hidden}.x-slider-horz{padding-left:7px;background:transparent no-repeat 0 -24px;width:100%}.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;margin-left:-7px;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;margin-bottom:-7px;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('../../../../../frontend/themes/images/partkeepr/slider/slider-bg.png')}.x-slider-horz .x-slider-thumb{background-image:url('../../../../../frontend/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('../../../../../frontend/themes/images/partkeepr/slider/slider-v-bg.png')}.x-slider-vert .x-slider-thumb{background-image:url('../../../../../frontend/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('../../../../../frontend/themes/images/partkeepr/slider/slider-bg.gif')}.x-ie6 .x-slider-horz .x-slider-thumb{background-image:url('../../../../../frontend/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('../../../../../frontend/themes/images/partkeepr/slider/slider-v-bg.gif')}.x-ie6 .x-slider-vert .x-slider-thumb{background-image:url('../../../../../frontend/themes/images/partkeepr/slider/slider-v-thumb.gif')}.x-progress{position:relative;border-width:1px;border-style:solid;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;overflow:hidden;height:20px}.x-progress-bar{height:18px;overflow:hidden;position:absolute;width:0;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-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-ie7m .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: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:repeat-x;background-image:url('../../../../../frontend/themes/images/partkeepr/progress/progress-default-bg.gif')}.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;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 #ff797b;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 #ff797b;border-bottom:1px solid #fff}.x-toolbar-scroller{padding-left:0}.x-toolbar-spacer{width:2px}.x-toolbar-more-icon{background-image:url('../../../../../frontend/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:linear-gradient(top, #eaeaea,#dddddd)}.x-nlg .x-toolbar-default{background-image:url('../../../../../frontend/themes/images/partkeepr/toolbar/toolbar-default-bg.gif') !important;background-repeat:repeat-x}.x-toolbar-plain{border:0}.x-window{outline:none;overflow:hidden}.x-window .x-window-wrap{position:relative}.x-window-body{position:relative;border-style:solid;overflow:hidden}.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-header-top{margin-bottom:-2px}.x-window-header-body-horizontal{margin-top:-1px}.x-window-header-bottom{margin-top:-1px;margin-bottom:-1px}.x-window-header-left{margin-right:-1px}.x-window-header-right{margin-left:-1px}.x-window-header-vertical .x-surface{padding-left:1px}.x-window-collapsed .x-window-header-vertical{-webkit-border-radius:5px;-moz-border-radius:5px;-ms-border-radius:5px;-o-border-radius:5px;border-radius:5px}.x-window-collapsed .x-window-header-horizontal{-webkit-border-radius:5px;-moz-border-radius:5px;-ms-border-radius:5px;-o-border-radius:5px;border-radius:5px}.x-window-collapsed .x-window-header-left{padding-right:5px !important;margin-right:0}.x-window-collapsed .x-window-header-right{padding-left:5px !important;margin-left:0}.x-window-collapsed .x-window-header-top{padding-bottom:5px !important;margin-bottom:-1px}.x-window-collapsed .x-window-header-bottom{padding-top:5px !important;margin-top:0}.x-window-header-left .x-vml-base,.x-window-header-right .x-vml-base{left:-3px !important}.x-opera .x-window-header-vertical .x-surface,.x-strict .x-ie9 .x-window-header-vertical .x-surface{padding-left:2px}.x-window-header-text-container{overflow:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis}.x-window-header-text{user-select:none;-o-user-select:none;-ms-user-select:none;-moz-user-select:-moz-none;-webkit-user-select:none;cursor:default;white-space:nowrap}.x-window-default{border-color:#a4a4a4;-webkit-border-radius:5px 5px;-moz-border-radius:5px 5px;-ms-border-radius:5px 5px;-o-border-radius:5px 5px;border-radius:5px 5px;-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;-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;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;border-top-left-radius:5px;-moz-border-radius-topright:5px;-webkit-border-top-right-radius:5px;border-top-right-radius:5px;-moz-border-radius-bottomright:5px;-webkit-border-bottom-right-radius:5px;border-bottom-right-radius:5px;-moz-border-radius-bottomleft:5px;-webkit-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;-webkit-border-radius:0px;-moz-border-radius:0px;-ms-border-radius:0px;-o-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('../../../../../frontend/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('../../../../../frontend/themes/images/partkeepr/window/window-default-sides.gif');background-position:0 0;background-repeat:repeat-y}.x-nbr .x-window-default-mc{padding:0px 0px 0px 0px}.x-strict .x-ie7 .x-window-default-tl,.x-strict .x-ie7 .x-window-default-bl{position:relative;right:0}.x-window-body-default{border-color:#b7abab;border-width:1px;background:#dbdbdb;color:#000}.x-window-header-default{font-size:11px;border-color:#a4a4a4;zoom:1}.x-window-header-text-default{color:#4e2324;font-weight:bold;line-height:17px;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;border-top-left-radius:5px;-moz-border-radius-topright:5px;-webkit-border-top-right-radius:5px;border-top-right-radius:5px;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;padding:4px 5px 0 5px;border-width:1px 1px 0 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;-webkit-border-radius:0px;-moz-border-radius:0px;-ms-border-radius:0px;-o-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('../../../../../frontend/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('../../../../../frontend/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 1px 0 1px}.x-strict .x-ie7 .x-window-header-default-top-tl,.x-strict .x-ie7 .x-window-header-default-top-bl{position:relative;right:0}.x-window-header-default-right{-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:5px;-webkit-border-top-right-radius:5px;border-top-right-radius:5px;-moz-border-radius-bottomright:5px;-webkit-border-bottom-right-radius:5px;border-bottom-right-radius:5px;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;padding:5px 4px 5px 0;border-width:1px 1px 1px 0;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;-webkit-border-radius:0px;-moz-border-radius:0px;-ms-border-radius:0px;-o-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('../../../../../frontend/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('../../../../../frontend/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:1px 0px 1px 0}.x-strict .x-ie7 .x-window-header-default-right-tl,.x-strict .x-ie7 .x-window-header-default-right-bl{position:relative;right:0}.x-window-header-default-bottom{-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomright:5px;-webkit-border-bottom-right-radius:5px;border-bottom-right-radius:5px;-moz-border-radius-bottomleft:5px;-webkit-border-bottom-left-radius:5px;border-bottom-left-radius:5px;padding:0 5px 4px 5px;border-width:0 1px 1px 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;-webkit-border-radius:0px;-moz-border-radius:0px;-ms-border-radius:0px;-o-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('../../../../../frontend/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('../../../../../frontend/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 1px 0px 1px}.x-strict .x-ie7 .x-window-header-default-bottom-tl,.x-strict .x-ie7 .x-window-header-default-bottom-bl{position:relative;right:0}.x-window-header-default-left{-moz-border-radius-topleft:5px;-webkit-border-top-left-radius:5px;border-top-left-radius:5px;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomleft:5px;-webkit-border-bottom-left-radius:5px;border-bottom-left-radius:5px;padding:5px 0px 5px 4px;border-width:1px 0 1px 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;-webkit-border-radius:0px;-moz-border-radius:0px;-ms-border-radius:0px;-o-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('../../../../../frontend/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('../../../../../frontend/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:1px 0px 1px 0px}.x-strict .x-ie7 .x-window-header-default-left-tl,.x-strict .x-ie7 .x-window-header-default-left-bl{position:relative;right:0}.x-window-header-default-collapsed-top{-moz-border-radius-topleft:5px;-webkit-border-top-left-radius:5px;border-top-left-radius:5px;-moz-border-radius-topright:5px;-webkit-border-top-right-radius:5px;border-top-right-radius:5px;-moz-border-radius-bottomright:5px;-webkit-border-bottom-right-radius:5px;border-bottom-right-radius:5px;-moz-border-radius-bottomleft:5px;-webkit-border-bottom-left-radius:5px;border-bottom-left-radius:5px;padding:4px 5px 4px 5px;border-width:1px;border-style:solid;background-color:#cbcbcb}.x-nlg .x-window-header-default-collapsed-top-mc{background-color:#cbcbcb}.x-nbr .x-window-header-default-collapsed-top{padding:0 !important;border-width:0 !important;-webkit-border-radius:0px;-moz-border-radius:0px;-ms-border-radius:0px;-o-border-radius:0px;border-radius:0px;background-color:transparent;background-position:1000505px 1000505px}.x-nbr .x-window-header-default-collapsed-top-tl,.x-nbr .x-window-header-default-collapsed-top-bl,.x-nbr .x-window-header-default-collapsed-top-tr,.x-nbr .x-window-header-default-collapsed-top-br,.x-nbr .x-window-header-default-collapsed-top-tc,.x-nbr .x-window-header-default-collapsed-top-bc,.x-nbr .x-window-header-default-collapsed-top-ml,.x-nbr .x-window-header-default-collapsed-top-mr{zoom:1;background-image:url('../../../../../frontend/themes/images/partkeepr/window-header/window-header-default-collapsed-top-corners.gif')}.x-nbr .x-window-header-default-collapsed-top-ml,.x-nbr .x-window-header-default-collapsed-top-mr{zoom:1;background-image:url('../../../../../frontend/themes/images/partkeepr/window-header/window-header-default-collapsed-top-sides.gif');background-position:0 0;background-repeat:repeat-y}.x-nbr .x-window-header-default-collapsed-top-mc{padding:0px 1px 0px 1px}.x-strict .x-ie7 .x-window-header-default-collapsed-top-tl,.x-strict .x-ie7 .x-window-header-default-collapsed-top-bl{position:relative;right:0}.x-window-header-default-collapsed-right{-moz-border-radius-topleft:5px;-webkit-border-top-left-radius:5px;border-top-left-radius:5px;-moz-border-radius-topright:5px;-webkit-border-top-right-radius:5px;border-top-right-radius:5px;-moz-border-radius-bottomright:5px;-webkit-border-bottom-right-radius:5px;border-bottom-right-radius:5px;-moz-border-radius-bottomleft:5px;-webkit-border-bottom-left-radius:5px;border-bottom-left-radius:5px;padding:5px 4px 5px 4px;border-width:1px;border-style:solid;background-color:#cbcbcb}.x-nlg .x-window-header-default-collapsed-right-mc{background-color:#cbcbcb}.x-nbr .x-window-header-default-collapsed-right{padding:0 !important;border-width:0 !important;-webkit-border-radius:0px;-moz-border-radius:0px;-ms-border-radius:0px;-o-border-radius:0px;border-radius:0px;background-color:transparent;background-position:1000505px 1000505px}.x-nbr .x-window-header-default-collapsed-right-tl,.x-nbr .x-window-header-default-collapsed-right-bl,.x-nbr .x-window-header-default-collapsed-right-tr,.x-nbr .x-window-header-default-collapsed-right-br,.x-nbr .x-window-header-default-collapsed-right-tc,.x-nbr .x-window-header-default-collapsed-right-bc,.x-nbr .x-window-header-default-collapsed-right-ml,.x-nbr .x-window-header-default-collapsed-right-mr{zoom:1;background-image:url('../../../../../frontend/themes/images/partkeepr/window-header/window-header-default-collapsed-right-corners.gif')}.x-nbr .x-window-header-default-collapsed-right-ml,.x-nbr .x-window-header-default-collapsed-right-mr{zoom:1;background-image:url('../../../../../frontend/themes/images/partkeepr/window-header/window-header-default-collapsed-right-sides.gif');background-position:0 0;background-repeat:repeat-y}.x-nbr .x-window-header-default-collapsed-right-mc{padding:1px 0px 1px 0px}.x-strict .x-ie7 .x-window-header-default-collapsed-right-tl,.x-strict .x-ie7 .x-window-header-default-collapsed-right-bl{position:relative;right:0}.x-window-header-default-collapsed-bottom{-moz-border-radius-topleft:5px;-webkit-border-top-left-radius:5px;border-top-left-radius:5px;-moz-border-radius-topright:5px;-webkit-border-top-right-radius:5px;border-top-right-radius:5px;-moz-border-radius-bottomright:5px;-webkit-border-bottom-right-radius:5px;border-bottom-right-radius:5px;-moz-border-radius-bottomleft:5px;-webkit-border-bottom-left-radius:5px;border-bottom-left-radius:5px;padding:4px 5px 4px 5px;border-width:1px;border-style:solid;background-color:#cbcbcb}.x-nlg .x-window-header-default-collapsed-bottom-mc{background-color:#cbcbcb}.x-nbr .x-window-header-default-collapsed-bottom{padding:0 !important;border-width:0 !important;-webkit-border-radius:0px;-moz-border-radius:0px;-ms-border-radius:0px;-o-border-radius:0px;border-radius:0px;background-color:transparent;background-position:1000505px 1000505px}.x-nbr .x-window-header-default-collapsed-bottom-tl,.x-nbr .x-window-header-default-collapsed-bottom-bl,.x-nbr .x-window-header-default-collapsed-bottom-tr,.x-nbr .x-window-header-default-collapsed-bottom-br,.x-nbr .x-window-header-default-collapsed-bottom-tc,.x-nbr .x-window-header-default-collapsed-bottom-bc,.x-nbr .x-window-header-default-collapsed-bottom-ml,.x-nbr .x-window-header-default-collapsed-bottom-mr{zoom:1;background-image:url('../../../../../frontend/themes/images/partkeepr/window-header/window-header-default-collapsed-bottom-corners.gif')}.x-nbr .x-window-header-default-collapsed-bottom-ml,.x-nbr .x-window-header-default-collapsed-bottom-mr{zoom:1;background-image:url('../../../../../frontend/themes/images/partkeepr/window-header/window-header-default-collapsed-bottom-sides.gif');background-position:0 0;background-repeat:repeat-y}.x-nbr .x-window-header-default-collapsed-bottom-mc{padding:0px 1px 0px 1px}.x-strict .x-ie7 .x-window-header-default-collapsed-bottom-tl,.x-strict .x-ie7 .x-window-header-default-collapsed-bottom-bl{position:relative;right:0}.x-window-header-default-collapsed-left{-moz-border-radius-topleft:5px;-webkit-border-top-left-radius:5px;border-top-left-radius:5px;-moz-border-radius-topright:5px;-webkit-border-top-right-radius:5px;border-top-right-radius:5px;-moz-border-radius-bottomright:5px;-webkit-border-bottom-right-radius:5px;border-bottom-right-radius:5px;-moz-border-radius-bottomleft:5px;-webkit-border-bottom-left-radius:5px;border-bottom-left-radius:5px;padding:5px 4px 5px 4px;border-width:1px;border-style:solid;background-color:#cbcbcb}.x-nlg .x-window-header-default-collapsed-left-mc{background-color:#cbcbcb}.x-nbr .x-window-header-default-collapsed-left{padding:0 !important;border-width:0 !important;-webkit-border-radius:0px;-moz-border-radius:0px;-ms-border-radius:0px;-o-border-radius:0px;border-radius:0px;background-color:transparent;background-position:1000505px 1000505px}.x-nbr .x-window-header-default-collapsed-left-tl,.x-nbr .x-window-header-default-collapsed-left-bl,.x-nbr .x-window-header-default-collapsed-left-tr,.x-nbr .x-window-header-default-collapsed-left-br,.x-nbr .x-window-header-default-collapsed-left-tc,.x-nbr .x-window-header-default-collapsed-left-bc,.x-nbr .x-window-header-default-collapsed-left-ml,.x-nbr .x-window-header-default-collapsed-left-mr{zoom:1;background-image:url('../../../../../frontend/themes/images/partkeepr/window-header/window-header-default-collapsed-left-corners.gif')}.x-nbr .x-window-header-default-collapsed-left-ml,.x-nbr .x-window-header-default-collapsed-left-mr{zoom:1;background-image:url('../../../../../frontend/themes/images/partkeepr/window-header/window-header-default-collapsed-left-sides.gif');background-position:0 0;background-repeat:repeat-y}.x-nbr .x-window-header-default-collapsed-left-mc{padding:1px 0px 1px 0px}.x-strict .x-ie7 .x-window-header-default-collapsed-left-tl,.x-strict .x-ie7 .x-window-header-default-collapsed-left-bl{position:relative;right:0}.x-window-header-default-top{-webkit-box-shadow:#e7e2e1 0 1px 0px 0 inset,#e7e2e1 -1px 0 0px 0 inset,#e7e2e1 1px 0 0px 0 inset;-moz-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{-webkit-box-shadow:#e7e2e1 0 1px 0px 0 inset,#e7e2e1 0 -1px 0px 0 inset,#e7e2e1 -1px 0 0px 0 inset;-moz-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{-webkit-box-shadow:#e7e2e1 0 -1px 0px 0 inset,#e7e2e1 -1px 0 0px 0 inset,#e7e2e1 1px 0 0px 0 inset;-moz-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-left{-webkit-box-shadow:#e7e2e1 0 1px 0px 0 inset,#e7e2e1 0 -1px 0px 0 inset,#e7e2e1 1px 0 0px 0 inset;-moz-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 .x-progress-wrap{margin-top:4px}.x-message-box-icon{width:47px;height:32px}.x-message-box-info,.x-message-box-warning,.x-message-box-question,.x-message-box-error{background:transparent no-repeat top left}.x-message-box .x-msg-box-wait{background-image:url('../../../../../frontend/themes/images/partkeepr/shared/blue-loading.gif')}.x-message-box-info{background-image:url('../../../../../frontend/themes/images/partkeepr/shared/icon-info.gif')}.x-message-box-warning{background-image:url('../../../../../frontend/themes/images/partkeepr/shared/icon-warning.gif')}.x-message-box-question{background-image:url('../../../../../frontend/themes/images/partkeepr/shared/icon-question.gif')}.x-message-box-error{background-image:url('../../../../../frontend/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:linear-gradient(top, #dad9d9,#cecece);font-size:11px}.x-nlg .x-tab-bar{background-image:url('../../../../../frontend/themes/images/partkeepr/tab-bar/tab-bar-default-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 2px}.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:25px}.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;border-top-left-radius:4px;-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomleft:0;-webkit-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:linear-gradient(top, #dddddd,#e4e4e4 25%,#eaeaea 45%)}.x-nlg .x-tab-default-top-mc{background-image:url('../../../../../frontend/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;-webkit-border-radius:0px;-moz-border-radius:0px;-ms-border-radius:0px;-o-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('../../../../../frontend/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('../../../../../frontend/themes/images/partkeepr/tab/tab-default-top-sides.gif');background-position:0 0}.x-nbr .x-tab-default-top-mc{padding:0px 0px 0 0px}.x-strict .x-ie7 .x-tab-default-top-tl,.x-strict .x-ie7 .x-tab-default-top-bl{position:relative;right:0}.x-tab-default-bottom{-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomleft:4px;-webkit-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:linear-gradient(bottom, #dddddd,#e4e4e4 25%,#eaeaea 45%)}.x-nlg .x-tab-default-bottom-mc{background-image:url('../../../../../frontend/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;-webkit-border-radius:0px;-moz-border-radius:0px;-ms-border-radius:0px;-o-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('../../../../../frontend/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('../../../../../frontend/themes/images/partkeepr/tab/tab-default-bottom-sides.gif');background-position:0 0}.x-nbr .x-tab-default-bottom-mc{padding:0 0px 0px 0px}.x-strict .x-ie7 .x-tab-default-bottom-tl,.x-strict .x-ie7 .x-tab-default-bottom-bl{position:relative;right: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 button{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;font-family:tahoma,arial,verdana,sans-serif;color:#6f6f6f;outline:0 none;overflow-x:visible}.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;text-overflow:ellipsis;-o-text-overflow:ellipsis;overflow:hidden}.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{-webkit-box-shadow:#fff 0 1px 0px 0 inset,#fff -1px 0 0px 0 inset,#fff 1px 0 0px 0 inset;-moz-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-safari4 .x-tab-default-top .x-tab-inner,.x-safari5_0 .x-tab-default-top .x-tab-inner{line-height:14px}.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{-webkit-box-shadow:#fff 0 -1px 0px 0 inset,#fff -1px 0 0px 0 inset,#fff 1px 0 0px 0 inset;-moz-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-top:1px solid #aaa !important;-webkit-box-shadow:#fff 0 -1px 0px 0 inset,#fff -1px 0 0px 0 inset,#fff 1px 0 0px 0 inset;-moz-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}.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:linear-gradient(top, #e3d9d9,#eedddd)}.x-tab-default-disabled button{color:#c3b3b3 !important}.x-tab-icon-text-left .x-tab-inner{padding-left:20px}.x-tab button{position:relative}.x-tab-icon{position:absolute;background-repeat:no-repeat;background-position:0 -1px;top:0;left:0;right:auto;bottom:0;width:18px;height:18px}.x-strict .x-ie8 .x-tab button,.x-strict .x-ie9 .x-tab button{overflow-y:visible}.x-tab-default-disabled .x-tab-icon{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=50);opacity:0.5}.x-tab-noicon .x-tab-icon{display:none}.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:linear-gradient(top, #e7e6e6,#eeeaea 25%,#f2eeee 45%)}.x-tab-bottom-over{background-image:none;background-color:#f2eeee;background-image:-webkit-gradient(linear, 50% 100%, 50% 0%, color-stop(0%, #e7e6e6), color-stop(25%, #eeeaea), color-stop(45%, #f2eeee));background-image:-webkit-linear-gradient(bottom, #e7e6e6,#eeeaea 25%,#f2eeee 45%);background-image:-moz-linear-gradient(bottom, #e7e6e6,#eeeaea 25%,#f2eeee 45%);background-image:-o-linear-gradient(bottom, #e7e6e6,#eeeaea 25%,#f2eeee 45%);background-image:linear-gradient(bottom, #e7e6e6,#eeeaea 25%,#f2eeee 45%)}.x-tab-active{z-index:3}.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:linear-gradient(top, #2aaad3,#2067a3)}.x-tab-bottom-active{background-image:none;background-color:#eaeaea;background-image:-webkit-gradient(linear, 50% 100%, 50% 0%, color-stop(0%, #2aaad3), color-stop(100%, #2067a3));background-image:-webkit-linear-gradient(bottom, #2aaad3,#2067a3);background-image:-moz-linear-gradient(bottom, #2aaad3,#2067a3);background-image:-o-linear-gradient(bottom, #2aaad3,#2067a3);background-image:linear-gradient(bottom, #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: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:linear-gradient(bottom, #e3d9d9,#eedddd)}.x-nlg .x-tab-top{background-image:url('../../../../../frontend/themes/images/partkeepr/tab/tab-default-top-bg.gif')}.x-nlg .x-tab-bottom{background-image:url('../../../../../frontend/themes/images/partkeepr/tab/tab-default-bottom-bg.gif')}.x-nlg .x-tab-top-over{background-image:url('../../../../../frontend/themes/images/partkeepr/tab/tab-default-top-over-bg.gif')}.x-nlg .x-tab-bottom-over{background-image:url('../../../../../frontend/themes/images/partkeepr/tab/tab-default-bottom-over-bg.gif')}.x-nlg .x-tab-top-active{background-image:url('../../../../../frontend/themes/images/partkeepr/tab/tab-default-top-active-bg.gif')}.x-nlg .x-tab-bottom-active{background-image:url('../../../../../frontend/themes/images/partkeepr/tab/tab-default-bottom-active-bg.gif')}.x-nlg .x-tab-top-disabled{background-image:url('../../../../../frontend/themes/images/partkeepr/tab/tab-default-top-disabled-bg.gif') !important}.x-nlg .x-tab-bottom-disabled{background-image:url('../../../../../frontend/themes/images/partkeepr/tab/tab-default-bottom-disabled-bg.gif') !important}.x-tab-closable em{padding-right:14px}.x-tab-close-btn{position:absolute;top:2px;right:2px;width:11px;height:11px;font-size:0;line-height:0;text-indent:-999px;background:no-repeat;background-image:url('../../../../../frontend/themes/images/partkeepr/tab/tab-default-close.gif');filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=60);opacity:0.6}.x-nbr .x-tab-close-btn{top:0px;right:0px}a.x-tab-close-btn:hover{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);opacity:1}.x-tab-default-disabled a.x-tab-close-btn{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=30);opacity:0.3}.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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/themes/images/partkeepr/tab/tab-default-bottom-disabled-bg.gif')}.x-autowidth-table table.x-grid-table{table-layout:auto;width:auto!important}.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('../../../../../frontend/themes/images/partkeepr/tree/elbow.gif')}.x-tree-lines .x-tree-elbow-end{background-image:url('../../../../../frontend/themes/images/partkeepr/tree/elbow-end.gif')}.x-tree-lines .x-tree-elbow-plus{background-image:url('../../../../../frontend/themes/images/partkeepr/tree/elbow-plus.gif')}.x-tree-lines .x-tree-elbow-end-plus{background-image:url('../../../../../frontend/themes/images/partkeepr/tree/elbow-end-plus.gif')}.x-tree-lines .x-grid-tree-node-expanded .x-tree-elbow-plus{background-image:url('../../../../../frontend/themes/images/partkeepr/tree/elbow-minus.gif')}.x-tree-lines .x-grid-tree-node-expanded .x-tree-elbow-end-plus{background-image:url('../../../../../frontend/themes/images/partkeepr/tree/elbow-end-minus.gif')}.x-tree-lines .x-tree-elbow-line{background-image:url('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/themes/images/partkeepr/tree/arrows.gif')}.x-tree-icon{margin:2px 3px 0 0}.x-grid-with-row-lines .x-tree-icon{margin-top:1px}.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:20px;width:16px}.x-grid-with-row-lines .x-tree-elbow,.x-grid-with-row-lines .x-tree-elbow-end,.x-grid-with-row-lines .x-tree-elbow-plus,.x-grid-with-row-lines .x-tree-elbow-end-plus,.x-grid-with-row-lines .x-tree-elbow-empty,.x-grid-with-row-lines .x-tree-elbow-line{height:19px;background-position:0 -1px}.x-tree-icon-leaf{width:16px;background-image:url('../../../../../frontend/themes/images/partkeepr/tree/leaf.gif')}.x-tree-icon-parent{width:16px;background-image:url('../../../../../frontend/themes/images/partkeepr/tree/folder.gif')}.x-grid-tree-node-expanded .x-tree-icon-parent{background-image:url('../../../../../frontend/themes/images/partkeepr/tree/folder-open.gif')}.x-grid-rowbody{padding:0}.x-grid-cell-treecolumn .x-grid-cell-inner{padding:0;line-height:19px}.x-grid-with-row-lines .x-grid-cell-treecolumn .x-grid-cell-inner{line-height:17px}.x-tree-panel .x-grid-cell-inner{cursor:pointer}.x-tree-panel .x-grid-cell-inner img{display:inline-block;vertical-align:top}.x-ie .x-tree-panel .x-tree-elbow,.x-ie .x-tree-panel .x-tree-elbow-end,.x-ie .x-tree-panel .x-tree-elbow-plus,.x-ie .x-tree-panel .x-tree-elbow-end-plus,.x-ie .x-tree-panel .x-tree-elbow-empty,.x-ie .x-tree-panel .x-tree-elbow-line{vertical-align:-6px}.x-grid-editor-on-text-node .x-form-text{padding-left:1px;padding-right:1px}.x-ie .x-grid-editor-on-text-node .x-form-text{padding-left:2px;padding-right:2px}.x-opera .x-grid-editor-on-text-node .x-form-text{padding-left:2px;padding-right:2px}.x-tree-checkbox{margin:4px 3px 0 0;display:inline-block;vertical-align:top;width:13px;height:13px;background:no-repeat;background-image:url('../../../../../frontend/themes/images/partkeepr/form/checkbox.png');overflow:hidden;padding:0;border:0}.x-tree-checkbox::-moz-focus-inner{padding:0;border:0}.x-grid-with-row-lines .x-tree-checkbox{margin-top:3px}.x-tree-checkbox-checked{background-position:0 -13px}.x-tree-drop-ok-append .x-dd-drop-icon{background-image:url('../../../../../frontend/themes/images/partkeepr/tree/drop-append.gif')}.x-tree-drop-ok-above .x-dd-drop-icon{background-image:url('../../../../../frontend/themes/images/partkeepr/tree/drop-above.gif')}.x-tree-drop-ok-below .x-dd-drop-icon{background-image:url('../../../../../frontend/themes/images/partkeepr/tree/drop-below.gif')}.x-tree-drop-ok-between .x-dd-drop-icon{background-image:url('../../../../../frontend/themes/images/partkeepr/tree/drop-between.gif')}.x-grid-tree-loading .x-tree-icon{background-image:url('../../../../../frontend/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-stack;display:inline-block;vertical-align:middle;*vertical-align:auto;zoom:1;*display:inline;overflow:hidden}.rvml{behavior:url(#default#VML)}.x-surface tspan{user-select:none;-o-user-select:none;-ms-user-select:none;-moz-user-select:-moz-none;-webkit-user-select:none;cursor:default}.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}svg,vml{overflow:hidden}.x-viewport,.x-viewport body{margin:0;padding:0;border:0 none;overflow:hidden;height:100%;position:static}.x-dd-drag-proxy{z-index:1000000!important}.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('../../../../../frontend/themes/images/partkeepr/dd/drop-no.gif')}.x-dd-drop-ok .x-dd-drop-icon{background-image:url('../../../../../frontend/themes/images/partkeepr/dd/drop-yes.gif')}.x-dd-drop-ok-add .x-dd-drop-icon{background-image:url('../../../../../frontend/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-collapsed .x-resizable-handle{display:none}.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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/themes/images/partkeepr/util/splitter/mini-left.gif')}.x-layout-split-right{background:no-repeat top left;background-image:url('../../../../../frontend/themes/images/partkeepr/util/splitter/mini-right.gif')}.x-layout-split-top{background:no-repeat top left;background-image:url('../../../../../frontend/themes/images/partkeepr/util/splitter/mini-top.gif')}.x-layout-split-bottom{background:no-repeat top left;background-image:url('../../../../../frontend/themes/images/partkeepr/util/splitter/mini-bottom.gif')}.x-splitter-collapsed .x-layout-split-left{background:no-repeat top left;background-image:url('../../../../../frontend/themes/images/partkeepr/util/splitter/mini-right.gif')}.x-splitter-collapsed .x-layout-split-right{background:no-repeat top right;background-image:url('../../../../../frontend/themes/images/partkeepr/util/splitter/mini-left.gif')}.x-splitter-collapsed .x-layout-split-top{background:no-repeat top left;background-image:url('../../../../../frontend/themes/images/partkeepr/util/splitter/mini-bottom.gif')}.x-splitter-collapsed .x-layout-split-bottom{background:no-repeat top left;background-image:url('../../../../../frontend/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 !important;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-rtl .x-box-item{right:0;left:auto}.x-box-layout-ct,.x-border-layout-ct{overflow:hidden;zoom:1}.x-border-layout-ct{background-color:#dbdbdb;position:relative}.x-overflow-hidden{overflow:hidden !important}.x-inline-children>*{display:inline-block !important}.x-abs-layout-ct{position:relative}.x-abs-layout-item{position:absolute !important}.x-fit-item{position:relative}.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;-webkit-box-shadow:inset 0 0 0 0 #d9e7f8;-moz-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;-webkit-box-shadow:inset 0 1px 0 0 #e8e8e8;-moz-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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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('../../../../../frontend/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-quirks .x-ie .x-form-layout-table,.x-quirks .x-ie .x-form-layout-table tbody tr.x-form-item{position:relative}.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('../../../../../frontend/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-top:2px}.x-panel-header-vertical .x-tool-top,.x-window-header-vertical .x-tool-top{margin:0 0 4px}.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-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-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: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: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:linear-gradient(top, #68c4e1,#388ed8)}.x-toolbar-mainmenu .x-btn-default-toolbar-small .x-btn-arrow{background-image:url(../../../../../frontend/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/js/Components/Auth/LoginDialog.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Auth/LoginDialog.js diff --git a/src/frontend/js/Components/CategoryEditor/CategoryEditorForm.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/CategoryEditor/CategoryEditorForm.js diff --git a/src/frontend/js/Components/CategoryEditor/CategoryEditorTree.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/CategoryEditor/CategoryEditorTree.js diff --git a/src/PartKeepr/FrontendBundle/Resources/public/js/Components/CategoryEditor/CategoryEditorWindow.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/CategoryEditor/CategoryEditorWindow.js @@ -0,0 +1,65 @@ +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.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/PartKeepr/FrontendBundle/Resources/public/js/Components/CategoryStore.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/CategoryStore.js @@ -0,0 +1,30 @@ +Ext.define("PartKeepr.CategoryTreeStore", { + extend: "Ext.data.TreeStore", + + root: { + text: 'Ext JS', + id: 'src', + expanded: true + }, + constructor: function () { + Ext.apply(this, { + proxy: { + type: 'ajax', + url: PartKeepr.getBasePath()+'/Category', + method: 'POST', + extraParams: { + call: 'getCategories' + }, + reader: { + type: 'json', + root: 'response' + } + } + }); + + this.proxy.extraParams.session = PartKeepr.getSession(); + + this.callParent(); + }, + folderSort: true +});+ \ No newline at end of file diff --git a/src/PartKeepr/FrontendBundle/Resources/public/js/Components/CategoryTree.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/CategoryTree.js @@ -0,0 +1,118 @@ +Ext.define("PartKeepr.CategoryTree", { + alias: 'widget.CategoryTree', + extend: 'Ext.tree.Panel', + categoryService: null, + categoryModel: null, + 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.loadCategories(); + }, + loadCategories: function () { + this.loaded = false; + + 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 label; + + if (data.description && + PartKeepr.getApplication().getUserPreference("partkeepr.categorytree.showdescriptions") === true) + { + label = data.name + " - " + data.description; + } else { + label = data.name; + } + + var nodeData = { + id : data.id, + name : data.name, + description : data.description, + text : label, + 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. + */ + nodeData.leaf = false; + + Ext.data.NodeInterface.decorate(this.categoryModel); + + var newNode = Ext.create(this.categoryModel, nodeData); + + newNode = root.appendChild(newNode); + + for ( var i = 0; i < data.children.length; i++) { + this.buildCategoryTree(newNode, data.children[i], expandedNodes); + } + + return newNode; + } +}); diff --git a/src/frontend/js/Components/ContextMenu/CharPickerMenu.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/ContextMenu/CharPickerMenu.js diff --git a/src/frontend/js/Components/Distributor/DistributorEditor.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Distributor/DistributorEditor.js diff --git a/src/frontend/js/Components/Distributor/DistributorEditorComponent.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Distributor/DistributorEditorComponent.js diff --git a/src/frontend/js/Components/Distributor/DistributorGrid.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Distributor/DistributorGrid.js diff --git a/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Editor/Editor.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Editor/Editor.js @@ -0,0 +1,133 @@ +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, + icon: 'resources/fugue-icons/icons/disk.png', + handler: Ext.bind(this._onItemSave, this) + }); + + this.cancelButton = Ext.create("Ext.button.Button", { + text: this.cancelText, + 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.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 () { + // Disable the save button to indicate progress + if (this.enableButtons) { + this.saveButton.disable(); + + // Sanity: If the save process fails, re-enable the button after 30 seconds + Ext.defer(function () { this.saveButton.enable(); }, 30000, this); + } + + this.getForm().updateRecord(this.record); + + this.fireEvent("itemSave", this.record); + + this.record.save({ + callback: this._onSave, + scope: this + }); + }, + _onSave: function (record, response) { + if (this.enableButtons) { + // Re-enable the save button + this.saveButton.enable(); + } + + if (response.success === true) { + this.record = record; + this.fireEvent("itemSaved", this.record); + } + }, + _setTitle: function (title) { + // Not sure why this was here - in ExtJS 4.1, this creates a title bar, which we do not want. + //this.setTitle(title); + } +}); diff --git a/src/frontend/js/Components/Editor/EditorComponent.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Editor/EditorComponent.js diff --git a/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Editor/EditorGrid.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Editor/EditorGrid.js @@ -0,0 +1,224 @@ +/** + * 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: 'PartKeepr.BaseGrid', + 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 {Boolean} boolean Specifies whether to enable the top toolbar or not + */ + enableTopToolbar: true, + + /** + * @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', + + /** + * @cfg {Boolean} boolean Defines if the grid should automatically calculate it's page size + */ + automaticPageSize: false, + + /** + * @cfg {Integer} integer Defines the row height with which the calculator should assume + */ + automaticPageSizeRowHeight: 21, + + /** + * @cfg {Boolean} boolean Defines if the list should be read-only, or if the list can be edited. Defaults to true. + */ + enableEditing: true, + + /** + * @event itemSelect + * Fires if a record was selected within the grid. + * @param {Object} record The selected record + */ + initComponent: function () { + + /** + * @event itemDeselect + * Fires if a record was deselected within the grid. + * @param {Object} record The deselected record + */ + + /** + * @event itemEdit + * Fires if a record should be edited. + * @param {Object} record The record to edit + */ + + /** + * @event itemDelete + * Fires if the delete button was clicked. + */ + + /** + * @event itemDelete + * Fires if the add button was clicked. + */ + + + 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.addButton = Ext.create("Ext.button.Button", { + text: (this.buttonTextMode !== "hide") ? this.addButtonText : '', + tooltip: this.addButtonText, + icon: this.addButtonIcon, + handler: Ext.bind(function () { + this.fireEvent("itemAdd"); + }, this) + }); + + this.searchField = Ext.create("Ext.ux.form.SearchField",{ + store: this.store + }); + + var topToolbarItems = []; + + if (this.enableEditing) { + topToolbarItems.push(this.addButton); + topToolbarItems.push(this.deleteButton); + } + + topToolbarItems.push({ xtype: 'tbfill' }); + topToolbarItems.push(this.searchField); + + this.topToolbar = Ext.create("Ext.toolbar.Toolbar",{ + dock: 'top', + enableOverflow: true, + items: topToolbarItems + }); + + this.bottomToolbar = Ext.create("Ext.toolbar.Paging", { + store: this.store, + enableOverflow: true, + dock: 'bottom', + displayInfo: false + }); + + this.dockedItems = new Array(); + + this.dockedItems.push(this.bottomToolbar); + + if (this.enableTopToolbar) { + this.dockedItems.push(this.topToolbar); + } + + if (!Ext.isArray(this.plugins)) { + this.plugins = []; + } + + this.plugins.push('gridmenu'); + + this.callParent(); + + if (this.automaticPageSize) { + this.on("resize", this.reassignPageSize, this); + } + }, + /** + * Re-calculates and re-assigns the page size for the assigned store. + * + * Automatically reloads the store. + * + * @param none + * @return nothing + */ + reassignPageSize: function () { + if (this.store.isLoading()) { return; } + if (this.getView().getHeight() === 0) { return; } + + var numRecords = Math.floor(this.getView().getHeight() / this.automaticPageSizeRowHeight); + + if (numRecords < 1) { numRecords = 1; } + + var oldStartIndex = this.store.pageSize * this.store.currentPage; + + this.store.pageSize = numRecords; + + var newStartPage = Math.floor(oldStartIndex / numRecords); + + if (newStartPage < 1) { + newStartPage = 1; + } + + this.store.loadPage(newStartPage); + }, + 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); + } +}); diff --git a/src/frontend/js/Components/Footprint/FootprintAttachmentGrid.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Footprint/FootprintAttachmentGrid.js diff --git a/src/frontend/js/Components/Footprint/FootprintEditor.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Footprint/FootprintEditor.js diff --git a/src/frontend/js/Components/Footprint/FootprintEditorComponent.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Footprint/FootprintEditorComponent.js diff --git a/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Footprint/FootprintTree.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Footprint/FootprintTree.js @@ -0,0 +1,215 @@ +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.on("itemclick", Ext.bind(function (t,record) { + if (record.self.getName() == "PartKeepr.Footprint") { + this.fireEvent("itemEdit", record.get("id")); + } + }, 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. This prepares the to-be-edited record with the proper category id. + */ + _onAddFootprint: function () { + var record = this.getSelectionModel().getLastSelected(); + + if (!record) { + // Nothing is selected, use the root node's ID as category + this.fireEvent("itemAdd", { category: this.getRootNode().get("id") }); + } + + if (record.self.getName() == "PartKeepr.FootprintCategory") { + // Selected node is a footprint category + this.fireEvent("itemAdd", { category: record.get("id") }); + } else { + // Selected node is a footprint + if (record.parentNode && record.parentNode.self.getName() == "PartKeepr.FootprintCategory") { + // Selected parent node is a category, perfect. Let's use this + this.fireEvent("itemAdd", { category: record.parentNode.get("id") }); + } else { + // Something went probably wrong, use the root node + this.fireEvent("itemAdd", { category: 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.self.getName() == "PartKeepr.Footprint") { + 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(); + }, + /** + * Injects all footprints into the correct categories. That way, we don't have to implement a complete + * own tree, but rather take what's already there for the categories and extend that. + */ + _onCategoriesLoaded: function () { + this.callParent(arguments); + + var store = PartKeepr.getApplication().getFootprintStore(); + var nodeData, record; + + Ext.data.NodeInterface.decorate("PartKeepr.Footprint"); + + for (var i=0;i<store.getCount();i++) { + record = store.getAt(i); + nodeData = { + text: record.getRecordName(), + name: record.getRecordName(), + id: record.get("id"), + leaf: true, + iconCls:'icon-footprint' + }; + + var newNode = Ext.create("PartKeepr.Footprint", nodeData); + + if (record.get("category") === 0) { + this.getRootNode().firstChild.appendChild(newNode); + } else { + + var node = this.getRootNode().findChildBy(function () { + if (this.self.getName() == "PartKeepr.FootprintCategory" && this.get("id") == record.get("category")) { + return true; + } else { + return false; + } + }, false, true); + + if (node) { + node.appendChild(newNode); + } else { + this.getRootNode().firstChild.appendChild(newNode); + } + } + + } + + }, + onBeforeDrop: function (node, data, overModel, dropPosition, dropFunction, options) { + var draggedRecord = data.records[0]; + var droppedOn = this.getView().getRecord(node); + + if (droppedOn.self.getName() == "PartKeepr.Footprint") { + // Target record is a footprint, we don't allow moving categories onto footprints + return false; + } + + if (draggedRecord.self.getName() == "PartKeepr.Footprint") { + /* Move Footprint */ + var call = new PartKeepr.ServiceCall("Footprint", "moveFootprint"); + + call.setParameter("id", draggedRecord.get("id")); + call.setParameter("targetCategory", droppedOn.get("id")); + call.setHandler(Ext.bind(function () { + var sourceNode = this.getRootNode().findChildBy(function () { + if (this.self.getName() == "PartKeepr.Footprint" && this.get("id") == draggedRecord.get("id")) { + return true; + } else { + return false; + } + }, false, true); + + var targetNode = this.getRootNode().findChildBy(function () { + if (this.self.getName() == "PartKeepr.FootprintCategory" && this.get("id") == droppedOn.get("id")) { + return true; + } else { + return false; + } + }, false, true); + + targetNode.expand(); + + sourceNode.remove(); + + targetNode.appendChild(sourceNode); + + var oldRecordIndex = PartKeepr.getApplication().getFootprintStore().find("id", draggedRecord.get("id")); + 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/Grid/BaseGrid.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Grid/BaseGrid.js diff --git a/src/frontend/js/Components/Grid/GridMenuPlugin.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Grid/GridMenuPlugin.js diff --git a/src/frontend/js/Components/Manufacturer/ManufacturerEditor.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Manufacturer/ManufacturerEditor.js diff --git a/src/frontend/js/Components/Manufacturer/ManufacturerEditorComponent.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Manufacturer/ManufacturerEditorComponent.js diff --git a/src/frontend/js/Components/Manufacturer/ManufacturerGrid.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Manufacturer/ManufacturerGrid.js diff --git a/src/frontend/js/Components/Menu.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Menu.js diff --git a/src/frontend/js/Components/MenuBar.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/MenuBar.js diff --git a/src/frontend/js/Components/MessageLog.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/MessageLog.js diff --git a/src/frontend/js/Components/Part/Editor/PartAttachmentGrid.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Part/Editor/PartAttachmentGrid.js diff --git a/src/frontend/js/Components/Part/Editor/PartDistributorGrid.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Part/Editor/PartDistributorGrid.js diff --git a/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Part/Editor/PartEditor.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Part/Editor/PartEditor.js @@ -0,0 +1,455 @@ +/** + * @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 overall height of all fields, used to calculate the anchoring for the description field + var overallHeight = (this.partMode == "create") ? '-280' : '-235'; + + this.nameField = Ext.create("Ext.form.field.Text", { + name: 'name', + fieldLabel: i18n("Name"), + allowBlank: false, + labelWidth: 150 + }); + + this.storageLocationComboBox = Ext.create("PartKeepr.StorageLocationComboBox", + { + fieldLabel: i18n("Storage Location"), + name: 'storageLocation', + allowBlank: false, + labelWidth: 150 + }); + + this.storageLocationComboBox.store.on("load", function () { + // Re-trigger validation because of asynchronous loading of the storage location field, + // which would be marked invalid because validation happens immediately, but after loading + // the storage locations, the field is valid, but not re-validated. + + // This workaround is done twice; once after the store is loaded and once when we start editing, + // because we don't know which event will come first + this.getForm().isValid(); + }, this); + + this.footprintNone = Ext.create("Ext.form.field.Radio", { + boxLabel: i18n("None"), + name: 'footprint_mode', + margin: { + right: 5 + }, + value: "unset", + listeners: { + scope: this, + change: function (field, newValue) { + if (newValue === true) { + this.footprintComboBox.clearValue(); + } + } + } + }); + + this.footprintSet = Ext.create("Ext.form.field.Radio", { + name: 'footprint_mode', + margin: { + right: 5 + }, + value: "set" + }); + + /* + * Creates the footprint combo box. We listen for the "change" event, because we need to set the footprint + * comboboxes to the right state, depending on the selection. Another way would be to patch the combobox + * to support "null" values, however, this is a major change within ExtJS and probably not supported for + * updates of ExtJS. + */ + this.footprintComboBox = Ext.create("PartKeepr.FootprintComboBox", { + name: 'footprint', + flex: 1, + listeners: { + scope: this, + change: function (field, newValue) { + if (newValue !== 0) { + this.footprintSet.setValue(true); + } + } + } + }); + + // Defines the basic editor fields + var basicEditorFields = [ + this.nameField, + { + xtype: 'textfield', + fieldLabel: i18n("Description"), + name: 'description' + },{ + 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' + }, + this.storageLocationComboBox, + { + xtype: 'fieldcontainer', + layout: 'hbox', + fieldLabel: i18n("Footprint"), + defaults: { + hideLabel: true + }, + items: [ + this.footprintNone, + this.footprintSet, + this.footprintComboBox + ] + },{ + xtype: 'textarea', + fieldLabel: i18n("Comment"), + name: 'comment', + anchor: '100% ' + overallHeight + }, + { + xtype: 'fieldcontainer', + layout: 'hbox', + fieldLabel: i18n("Status"), + defaults: { + hideLabel: true + }, + items: [{ + xtype: 'textfield', + fieldLabel: i18n("Status"), + flex: 1, + name: 'status' + },{ + xtype: 'checkbox', + hideEmptyLabel: false, + fieldLabel: '', + margins: { + left: 5 + }, + boxLabel: i18n("Needs Review"), + name: 'needsReview' + }] + },{ + xtype: 'textfield', + fieldLabel: i18n("Condition"), + name: 'partCondition' + },{ + xtype: 'fieldcontainer', + layout: 'hbox', + items : [{ + xtype: 'textfield', + labelWidth: 150, + fieldLabel: i18n("Internal Part Number"), + name: 'internalPartNumber', + flex: 1 + },{ + xtype: 'displayfield', + margins: { + left: 5 + }, + fieldLabel: i18n("Internal ID"), + name: 'id' + }] + + }]; + + // Creates the distributor grid + this.partDistributorGrid = Ext.create("PartKeepr.PartDistributorGrid", { + title: i18n("Distributors"), + iconCls: 'icon-lorry', + layout: 'fit' + }); + + // Creates the manufacturer grid + this.partManufacturerGrid = Ext.create("PartKeepr.PartManufacturerGrid", { + title: i18n("Manufacturers"), + iconCls: 'icon-building', + layout: 'fit' + }); + + // Creates the parameter grid + this.partParameterGrid = Ext.create("PartKeepr.PartParameterGrid", { + title: i18n("Parameters"), + iconCls: 'icon-table', + layout: 'fit' + }); + + // Creates the attachment grid + this.partAttachmentGrid = Ext.create("PartKeepr.PartAttachmentGrid", { + title: i18n("Attachments"), + iconCls: 'icon-attach', + 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("PartKeepr.CurrencyField", { + 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: [{ + iconCls: 'icon-brick', + xtype: 'panel', + border: false, + autoScroll: false, + 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.callParent(); + + this.on("itemSave", this.onItemSave, this); + + }, + /** + * Cleans up the record prior saving. + */ + onItemSave: function () { + var removeRecords = [], j; + + /** + * Iterate through all records and check if a valid distributor + * ID is assigned. If not, the record is removed as it is assumed + * that the record is invalid and being removed. + */ + for (j=0;j<this.record.distributors().getCount();j++) { + if (this.record.distributors().getAt(j).get("distributor_id") === 0) { + removeRecords.push(this.record.distributors().getAt(j)); + } + } + + if (removeRecords.length > 0) { + this.record.distributors().remove(removeRecords); + } + + removeRecords = []; + + /** + * Iterate through all records and check if a valid parameter + * ID is assigned. If not, the record is removed as it is assumed + * that the record is invalid and being removed. + */ + + for (j=0;j<this.record.parameters().getCount();j++) { + if (this.record.parameters().getAt(j).get("unit_id") === 0) { + removeRecords.push(this.record.parameters().getAt(j)); + } + } + + if (removeRecords.length > 0) { + this.record.parameters().remove(removeRecords); + } + + removeRecords = []; + + /** + * Iterate through all records and check if a valid manufacturer + * ID is assigned. If not, the record is removed as it is assumed + * that the record is invalid and being removed. + */ + + for (j=0;j<this.record.manufacturers().getCount();j++) { + if (this.record.manufacturers().getAt(j).get("manufacturer_id") === 0) { + removeRecords.push(this.record.manufacturers().getAt(j)); + } + } + + if (removeRecords.length > 0) { + this.record.manufacturers().remove(removeRecords); + } + + /** + * Check if the storage location is valid. If not, try an exact, case-insensitive match for the + * storage location name and inject that into the record. + */ + if (isNaN(this.record.get("storageLocation"))) { + var storageLocationRecord = this.storageLocationComboBox.getStore().findRecord( + "name", + this.storageLocationComboBox.getValue(), + 0, false, false, true) ; + + this.record.set("storageLocation", storageLocationRecord.get("id")); + } + + // Force footprint to be "null" when the checkbox is checked. + if (this.footprintNone.getValue() === true) { + this.record.set("footprint", 0); + } + + }, + onEditStart: function () { + this.bindChildStores(); + this.nameField.focus(); + + // Re-trigger validation because of asynchronous loading of the storage location field, + // which would be marked invalid because validation happens immediately, but after loading + // the storage locations, the field is valid, but not re-validated. + + // This workaround is done twice; once after the store is loaded and once when we start editing, + // because we don't know which event will come first + this.getForm().isValid(); + + if (this.record.get("footprint") === 0) { + this.footprintNone.setValue(true); + } else { + this.footprintSet.setValue(true); + } + }, + _onItemSaved: function () { + this.fireEvent("partSaved", this.record); + + if (this.keepOpenCheckbox.getValue() !== true && this.createCopyCheckbox.getValue() !== true) { + this.fireEvent("editorClose", this); + } else { + var newItem; + if (this.partMode == "create") { + if (this.copyPartDataCheckbox.getValue() === true) { + data = this.record.getData(true); + data.id = null; + newItem = Ext.create("PartKeepr.Part"); + newItem.setDataWithAssociations(data); + + this.editItem(newItem); + } else { + newItem = Ext.create("PartKeepr.Part", this.partDefaults); + this.editItem(newItem); + } + } else { + var data = this.record.getData(true); + data.id = null; + newItem = Ext.create("PartKeepr.Part"); + newItem.setDataWithAssociations(data); + + 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()); + }, + _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/PartKeepr/FrontendBundle/Resources/public/js/Components/Part/Editor/PartEditorWindow.js diff --git a/src/frontend/js/Components/Part/Editor/PartManufacturerGrid.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Part/Editor/PartManufacturerGrid.js diff --git a/src/frontend/js/Components/Part/Editor/PartParameterGrid.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Part/Editor/PartParameterGrid.js diff --git a/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Part/PartCategoryTree.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Part/PartCategoryTree.js @@ -0,0 +1,52 @@ +Ext.define("PartKeepr.PartCategoryTree", { + extend: 'PartKeepr.CategoryEditorTree', + alias: 'widget.PartCategoryTree', + + ddGroup: 'PartTree', + categoryModel: 'PartKeepr.PartCategory', + categoryService: 'PartCategory', + initComponent: function () { + this.callParent(); + + this.syncButton = Ext.create("Ext.button.Button", { + tooltip: i18n("Reveal Category for selected part"), + 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/PartKeepr/FrontendBundle/Resources/public/js/Components/Part/PartDisplay.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Part/PartDisplay.js @@ -0,0 +1,230 @@ +/** + * @class PartKeepr.PartDisplay + * <p>This component displays information about a specific part.</p> + */ +Ext.define('PartKeepr.PartDisplay', { + extend: 'Ext.panel.Panel', + bodyCls: 'partdisplay', + + autoScroll: true, + + /** + * 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>', + '<h2>{description}</h2>', + '<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("Condition")+':</td>', + '<td class="o">{partCondition}</td>', + '</tr>', + '<tr>', + '<td class="e">'+i18n("Needs Review")+':</td>', + '<td class="e">{needsReview}</td>', + '</tr>', + '<tr>', + '<td class="o">'+i18n("Internal ID")+':</td>', + '<td class="o">{id}</td>', + '</tr>', + '<tr>', + '<td class="e">'+i18n("Used in projects")+':</td>', + '<td class="e">{[ (values.projects == "") ? "'+i18n("none")+'" : values.projects ]}</td>', + '</tr>', + '<tr>', + '<td class="o">'+i18n("Attachments")+':</td>', + '<td class="o">' + + '<tpl for="values.processedAttachments">' + + '<p><a href="{link}" target="_blank">{data.originalFilename}</a></p>' + + '</tpl>' + + '</td>' + + '</tr>', + '</table>'); + + /** + * Create the "add stock" button + */ + this.addButton = new Ext.Button({ + text: i18n("Add Stock"), + 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"), + 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.imageDisplay = Ext.create("PartKeepr.PartImageDisplay"); + this.infoContainer = Ext.create("Ext.container.Container"); + + this.items = [ this.infoContainer, this.imageDisplay ]; + 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 = {}; + var i; + + for (i in r.data) { + if (r.data[i] !== null) { + values[i] = htmlentities(r.data[i]); + } else { + values[i] = r.data[i]; + } + } + + values.processedAttachments = this.record.attachments().data; + + for (i=0;i<values.processedAttachments.getCount();i++) { + var data = values.processedAttachments.getAt(i); + + data.link = "file.php?type=PartAttachment&id="+data.internalId; + } + + this.tpl.overwrite(this.infoContainer.getEl(), values); + this.imageDisplay.setStore(this.record.attachments()); + + this.doLayout(); + // Scroll the container to top in case the user scrolled the part, then switched to another part + this.getTargetEl().scrollTo("top", 0); + + }, + /** + * 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, comment) { + var call = new PartKeepr.ServiceCall( + "Part", + "addStock"); + call.setParameter("stock", quantity); + call.setParameter("price", price); + call.setParameter("comment", comment); + 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(); + } +}); diff --git a/src/frontend/js/Components/Part/PartFilterPanel.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Part/PartFilterPanel.js diff --git a/src/frontend/js/Components/Part/PartImageDisplay.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Part/PartImageDisplay.js diff --git a/src/frontend/js/Components/Part/PartStockHistory.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Part/PartStockHistory.js diff --git a/src/frontend/js/Components/Part/PartStockWindow.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Part/PartStockWindow.js diff --git a/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Part/PartsGrid.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Part/PartsGrid.js @@ -0,0 +1,485 @@ +/** + * This class is the main part list grid. + * + */ +Ext.define('PartKeepr.PartsGrid', { + extend: 'PartKeepr.EditorGrid', + alias: 'widget.PartsGrid', + + /** + * Display button texts by default + */ + buttonTextMode: 'show', + + /** + * @cfg {String} Defines the text of the "Add" button + */ + addButtonText: i18n("Add Part"), + + /** + * @cfg {String} Defines the icon of the "Add" button + */ + addButtonIcon: 'resources/silkicons/brick_add.png', + + /** + * @cfg {String} Defines the text of the "Delete" button + */ + deleteButtonText: i18n("Delete Part"), + + /** + * @cfg {String} Defines the icon of the "Add" button + */ + deleteButtonIcon: 'resources/silkicons/brick_delete.png', + + /** + * @cfg {String} Defines the icon of the "Expand Row" button + */ + expandRowButtonIcon: 'resources/icons/group-expand.png', + + /** + * @cfg {String} Defines the icon of the "Collapse Row" button + */ + collapseRowButtonIcon: 'resources/icons/group-collapse.png', + + /** + * Configure drag'n'drop. + * @todo Check if this messes up with the Part Dropdown in the project view + */ + viewConfig: { + plugins: { + ddGroup: 'CategoryTree', + ptype: 'gridviewdragdrop', + enableDrop: false + } + }, + enableDragDrop : true, + stripeRows : true, + multiSelect : true, + autoScroll : false, + invalidateScrollerOnRefresh: true, + initComponent: function () { + + this.groupingFeature = Ext.create('Ext.grid.feature.Grouping',{ + //enableGroupingMenu: false, + groupHeaderTpl: '{name} ({rows.length} ' + i18n("Part(s)")+")" + }); + + // Create the columns + this.defineColumns(); + + + this.features = [this.groupingFeature]; + + this.on("itemdblclick", this.onDoubleClick, this); + + // 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); + } + }); + + if (this.enableEditing) { + this.editing = Ext.create('Ext.grid.plugin.CellEditing', { + clicksToEdit: 1 + }); + + this.editing.on("edit", this.onEdit, this); + + this.plugins = [ this.editing ]; + } + + // Initialize the panel + this.callParent(); + + this.bottomToolbar.add({ + xtype: 'button', + tooltip: i18n("Expand all Groups"), + icon: this.expandRowButtonIcon, + listeners: { + scope: this.groupingFeature, + click: this.groupingFeature.expandAll + } + + }); + + this.bottomToolbar.add({ + xtype: 'button', + tooltip: i18n("Collapse all Groups"), + icon: this.collapseRowButtonIcon, + listeners: { + scope: this.groupingFeature, + click: this.groupingFeature.collapseAll + } + }); + + var duplicateBasicData = i18n("Duplicates the selected part with the data found in the \"basic\" tab and opens the editor. Doesn't immediately saves the duplicate, in order to allow editing."); + var duplicateAllData = i18n("Duplicates the selected part with all data including attachments, distributors etc. Doesn't immediately saves the duplicate, in order to allow editing."); + + this.addFromTemplateButton = Ext.create("Ext.button.Split", { + disabled: true, + handler: Ext.bind(function () { + this.fireEvent("duplicateItemWithBasicData"); + }, this), + tooltip: duplicateBasicData, + text: i18n("Duplicate"), + icon: 'resources/silkicons/brick_link.png', + menu: new Ext.menu.Menu({ + items: [{ + text: i18n("Duplicate with all data"), + tooltip: duplicateAllData, + handler: function () { + this.fireEvent("duplicateItemWithAllData"); + }, + scope: this + },{ + text: i18n("Duplicate basic data only"), + tooltip: duplicateBasicData, + handler: function () { + this.fireEvent("duplicateItemWithBasicData"); + }, + scope: this + } + ] + }) + }); + + if (this.enableEditing) { + this.topToolbar.insert(2, this.addFromTemplateButton); + } + + + this.mapSearchHotkey(); + }, + /** + * Maps a search hotkey to the search box. + * + * Right now, this is hardcoded to alt+x. + * + * @param none + * @return nothing + */ + mapSearchHotkey: function () { + this.searchKey = new Ext.util.KeyMap(Ext.get(document), { + key: 'x', + ctrl: false, + alt: true, + fn: function(e) { + var searchBox = this.searchField; + if (Ext.get(document).activeElement != searchBox) { + searchBox.focus('',10); + } + searchBox.setValue(''); + }, + scope: this, + stopEvent: true + }); + }, + /** + * Called when an item was selected. Enables/disables the delete button. + */ + _updateAddTemplateButton: function (selectionModel, record) { + /* Right now, we support delete on a single record only */ + if (this.getSelectionModel().getCount() == 1) { + this.addFromTemplateButton.enable(); + } else { + this.addFromTemplateButton.disable(); + } + }, + /** + * Called when an item was selected + */ + _onItemSelect: function (selectionModel, record) { + this._updateAddTemplateButton(selectionModel, record); + this.callParent(arguments); + }, + /** + * Called when an item was deselected + */ + _onItemDeselect: function (selectionModel, record) { + this._updateAddTemplateButton(selectionModel, record); + this.callParent(arguments); + }, + /** + * 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: '<img src="resources/diagona-icons/icons/10/190.png"/>', + dataIndex: "", + width: 30, + tooltip: i18n("Has attachments?"), + renderer: this.iconRenderer + },{ + header: '<img src="resources/diagona-icons/icons/10/102.png"/>', + dataIndex: "needsReview", + width: 25, + tooltip: i18n("Needs Review?"), + renderer: this.reviewRenderer + },{ + header: i18n("Name"), + dataIndex: 'name', + flex: 1, + minWidth: 150, + renderer: Ext.util.Format.htmlEncode + },{ + header: i18n("Description"), + dataIndex: 'description', + flex: 2, + minWidth: 150, + renderer: Ext.util.Format.htmlEncode + },{ + header: i18n("Storage Location"), + dataIndex: 'storageLocationName', + renderer: Ext.util.Format.htmlEncode + },{ + header: i18n("Status"), + dataIndex: "status", + renderer: Ext.util.Format.htmlEncode + },{ + header: i18n("Condition"), + dataIndex: "partCondition", + renderer: Ext.util.Format.htmlEncode + },{ + header: i18n("Stock"), + dataIndex: 'stockLevel', + editor: { + xtype:'numberfield', + allowBlank:false + }, + renderer: this.stockLevelRenderer + },{ + header: i18n("Min. Stock"), + dataIndex: 'minStockLevel', + renderer: this.stockLevelRenderer + },{ + header: i18n("Avg. Price"), + dataIndex: 'averagePrice', + align: 'right', + renderer: this.averagePriceRenderer + },{ + header: i18n("Footprint"), + dataIndex: 'footprintName', + renderer: Ext.util.Format.htmlEncode + },{ + header: i18n("Category"), + dataIndex: 'categoryPath', + renderer: Ext.util.Format.htmlEncode, + 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("partUnitShortName"); + } 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/diagona-icons/icons/10/190.png" style="margin-top: 2px;" alt="'+i18n("Has attachments")+'" title="'+i18n("Has attachments")+'"/>'; + } + + return ret; + }, + /** + * Used as renderer for the review column. + */ + reviewRenderer: function (val,q,rec) + { + var ret = ""; + if (rec.get("needsReview") === true) { + ret += '<img src="resources/diagona-icons/icons/10/071.png" style="margin-top: 2px;" alt="'+i18n("Needs review")+'" title="'+i18n("Needs review")+'"/>'; + } + + 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.store.currentPage = 1; + this.store.load({ + start: 0 + }); + }, + /** + * Handles editing of the grid fields. Right now, only the stock level editing is supported. + * + * @param e An edit event, as documented in + * http://docs.sencha.com/ext-js/4-0/#!/api/Ext.grid.plugin.CellEditing-event-edit + */ + onEdit: function (editor, e) { + switch (e.field) { + case "stockLevel": + this.handleStockFieldEdit(e); + break; + default: + break; + } + }, + /** + * Handles the editing of the stock level field. Checks if the user has opted in to skip the + * online stock edit confirm window, and runs the changes afterwards. + * + * @param e An edit event, as documented in + * http://docs.sencha.com/ext-js/4-0/#!/api/Ext.grid.plugin.CellEditing-event-edit + */ + handleStockFieldEdit: function (e) { + if (PartKeepr.getApplication().getUserPreference("partkeepr.inline-stock-change.confirm") === false) { + this.handleStockChange(e); + } else { + this.confirmStockChange(e); + } + }, + /** + * Opens the confirm dialog + * + * @param e An edit event, as documented in + * http://docs.sencha.com/ext-js/4-0/#!/api/Ext.grid.plugin.CellEditing-event-edit + */ + confirmStockChange: function (e) { + var confirmText = ""; + var headerText = ""; + + if (e.value < 0) { + confirmText = sprintf( i18n("You wish to remove <b>%s %s</b> of the part <b>%s</b>. Is this correct?"), + abs(e.value), e.record.get("partUnitName"), e.record.get("name")); + + // Set the stock level to a temporary calculated value. + e.record.set("stockLevel", (e.originalValue - abs(e.value))); + headerText = i18n("Remove Part(s)"); + } else { + confirmText = sprintf( + i18n("You wish to set the stock level to <b>%s %s</b> of part <b>%s</b>. Is this correct?"), + abs(e.value), e.record.get("partUnitName"), e.record.get("name")); + + headerText = i18n("Set Stock Level for Part(s)"); + } + + var j = new PartKeepr.RememberChoiceMessageBox({ + escButtonAction: "cancel", + dontAskAgainProperty: "partkeepr.inlinestockremoval.ask", + dontAskAgainValue: false + }); + + j.show({ + title : headerText, + msg : confirmText, + buttons: Ext.Msg.OKCANCEL, + fn: this.afterConfirmStockChange, + scope : this, + originalOnEdit: e, + dialog: j + }); + }, + /** + * Callback for the stock removal confirm window. + * + * The parameters are documented on: + * http://docs.sencha.com/ext-js/4-0/#!/api/Ext.window.MessageBox-method-show + */ + afterConfirmStockChange: function (buttonId, text, opts) { + if (buttonId == "cancel") { + opts.originalOnEdit.record.set("stockLevel", opts.originalOnEdit.originalValue); + } + + if (buttonId == "ok") { + if (opts.dialog.rememberChoiceCheckbox.getValue() === true) { + PartKeepr.getApplication().setUserPreference("partkeepr.inline-stock-change.confirm", false); + } + + this.handleStockChange(opts.originalOnEdit); + } + }, + /** + * Handles the stock change. Automatically figures out which method to call (deleteStock or addStock) and + * sets the correct quantity. + * + * @param e An edit event, as documented in + * http://docs.sencha.com/ext-js/4-0/#!/api/Ext.grid.plugin.CellEditing-event-edit + */ + handleStockChange: function (e) { + var mode, quantity = 0; + + if (e.value < 0) { + mode = "deleteStock"; + quantity = abs(e.value); + } else { + if (e.originalValue <= e.value) { + mode = "deleteStock"; + quantity = e.originalValue - e.value; + } else { + mode = "addStock"; + quantity = e.value - e.originalValue; + } + } + + var call = new PartKeepr.ServiceCall( + "Part", + mode); + call.setParameter("stock", quantity); + call.setParameter("part", e.record.get("id")); + call.setHandler(Ext.bind(this.reloadPart, this, [ e ])); + call.doCall(); + }, + /** + * Reloads the current part + */ + reloadPart: function (opts) { + this.loadPart(opts.record.get("id"), opts); + }, + /** + * Load the part from the database. + */ + loadPart: function (id, opts) { + PartKeepr.Part.load(id, { + scope: this, + success: this.onPartLoaded + }); + }, + /** + * Callback after the part is loaded + */ + onPartLoaded: function (record, opts) { + var rec = this.store.findRecord("id", record.get("id")); + if (rec) { + rec.set("stockLevel", record.get("stockLevel")); + } + } +}); diff --git a/src/frontend/js/Components/Part/PartsManager.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Part/PartsManager.js diff --git a/src/frontend/js/Components/PartUnit/PartUnitEditor.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/PartUnit/PartUnitEditor.js diff --git a/src/frontend/js/Components/PartUnit/PartUnitEditorComponent.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/PartUnit/PartUnitEditorComponent.js diff --git a/src/frontend/js/Components/PartUnit/PartUnitGrid.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/PartUnit/PartUnitGrid.js diff --git a/src/frontend/js/Components/Picker/CharPicker.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Picker/CharPicker.js diff --git a/src/frontend/js/Components/Printing/PageBasicLayoutEditor.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Printing/PageBasicLayoutEditor.js diff --git a/src/frontend/js/Components/Printing/PageBasicLayoutEditorComponent.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Printing/PageBasicLayoutEditorComponent.js diff --git a/src/frontend/js/Components/Printing/PageBasicLayoutGrid.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Printing/PageBasicLayoutGrid.js diff --git a/src/frontend/js/Components/Printing/PrintStorageLocations.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Printing/PrintStorageLocations.js diff --git a/src/frontend/js/Components/Printing/PrintingExecutor.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Printing/PrintingExecutor.js diff --git a/src/frontend/js/Components/Printing/PrintingJobConfigurationEditor.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Printing/PrintingJobConfigurationEditor.js diff --git a/src/frontend/js/Components/Printing/PrintingJobConfigurationEditorComponent.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Printing/PrintingJobConfigurationEditorComponent.js diff --git a/src/frontend/js/Components/Printing/PrintingJobConfigurationGrid.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Printing/PrintingJobConfigurationGrid.js diff --git a/src/frontend/js/Components/Printing/PrintingWindow.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Printing/PrintingWindow.js diff --git a/src/frontend/js/Components/Project/ProjectAttachmentGrid.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Project/ProjectAttachmentGrid.js diff --git a/src/frontend/js/Components/Project/ProjectEditor.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Project/ProjectEditor.js diff --git a/src/frontend/js/Components/Project/ProjectEditorComponent.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Project/ProjectEditorComponent.js diff --git a/src/frontend/js/Components/Project/ProjectGrid.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Project/ProjectGrid.js diff --git a/src/frontend/js/Components/Project/ProjectPartGrid.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Project/ProjectPartGrid.js diff --git a/src/frontend/js/Components/Project/ProjectReport.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Project/ProjectReport.js diff --git a/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Session/SessionManager.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Session/SessionManager.js @@ -0,0 +1,95 @@ +/** + * Represents a session against the PartKeepr Server. + */ +Ext.define("PartKeepr.SessionManager", { + extend: 'Ext.util.Observable', + + /** + * Holds the current session ID, or null if no session is active + * + * @var string + */ + session: null, + + /** + * Holds an instance of the login dialog, or "null" if no login dialog is active. + * + * @var object + */ + loginDialog: null, + + + /** + * Constructs a new SessionManager. + * + * @param config Optional: Specifies a configuration object + */ + constructor: function(config){ + this.callParent(arguments); + }, + /** + * Creates and shows the login dialog, as well as setting up any event handlers. + */ + login: function (username, password) { + this.loginDialog = Ext.create("PartKeepr.LoginDialog"); + + if (username && password) { + this.onLogin(username, password); + } else { + this.loginDialog.on("login", this.onLogin, this); + this.loginDialog.show(); + } + }, + /** + * Removes the current session. + */ + logout: function () { + this.session = null; + }, + /** + * Callback from the login dialog when the "login" button was clicked. + * + * @param username The username, as entered in the login dialog + * @param password The password, as entered + */ + onLogin: function (username, password) { + var k = new PartKeepr.ServiceCall("Auth", "login"); + k.setParameter("username", username); + k.setParameter("password", md5(password)); + + k.enableAnonymous(); + k.setHandler(Ext.bind(this.onAfterLogin, this)); + k.doCall(); + }, + /** + * Callback when the service call is complete. + * + * @param response The session ID + */ + onAfterLogin: function (response) { + this.setSession(response.sessionid); + this.loginDialog.destroy(); + + PartKeepr.getApplication().setAdmin(response.admin); + PartKeepr.getApplication().setUsername(response.username); + + PartKeepr.getApplication().setInitialUserPreferences(response.userPreferences); + + this.fireEvent("login"); + + }, + /** + * Sets the session + */ + setSession: function (sessionid) { + this.session = sessionid; + }, + /** + * Returns the current session + * + * @returns the session, or null if no session is available + */ + getSession: function () { + return this.session; + } +});+ \ No newline at end of file diff --git a/src/frontend/js/Components/Statistics/CurrentStatisticsPanel.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Statistics/CurrentStatisticsPanel.js diff --git a/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Statistics/StatisticsChart.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Statistics/StatisticsChart.js @@ -0,0 +1,149 @@ +Ext.define('PartKeepr.StatisticsChart', { + extend: 'Ext.chart.CartesianChart', + 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 23:59:59" + }, + headers: { + session :PartKeepr.getApplication().getSession() + } + }, + autoLoad: false + }); + + this.callParent(); + }, + /** + * Sets the start date for the chart. Does not trigger a reload of the dataset. + * @param date A valid date object + */ + setStart: function (date) { + if (!(date instanceof Date)) { return; } + this.store.getProxy().extraParams.startDateTime = Ext.Date.format(date, "Y-m-d H:i:s"); + }, + /** + * Sets the end date for the chart. Does not trigger a reload of the dataset. + * @param date A valid date object + */ + setEnd: function (date) { + if (!(date instanceof Date)) { return; } + + // Always set the end date to the end of the day + date.setHours(23); + date.setMinutes(59); + date.setSeconds(59); + + 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/PartKeepr/FrontendBundle/Resources/public/js/Components/Statistics/StatisticsChartPanel.js diff --git a/src/frontend/js/Components/Statusbar.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Statusbar.js diff --git a/src/frontend/js/Components/StockReport/AbstractStockHistoryGrid.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/StockReport/AbstractStockHistoryGrid.js diff --git a/src/PartKeepr/FrontendBundle/Resources/public/js/Components/StockReport/StockHistoryGrid.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/StockReport/StockHistoryGrid.js @@ -0,0 +1,40 @@ +/** + * The stock history grid. It shows all stock transactions. + */ +Ext.define('PartKeepr.StockHistoryGrid', { + extend: 'PartKeepr.AbstractStockHistoryGrid', + alias: 'widget.PartStockHistoryGrid', + + pageSize: 25, + + defineColumns: function () { + this.callParent(); + + this.columns.splice(2, 0, { + header: i18n("Part"), + renderer: Ext.util.Format.htmlEncode, + dataIndex: 'part_name', + flex: 1, + minWidth: 200 + }); + + this.columns.splice(3, 0, { + header: i18n("Storage Location"), + renderer: Ext.util.Format.htmlEncode, + dataIndex: 'storageLocation_name', + flex: 1, + minWidth: 200 + }); + }, + initComponent: function () { + this.callParent(); + + this.on("activate", this.onActivate, this); + }, + /** + * Called when the view is activated. + */ + onActivate: function () { + this.store.load(); + } +}); diff --git a/src/frontend/js/Components/StorageLocation/StorageLocationEditor.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/StorageLocation/StorageLocationEditor.js diff --git a/src/frontend/js/Components/StorageLocation/StorageLocationEditorComponent.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/StorageLocation/StorageLocationEditorComponent.js diff --git a/src/frontend/js/Components/StorageLocation/StorageLocationGrid.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/StorageLocation/StorageLocationGrid.js diff --git a/src/frontend/js/Components/StorageLocation/StorageLocationMultiAddDialog.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/StorageLocation/StorageLocationMultiAddDialog.js diff --git a/src/frontend/js/Components/StorageLocation/StorageLocationMultiAddWindow.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/StorageLocation/StorageLocationMultiAddWindow.js diff --git a/src/frontend/js/Components/SystemInformation/SystemInformationGrid.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/SystemInformation/SystemInformationGrid.js diff --git a/src/frontend/js/Components/SystemNotice/SystemNoticeEditor.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/SystemNotice/SystemNoticeEditor.js diff --git a/src/frontend/js/Components/SystemNotice/SystemNoticeEditorComponent.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/SystemNotice/SystemNoticeEditorComponent.js diff --git a/src/frontend/js/Components/SystemNotice/SystemNoticeGrid.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/SystemNotice/SystemNoticeGrid.js diff --git a/src/frontend/js/Components/TimeDisplay.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/TimeDisplay.js diff --git a/src/frontend/js/Components/TipOfTheDay/TipOfTheDayWindow.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/TipOfTheDay/TipOfTheDayWindow.js diff --git a/src/frontend/js/Components/Unit/UnitEditor.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Unit/UnitEditor.js diff --git a/src/frontend/js/Components/Unit/UnitEditorComponent.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Unit/UnitEditorComponent.js diff --git a/src/frontend/js/Components/Unit/UnitGrid.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Unit/UnitGrid.js diff --git a/src/frontend/js/Components/User/Preferences/DisplayPreferencesPanel.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/User/Preferences/DisplayPreferencesPanel.js diff --git a/src/frontend/js/Components/User/Preferences/FormattingPreferences.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/User/Preferences/FormattingPreferences.js diff --git a/src/frontend/js/Components/User/Preferences/StockPreferences.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/User/Preferences/StockPreferences.js diff --git a/src/frontend/js/Components/User/Preferences/TipOfTheDayPreferences.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/User/Preferences/TipOfTheDayPreferences.js diff --git a/src/frontend/js/Components/User/Preferences/UserPasswordChangePanel.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/User/Preferences/UserPasswordChangePanel.js diff --git a/src/frontend/js/Components/User/UserEditor.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/User/UserEditor.js diff --git a/src/frontend/js/Components/User/UserEditorComponent.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/User/UserEditorComponent.js diff --git a/src/frontend/js/Components/User/UserGrid.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/User/UserGrid.js diff --git a/src/frontend/js/Components/User/UserPreferences.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/User/UserPreferences.js diff --git a/src/frontend/js/Components/Widgets/AttachmentGrid.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Widgets/AttachmentGrid.js diff --git a/src/frontend/js/Components/Widgets/CategoryComboBox.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Widgets/CategoryComboBox.js diff --git a/src/frontend/js/Components/Widgets/ConnectionButton.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Widgets/ConnectionButton.js diff --git a/src/frontend/js/Components/Widgets/CurrencyNumberField.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Widgets/CurrencyNumberField.js diff --git a/src/frontend/js/Components/Widgets/DistributorComboBox.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Widgets/DistributorComboBox.js diff --git a/src/frontend/js/Components/Widgets/FadingButton.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Widgets/FadingButton.js diff --git a/src/frontend/js/Components/Widgets/FootprintComboBox.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Widgets/FootprintComboBox.js diff --git a/src/frontend/js/Components/Widgets/ManufacturerComboBox.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Widgets/ManufacturerComboBox.js diff --git a/src/frontend/js/Components/Widgets/PartParameterComboBox.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Widgets/PartParameterComboBox.js diff --git a/src/frontend/js/Components/Widgets/PartUnitComboBox.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Widgets/PartUnitComboBox.js diff --git a/src/frontend/js/Components/Widgets/ReloadableComboBox.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Widgets/ReloadableComboBox.js diff --git a/src/frontend/js/Components/Widgets/RemoteImageField.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Widgets/RemoteImageField.js diff --git a/src/frontend/js/Components/Widgets/RemotePartComboBox.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Widgets/RemotePartComboBox.js diff --git a/src/frontend/js/Components/Widgets/ResistorCalculator.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Widgets/ResistorCalculator.js diff --git a/src/frontend/js/Components/Widgets/SiUnitField.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Widgets/SiUnitField.js diff --git a/src/frontend/js/Components/Widgets/SiUnitList.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Widgets/SiUnitList.js diff --git a/src/frontend/js/Components/Widgets/StorageLocationComboBox.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Widgets/StorageLocationComboBox.js diff --git a/src/frontend/js/Components/Widgets/SystemNoticeButton.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Widgets/SystemNoticeButton.js diff --git a/src/frontend/js/Components/Widgets/UnitComboBox.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Widgets/UnitComboBox.js diff --git a/src/frontend/js/Components/Widgets/UserComboBox.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Widgets/UserComboBox.js diff --git a/src/frontend/js/Components/Widgets/UserPreferenceGrid.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Widgets/UserPreferenceGrid.js diff --git a/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Widgets/WebcamPanel.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Components/Widgets/WebcamPanel.js @@ -0,0 +1,60 @@ +/** + * 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); + + 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/ExceptionWindow.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Dialogs/ExceptionWindow.js diff --git a/src/PartKeepr/FrontendBundle/Resources/public/js/Dialogs/FileUploadDialog.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Dialogs/FileUploadDialog.js @@ -0,0 +1,188 @@ +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.uploadButton = Ext.create("Ext.button.Button", + { + text: i18n('Upload'), + iconCls: 'icon-drive-upload', + width: 120, + handler: Ext.bind(function() { + var form = this.form.getForm(); + + 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) { + var data = Ext.decode(action.response.responseText); + + request = { + response: action.response.responseText + }; + + PartKeepr.ExceptionWindow.showException(data.exception, request); + } + }); + } + }, 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.uploadSizeButton = Ext.create("Ext.button.Button", { + xtype: 'button', + icon: 'resources/fugue-icons/icons/information-frame.png', + handler: this.showUploadSizeInformation, + scope: this + }); + + 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, + { + border: false, + style: 'margin-bottom: 20px;margin-left: 55px;', + layout: { + type: 'hbox', + pack: 'start', + align: 'middle' + }, + items: [ + { + html: sprintf(i18n("Maximum upload size: %s"), PartKeepr.bytesToSize(PartKeepr.getMaxUploadSize())), + style: 'margin-right: 10px;', + border: false + }, + this.uploadSizeButton + ] + }, + this.urlField], + buttons: this.tbButtons + }); + + this.on("beforedestroy", this.onBeforeDestroy, this); + + this.items = this.form; + this.callParent(); + }, + /** + * Displays a little hint regarding the maximum upload size + */ + showUploadSizeInformation: function () { + if (!this.uploadSizeTip) { + this.uploadSizeTip = Ext.create("Ext.tip.ToolTip", { + title: i18n("Upload Size Information"), + anchor: 'left', + width: 350, + height: 132, + autoScroll: true, + target: this.uploadSizeButton.getEl(), + closable: true, + html: i18n("The maximum upload size can be configured in your php.ini file. There are two separate options:<br/>- post_max_size<br/>- upload_max_filesize<br/><br/>You need to set both values high enough.")+ + '<br/><br/><a target="_blank" href="http://de2.php.net/manual/en/ini.core.php#ini.post-max-size">'+i18n("More Information")+'</a>', + autoHide: false + }); + } + + + this.uploadSizeTip.show(); + }, + /** + * Shows a tooltip for all available image formats. + */ + showAvailableFormats: function () { + if (!this.imageFormatsTip) { + this.imageFormatsTip = 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.imageFormatsTip.show(); + }, + onBeforeDestroy: function () { + if (this.imageFormatsTip) { + this.imageFormatsTip.destroy(); + } + + if (this.uploadSizeTip) { + this.uploadSizeTip.destroy(); + } + } +}); diff --git a/src/frontend/js/Dialogs/RememberChoiceMessageBox.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Dialogs/RememberChoiceMessageBox.js diff --git a/src/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux.Wizard.Card.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux.Wizard.Card.js @@ -0,0 +1,233 @@ +/** + * Licensed under GNU LESSER GENERAL PUBLIC LICENSE Version 3 + * + * @author Thorsten Suckow-Homberg <ts@siteartwork.de> + * @url http://www.siteartwork.de/wizardcomponent + */ + +/** + * @class Ext.ux.Wiz.Card + * @extends Ext.FormPanel + * + * A specific {@link Ext.FormPanel} that can be used as a card in a + * {@link Ext.ux.Wiz}-component. An instance of this card does only work properly + * if used in a panel that uses a {@see Ext.layout.CardLayout}-layout. + * + * @constructor + * @param {Object} config The config object + */ +Ext.define('Ext.ux.wizard.Card', { + extend: 'Ext.form.Panel', + cardTitle: '', + cls: 'ux-wiz-card', + + /** + * @cfg {Boolean} header "True" to create the header element. Defaults to + * "false". See {@link Ext.form.FormPanel#header} + */ + header: false, + + /** + * @cfg {Strting} hideMode Hidemode of this component. Defaults to "offsets". + * See {@link Ext.form.FormPanel#hideMode} + */ + hideMode: 'display', + + initComponent: function () { + + this.cardTitle = this.title; + this.title = (this.showTitle ? '<span style="' + this.titleStyle + '" class="' + this.titleCls + '" >' + this.title + '</span>' : ''); + + if (this.showTitle) { + this.header = true; + } + + this.dockedItems = [{ + xtype: 'container', + xtype: 'toolbar', + dock: 'bottom', + ui: 'footer', + layout: { + type: 'hbox', + align: 'middle' + }, + padding: '10 10 5', + + items: [{ + xtype: 'component', + // id: 'formErrorState', + errorpanel: true, + baseCls: 'form-error-state', + flex: 1, + validText: this.validText, + invalidText: this.invalidText || 'Error/s detected. Please modify...', + tipTpl: Ext.create('Ext.XTemplate', '<ul><tpl for="."><li><span class="field-name">{name}</span>: <span class="error">{error}</span></li></tpl></ul>'), + + getTip: function () { + var tip = this.tip; + if (!tip) { + tip = this.tip = Ext.widget('tooltip', { + target: this.el, + title: 'Error Details:', + autoHide: true, + anchor: 'top', + mouseOffset: [-11, -2], + closable: true, + constrainPosition: false, + cls: 'errors-tip' + }); + tip.show(); + } + return tip; + }, + + setErrors: function (errors) { + var me = this, + baseCls = me.baseCls, + tip = me.getTip(); + + errors = Ext.Array.from(errors); + + // Update CSS class and tooltip content + if (errors.length) { + me.addCls(baseCls + '-invalid'); + me.removeCls(baseCls + '-valid'); + me.update(me.invalidText); + tip.setDisabled(false); + tip.update(me.tipTpl.apply(errors)); + tip.show(); + } else { + me.addCls(baseCls + '-valid'); + me.removeCls(baseCls + '-invalid'); + me.update(me.validText); + tip.setDisabled(true); + tip.hide(); + } + } + }] + }]; + + this.callParent(); + + }, + + // -------- helper + isValid: function () { + + return !this.getForm().isDirty(); + }, + + // -------- overrides + + /** + * Overrides parent implementation since we allow to add any element + * in this component which must not be neccessarily be a form-element. + * So before a call to "isValid()" is about to be made, this implementation + * checks first if the specific item sitting in this component has a method "isValid" - if it + * does not exists, it will be added on the fly. + */ + bindHandler: function () { + + Ext.each(this.form.items, function (f) { + if (!f.isValid) { + f.isValid = Ext.emptyFn; + } + }); + }, + + /* + * Listen for validity change on the entire form and update the combined error icon + */ + listeners: { + fieldvaliditychange: function () { + this.updateErrorState(); + }, + fielderrorchange: function () { + this.updateErrorState(); + } + }, + + updateErrorState: function () { + var me = this, + errorCmp, fields, errors; + + if (me.hasBeenDirty || me.getForm().isDirty()) { //prevents showing global error when form first loads + errorCmp = me.down('component[errorpanel]'); + fields = me.getForm().getFields(); + errors = []; + fields.each(function (field) { + Ext.Array.forEach(field.getErrors(), function (error) { + errors.push({ name: field.getFieldLabel(), error: error }); + }); + }); + errorCmp.setErrors(errors); + me.hasBeenDirty = true; + } + }, + + /** + * Overrides parent implementation. This is needed because in case + * this method uses "monitorValid=true", the method "startMonitoring" must + * not be called, until the "show"-event of this card fires. + */ + initEvents: function () { + var old = this.monitorValid; + this.monitorValid = false; + this.callParent(); + this.monitorValid = old; + }, + + // -------- listener + /** + * Checks wether the beforecardhide-event may be triggered. + */ + bubbleBeforeHideEvent: function () { + var ly = this.ownerCt.layout; + var activeItem = ly.activeItem; + + if (activeItem && activeItem.id === this.id) { + //return this.fireEvent('beforedeactivate', this); + } + + return true; + }, + + /** + * Stops monitoring the form elements in this component when the + * 'hide'-event gets fired. + */ + onCardHide: function () { + if (this.monitorValid) { + this.stopMonitoring(); + } + }, + + /** + * Starts monitoring the form elements in this component when the + * 'show'-event gets fired. + */ + onCardShow: function () { + if (this.monitorValid) { + this.startMonitoring(); + } + }, + + + /** + * startMonitoring he form elements + * + */ + startMonitoring: function () { + this.startPolling(); + }, + + + /** + * startMonitoring he form elements + * + */ + stopMonitoring: function () { + this.stopPolling(); + } + +});+ \ No newline at end of file diff --git a/src/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux.Wizard.CardLayout.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux.Wizard.CardLayout.js @@ -0,0 +1,56 @@ +/** + * Licensed under GNU LESSER GENERAL PUBLIC LICENSE Version 3 + * + * @author Thorsten Suckow-Homberg <ts@siteartwork.de> + * @url http://www.siteartwork.de/cardlayout + */ + +/** + * @class Ext.ux.layout.CardLayout + * @extends Ext.layout.CardLayout + * + * A specific {@link Ext.layout.CardLayout} that only sets the active item + * if the 'beforehide'-method of the card to hide did not return false (in this case, + * components usually won't be hidden). + * The original implementation of {@link Ext.layout.CardLayout} does not take + * the return value of the 'beforehide'-method into account. + * + * @constructor + * @param {Object} config The config object + */ +Ext.define('Ext.ux.wizard.CardLayout', { + + extend: 'Ext.layout.container.Card', + + /** + * Sets the active (visible) item in the layout. + * + * If the currently visible item is still visible after calling the 'hide() + * method on it, this implementation assumes that the 'beforehide'-event returned + * false, thus not the item was not allowed to be hidden. The active item will then + * equal to the item that was active, before this method was called. + * + * @param {String/Number} item The string component id or numeric index of the item to activate + */ + setActiveItem : function(item){ + item = this.container.getComponent(item); + if(this.activeItem != item){ + if(this.activeItem){ + this.activeItem.hide(); + } + // check if the beforehide method allowed to + // hide the current item + if (this.activeItem && !this.activeItem.hidden) { + return; + } + var layout = item.doLayout && (this.layoutOnCardChange || !item.rendered); + this.activeItem = item; + item.show(); + this.layout(); + if(layout){ + item.doLayout(); + } + } + } + +});+ \ No newline at end of file diff --git a/src/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux.Wizard.Header.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux.Wizard.Header.js @@ -0,0 +1,187 @@ +/** + * Licensed under GNU LESSER GENERAL PUBLIC LICENSE Version 3 + * + * @author Thorsten Suckow-Homberg <ts@siteartwork.de> + * @url http://www.siteartwork.de/wizardcomponent + */ + +/** + * @class Ext.ux.Wiz.Header + * @extends Ext.BoxComponent + * + * A specific {@link Ext.BoxComponent} that can be used to show the current process in an + * {@link Ext.ux.Wiz}. + * + * An instance of this class is usually being created by {@link Ext.ux.Wiz#initPanels} using the + * {@link Ext.ux.Wiz#headerConfig}-object. + * + * @private + * @constructor + * @param {Object} config The config object + */ +Ext.define('Ext.ux.wizard.Header', { + extend: 'Ext.container.Container', + alias: 'widget.wizardheader', + + /** + * @cfg {Number} height The height of this component. Defaults to "55". + */ + height: 55, + + /** + * @cfg {String} region The Region of this component. Since a {@link Ext.ux.Wiz} + * usually uses a {@link Ext.layout.BorderLayout}, this property defaults to + * "north". If you want to change this property, you should also change the appropriate + * css-classes that are used for this component. + */ + region: 'north', + + /** + * @cfg {String} title The title that gets rendered in the head of the component. This + * should be a text describing the purpose of the wizard. + */ + title: 'Wizard', + + /** + * @cfg {Number} steps The overall number of steps the user has to go through + * to finish the wizard. + */ + steps: 0, + + /** + * @cfg {String} stepText The text in the header indicating the current process in the wizard. + * (defaults to "Step {0} of {1}: {2}"). + * {0} is replaced with the index (+1) of the current card, {1} is replaced by the + * total number of cards in the wizard and {2} is replaced with the title-property of the + * {@link Ext.ux.Wiz.Card} + * @type String + */ + // stepText: "Step {0} of {1}: {2}", + stepText: '<div class="ext-ux-wiz-Header">' + + ' <div class="ext-ux-wiz-Header-title"></div>' + + ' <div> ' + + ' <div class="ext-ux-wiz-Header-step">Step {0} of {1}: {2} </div>' + + ' <div class="ext-ux-wiz-Header-stepIndicator-container"> ' + + '{stepIndicator}' + + ' </div>' + + ' </div> ' + + '</div>', + + /** + * @cfg {Object} autoEl The element markup used to render this component. + */ + autoEl: { + tag: 'div', + cls: 'ext-ux-wiz-Header', + children: [{ + tag: 'div', + cls: 'ext-ux-wiz-Header-title' + }, { + tag: 'div', + children: [{ + tag: 'div', + cls: 'ext-ux-wiz-Header-step' + }, { + tag: 'div', + cls: 'ext-ux-wiz-Header-stepIndicator-container' + }] + }] + }, + + /** + * @param {Ext.Element} + */ + titleEl: null, + + /** + * @param {Ext.Element} + */ + stepEl: null, + + /** + * @param {Ext.Element} + */ + imageContainer: null, + + /** + * @param {Array} + */ + indicators: null, + + /** + * @param {Ext.Template} + */ + stepTemplate: null, + + /** + * @param {Number} lastActiveStep Stores the index of the last active card that + * was shown- + */ + lastActiveStep: -1, + + // -------- helper + /** + * Gets called by {@link Ext.ux.Wiz#onCardShow()} and updates the header + * with the approppriate information, such as the progress of the wizard + * (i.e. which card is being shown etc.) + * + * @param {Number} currentStep The index of the card currently shown in + * the wizard + * @param {String} title The title-property of the {@link Ext.ux.Wiz.Card} + * + * @private + */ + updateStep: function (currentStep, title) { + var html = this.stepTemplate.apply({ + 0: currentStep + 1, + 1: this.steps, + 2: title, + step: currentStep, + steps: this.steps, + title: title + }); + + this.update(html); + + this.lastActiveStep = currentStep; + }, + + + // -------- listener + /** + * Overrides parent implementation to initComponent this component properly. + */ + initComponent: function () { + this.autoEl.cls = this.autoEl.cls + " " + this.cls; + this.callParent(arguments); + }, + + /** + * Overrides parent implementation to render this component properly. + */ + onRender: function (ct, position) { + + var image = null; + var steptxt = this.stepText.split("{stepIndicator}"); + var stepboxs = "\n"; + + if (steptxt.length > 1) { + for (var i = 0, len = this.steps; i < len; i++) { + stepboxs += '<div class=\'ext-ux-wiz-Header-stepIndicator <tpl if="step == ' + i + '" >ext-ux-wiz-Header-stepIndicator-active</tpl>\'>&#160;</div>\n'; + } + + stepboxs = ('<tpl for=".">' + steptxt[0] + stepboxs + steptxt[1] + '</tpl>'); + + if (this.region == "west" || this.region == "east") { + this.stepText = stepboxs.replace(/Header/gi, "Side"); + } else { + this.stepText = stepboxs; + } + } + + this.stepTemplate = new Ext.XTemplate(this.stepText); + this.stepTemplate.compile(); + + this.callParent(arguments); + } +});+ \ No newline at end of file diff --git a/src/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux.Wizard.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux.Wizard.js @@ -0,0 +1,551 @@ +Ext.define('Ext.ux.Wizard', { + extend: 'Ext.window.Window', + // layout: 'Ext.ux.wizard.CardLayout', + layout: 'fit', + loadMaskConfig: { + 'default': '', + 'saving': 'Saving...', + 'checking': 'Checking...' + }, + autoRender: true, + + /** + * @cfg {Number} height The height of the dialog. Defaults to "400". + */ + height: 650, + + /** + * @cfg {Number} width The width of the dialog. Defaults to "540". + */ + width: 800, + + /** + * @cfg {Boolean} closable Wether the dialog is closable. Defaults to "true". + * This property will be changed by the "switchDialogState"-method, which will + * enable/disable controls based on the passed argument. Thus, this config property + * serves two purposes: Tell the init config to render a "close"-tool, and create a + * "beforeclose"-listener which will either return true or false, indicating if the + * dialog may be closed. + */ + closable: true, + + /** + * @cfg {Boolean} resizable Wether the dialog is resizable. Defaults to "false". + */ + resizable: false, + + /** + * @cfg {Boolean} resizable Wether the dialog is modal. Defaults to "true". + */ + modal: true, + + /** + * @cfg {Array} cards A numeric array with the configured {@link Ext.ux.Wiz.Card}s. + * The index of the cards in the array represent the order in which they get displayed + * in the wizard (i.e. card at index 0 gets displayed in the first step, card at index 1 gets + * displayed in the second step and so on). + */ + cards: [], + + /** + * @cfg {String} previousButtonText The text to render the previous-button with. + * Defaults to "&lt; Back" (< Back) + */ + previousButtonText: '&lt; Previous', + + /** + * @cfg {String} nextButtonText The text to render the next-button with. + * Defaults to "Next &gt;" (Next >) + */ + nextButtonText: 'Next &gt;', + + /** + * @cfg {String} cancelButtonText The text to render the cancel-button with. + * Defaults to "Cancel" + */ + cancelButtonText: 'Cancel', + + /** + * @cfg {String} finishButtonText The text to render the next-button with when the last + * step of the wizard is reached. Defaults to "Finish" + */ + finishButtonText: 'Finish', + + /** + * @cfg {Object} headerConfig A config-object to use with {@link Ext.ux.Wiz.Header}. + * If not present, it defaults to an empty object. + */ + headConfig: null, + + /** + * @cfg {Object} sideConfig A config-object to use with {@link Ext.ux.Wizard}. + * If not present, it defaults to an empty object. + */ + sideConfig: null, + + /** + * @cfg {Object} cardPanelConfig A config-object to use with {@link Ext.Panel}, which + * represents the card-panel in this dialog. + * If not present, it defaults to an empty object + */ + cardPanelConfig: {}, + + /** + * @param {Ext.Button} The window-button for paging to the previous card. + * @private + */ + previousButton: null, + + /** + * @param {Ext.Button} The window-button for paging to the next card. When the + * last card is reached, the event fired by and the text rendered to this button + * will change. + * @private + */ + nextButton: null, + + /** + * @param {Ext.Button} The window-button for canceling the wizard. The event + * fired by this button will usually close the dialog. + * @private + */ + cancelButton: null, + + /** + * @param {Ex.Panel} The card-panel that holds the various wizard cards + * ({@link Ext.ux.Wiz.Card}). The card-panel itself uses the custom + * {@link Ext.ux.layout.CardLayout}, which needs to be accessible by this class. + * You can get it at {@link http://www.siteartwork.de/cardlayout}. + * @private + */ + cardPanel: null, + + /** + * @param {Number} currentCard The current {@link Ext.ux.Wiz.Card} displayed. + * Defaults to 0. + * @private + */ + currentCard: 0, + + /** + * @param {Ext.ux.Wiz.Header} The header-panel of the wizard. + * @private + */ + headPanel: null, + + /** + * @param {Number} cardCount Helper for storing the number of cards used + * by this wizard. Defaults to 0 (inherits "cards.length" later on). + * @private + */ + cardCount: 0, + + /** + * Inits this component with the specified config-properties and automatically + * creates its components. + */ + initComponent: function () { + + var c = this.initialConfig, sregion, hregion; + + if (!this.sideConfig) this.sideConfig = {}; + if (!this.headConfig) this.headConfig = {}; + + if (c.sideConfig && c.sideConfig.position == 'right') { sregion = 'east'; } else { sregion = 'west'; } + if (c.headConfig && c.headConfig.position == 'bottom') { hregion = 'south'; } else { hregion = 'north'; } + + Ext.applyIf(this.cardPanelConfig, { region: 'center', items: (this.cards || [{}]), layout: new Ext.ux.wizard.CardLayout(), border: false, activeItem: 0, baseCls: 'ux-wizard-cardpanel' }); + Ext.applyIf(this.sideConfig, { region: sregion, width: 150, layout: 'fit', xtype: 'wizardheader', headerPosition: 'side', steps: this.cards.length, hidden: !(c.sideConfig) }); + Ext.applyIf(this.headConfig, { region: hregion, height: 150, layout: 'fit', xtype: 'wizardheader', headerPosition: 'top', steps: this.cards.length, hidden: !(c.headConfig) }); + + this.initButtons(); + this.initPanels(); + + var title = this.title || this.headConfig.title; + title = title || ""; + + var items = []; + + items.push(this.sidePanel); + items.push(this.headPanel); + items.push(this.cardPanel); + + Ext.apply(this, { + title: title, + layout: 'border', + cardCount: this.cards.length, + dockedItems: [{ + xtype: 'toolbar', + dock: 'bottom', + ui: 'footer', + defaults: { minWidth: 60 }, + items: [ + { xtype: 'component', flex: 1 }, + this.previousButton, + this.nextButton, + this.cancelButton + ] + }], + items: items + }); + + this.callParent(); + }, + + // -------- helper + /** + * Returns the form-data of all cards in this wizard. The first index is the + * id of the card in this wizard, + * and the values are objects containing key/value pairs in the form of + * fieldName : fieldValue. + * + * @return {Array} + */ + getWizardData: function () { + var formValues = {}; + var cards = this.cards; + for (var i = 0, len = cards.length; i < len; i++) { + if (cards[i].form) { + formValues[cards[i].id] = cards[i].form.getValues(false); + } else { + formValues[cards[i].id] = {}; + } + } + + return formValues; + }, + + /** + * Switches the state of this wizard between disabled/enabled. + * A disabled dialog will have a {@link Ext.LoadMask} covering the card-panel + * to prevent user input, and the buttons will be rendered disabled/enabled. + * If the dialog is closable, the close-tool will be masked, too, and the dialog will not + * be closable by clicking the "close" tool. + * + * @param {Boolean} enabled "false" to prevent user input and mask the elements, + * otherwise true. + * @param {String} type The type of msg for the {@Ext.LoadMask} covering + * the cardPanel, as defined in the cfg property "loadMaskConfig" + */ + switchDialogState: function (enabled, type) { + this.showLoadMask(!enabled, type); + + this.previousButton.setDisabled(!enabled); + this.nextButton.setDisabled(!enabled); + this.cancelButton.setDisabled(!enabled); + + var ct = this.tools['close']; + + if (ct) { + switch (enabled) { + case true: + this.tools['close'].unmask(); + break; + + default: + this.tools['close'].mask(); + break; + } + } + + this.closable = enabled; + }, + + /** + * Shows the load mask for this wizard. By default, the cardPanel's body + * will be masked. + * + * @param {Boolean} show true to show the load mask, otherwise false. + * @param {String} type The type of message for the {@Ext.LoadMask} covering + * the cardPanel, as defined in the cfg property "loadMaskConfig" + */ + showLoadMask: function (show, type) { + if (!type) { + type = 'default'; + } + + if (show) { + if (this.loadMask == null) { + this.loadMask = new Ext.LoadMask(this.body); + } + this.loadMask.msg = this.loadMaskConfig[type]; + this.loadMask.show(); + } else { + if (this.loadMask) { + this.loadMask.hide(); + } + } + }, + + + /** + * show the side panel + * + */ + showSidePanel: function () { + this.sidePanel.show(); + }, + + + /** + * show the side panel + * + */ + showHeadPanel: function () { + this.headPanel.show(); + }, + + + /** + * hide the side panel + * + */ + showSidePanel: function () { + this.sidePanel.hide(); + }, + + + /** + * hide the head panel + * + */ + hideHeadPanel: function () { + this.headPanel.hide(); + }, + + + + + /** + * Inits the listener for the various {@link Ext.ux.Wiz.Card}s used + * by this component. + */ + initEvents: function () { + this.callParent(); + + this.on('beforeclose', this.onBeforeClose, this); + }, + + /** + * Creates the head- and the card-panel. + * Be sure to have the custom {@link Ext.ux.layout.CardLayout} available + * in order to make the card-panel work as expected by this component + * ({@link http://www.siteartwork.de/cardlayout}). + */ + initPanels: function () { + var cards = this.cards; + var cardPanelConfig = this.cardPanelConfig; + + Ext.apply(this.headConfig, { + steps: this.cards.length + }); + + this.headPanel = Ext.create('Ext.ux.wizard.Header', this.headConfig); + + this.sidePanel = Ext.create('Ext.ux.wizard.Header', this.sideConfig); + + Ext.apply(cardPanelConfig, { + layout: 'card', // new Ext.ux.wizard.CardLayout(), + items: cards + }); + + Ext.applyIf(cardPanelConfig, { + region: 'center', + border: false, + activeItem: 0 + }); + + // var cards = this.cards; + + for (var i = 0, len = cards.length; i < len; i++) { + cards[i].on('beforeactivate', this.onCardShow, this); + cards[i].on('clientvalidation', this.onClientValidation, this); + } + + this.cardPanel = Ext.create('Ext.panel.Panel', cardPanelConfig); + }, + + /** + * Creates the instances for the the window buttons. + */ + initButtons: function () { + this.previousButton = new Ext.Button({ + text: this.previousButtonText, + id: 'wizard-move-prev', + disabled: true, + minWidth: 75, + handler: this.onPreviousClick, + scope: this + }); + + this.nextButton = new Ext.Button({ + text: this.nextButtonText, + id: 'wizard-move-next', + minWidth: 75, + handler: this.onNextClick, + scope: this + }); + + this.cancelButton = new Ext.Button({ + text: this.cancelButtonText, + handler: this.onCancelClick, + scope: this, + minWidth: 75 + }); + }, + + // -------- listeners + + /** + * Listener for the beforeclose event. + * This listener will return true or false based on the "closable" + * property by this component. This property will be changed by the "switchDialogState" + * method, indicating if there is currently any process running that should prevent + * this dialog from being closed. + * + * @param {Ext.Panel} panel The panel being closed + * + * @return {Boolean} + */ + onBeforeClose: function (panel) { + return this.closable; + }, + + /** + * By default, the card firing this event monitors user input in a frequent + * interval and fires the 'clientvalidation'-event along with it. This listener + * will enable/disable the next/finish-button in accordance with it, based upon + * the parameter isValid. isValid" will be set by the form validation and depends + * on the validators you are using for the different input-elemnts in your form. + * If the card does not contain any forms, this listener will never be called by the + * card itself. + * + * @param {Ext.ux.Wiz.Card} The card that triggered the event. + * @param {Boolean} isValid "true", if the user input was valid, otherwise + * "false" + */ + onClientValidation: function (card, isValid) { + if (!isValid) { + console.log("setting disabled in onClientValidation"); + this.nextButton.setDisabled(true); + } else { + this.nextButton.setDisabled(false); + } + }, + + /** + * Listener for the "show" event of the card that gets shown in the card-panel. + * Renders the next/previous buttons based on the position of the card in the wizard + * and updates the head-panel accordingly. + * + * @param {Ext.ux.Wiz.Card} The card being shown. + */ + onCardShow: function (card) { + var parent = card.ownerCt; + + var items = parent.items; + + for (var i = 0, len = items.length; i < len; i++) { + if (items.get(i).id == card.id) { + break; + } + } + + this.currentCard = i; + this.headPanel.updateStep(i, card.carTitle); + this.sidePanel.updateStep(i, card.carTitle); + + if (i == len - 1) { + this.nextButton.setText(this.finishButtonText); + } else { + this.nextButton.setText(this.nextButtonText); + } + + if (card.isValid()) { + this.nextButton.setDisabled(false); + } + + if (i == 0) { + this.previousButton.setDisabled(true); + } else { + this.previousButton.setDisabled(false); + } + + }, + + + /** + * Fires the 'cancel'-event. Closes this dialog if the return value of the + * listeners does not equal to "false". + */ + onCancelClick: function () { + if (this.fireEvent('cancel', this, this.getWizardData()) !== false) { + this.closable = true; + this.close(); + } + }, + + /** + * Fires the 'finish'-event. Closes this dialog if the return value of the + * listeners does not equal to "false". + */ + onFinish: function () { + if (this.fireEvent('finish', this, this.getWizardData()) !== false) { + this.closable = true; + this.close(); + } + }, + + /** + * Listener for the previous-button. + * Switches to the previous displayed {@link Ext.ux.Wiz.Card}. + */ + onPreviousClick: function (btn) { + if (this.currentCard > 0) { + // this.cardPanel.getLayout().setActiveItem(this.currentCard - 1); + var mywiz = btn.up('panel').cardPanel; + this.navigate(mywiz, 'prev'); + } + }, + + /** + * Listener for the next-button. Switches to the next {@link Ext.ux.Wiz.Card} + * if the 'beforehide'-method of it did not return false. The functionality + * for this is implemented in {@link Ext.ux.layout.CardLayout}, which is needed + * as the layout for the card-panel of this component. + */ + onNextClick: function (btn) { + if (this.currentCard == this.cardCount - 1) { + this.onFinish(); + } else { + // this.cardPanel.getLayout().setActiveItem(this.currentCard + 1); + var p = this.cardPanel.items.items[this.currentCard]; + + if (p) { + f = p.getForm(); + if (f.isValid()) { + this.navigate(btn.up('panel').cardPanel, "next"); + } else { + p.items.items[0].el.frame("#ff0000"); + } + } + } + }, + navigate: function (panel, direction) { + // This routine could contain business logic required to manage the navigation steps. + // It would call setActiveItem as needed, manage navigation button state, handle any + // branching logic that might be required, handle alternate actions like cancellation + // or finalization, etc. A complete wizard implementation could get pretty + // sophisticated depending on the complexity required, and should probably be + // done as a subclass of CardLayout in a real-world implementation. + var layout = panel.getLayout(); + layout[direction](); + Ext.getCmp('wizard-move-prev').setDisabled(!layout.getPrev()); + // Ext.getCmp('wizard-move-next').setDisabled(!layout.getNext()); + }, + afterRender: function () { + this.callParent(); + + var ly = this.cardPanel.getLayout(); + } +});+ \ No newline at end of file diff --git a/src/frontend/js/Ext.ux/ClearableComboBox.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/ClearableComboBox.js diff --git a/src/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/Ext.ux.Exporter/Base64.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/Ext.ux.Exporter/Base64.js @@ -0,0 +1,64 @@ +/** +* +* Base64 encode / decode +* http://www.webtoolkit.info/ +* +**/ + +(function() { + + // private property + var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; + + // private method for UTF-8 encoding + function utf8Encode(string) { + string = string.replace(/\r\n/g,"\n"); + var utftext = ""; + for (var n = 0; n < string.length; n++) { + var c = string.charCodeAt(n); + if (c < 128) { + utftext += String.fromCharCode(c); + } + else if((c > 127) && (c < 2048)) { + utftext += String.fromCharCode((c >> 6) | 192); + utftext += String.fromCharCode((c & 63) | 128); + } + else { + utftext += String.fromCharCode((c >> 12) | 224); + utftext += String.fromCharCode(((c >> 6) & 63) | 128); + utftext += String.fromCharCode((c & 63) | 128); + } + } + return utftext; + } + + Ext.define("Ext.ux.exporter.Base64", { + statics: { + //This was the original line, which tries to use Firefox's built in Base64 encoder, but this kept throwing exceptions.... + // encode : (typeof btoa == 'function') ? function(input) { return btoa(input); } : function (input) { + encode : function (input) { + var output = ""; + var chr1, chr2, chr3, enc1, enc2, enc3, enc4; + var i = 0; + input = utf8Encode(input); + while (i < input.length) { + chr1 = input.charCodeAt(i++); + chr2 = input.charCodeAt(i++); + chr3 = input.charCodeAt(i++); + enc1 = chr1 >> 2; + enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); + enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); + enc4 = chr3 & 63; + if (isNaN(chr2)) { + enc3 = enc4 = 64; + } else if (isNaN(chr3)) { + enc4 = 64; + } + output = output + + keyStr.charAt(enc1) + keyStr.charAt(enc2) + + keyStr.charAt(enc3) + keyStr.charAt(enc4); + } + return output; + }} + }); +})();+ \ No newline at end of file diff --git a/src/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/Ext.ux.Exporter/Button.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/Ext.ux.Exporter/Button.js @@ -0,0 +1,61 @@ +/** + * @class Ext.ux.Exporter.Button + * @extends Ext.Component + * @author Nige White, with modifications from Ed Spencer, with modifications from iwiznia. + * Specialised Button class that allows downloading of data via data: urls. + * Internally, this is just a link. + * Pass it either an Ext.Component subclass with a 'store' property, or just a store or nothing and it will try to grab the first parent of this button that is a grid or tree panel: + * new Ext.ux.Exporter.Button({component: someGrid}); + * new Ext.ux.Exporter.Button({store: someStore}); + * @cfg {Ext.Component} component The component the store is bound to + * @cfg {Ext.data.Store} store The store to export (alternatively, pass a component with a getStore method) + */ +Ext.define("Ext.ux.exporter.Button", { + extend: "Ext.Component", + alias: "widget.exporterbutton", + html: '<p></p>', + config: { + swfPath: '/flash/downloadify.swf', + downloadImage: '/images/ext_reports/download.png', + width: 62, + height: 22, + downloadName: "download" + }, + + constructor: function(config) { + config = config || {}; + + this.initConfig(); + Ext.ux.exporter.Button.superclass.constructor.call(this, config); + + var self = this; + this.on("afterrender", function() { // We wait for the combo to be rendered, so we can look up to grab the component containing it + self.setComponent(self.store || self.component || self.up("gridpanel") || self.up("treepanel"), config); + }); + }, + + setComponent: function(component, config) { + this.component = component; + this.store = !component.is ? component : component.getStore(); // only components or stores, if it doesn't respond to is method, it's a store + this.setDownloadify(config); + }, + + setDownloadify: function(config) { + var self = this; + Downloadify.create(this.el.down('p').id,{ + filename: function() { + return self.getDownloadName() + "." + Ext.ux.exporter.Exporter.getFormatterByName(self.formatter).extension; + }, + data: function() { + return Ext.ux.exporter.Exporter.exportAny(self.component, self.formatter, config); + }, + transparent: false, + swf: this.getSwfPath(), + downloadImage: this.getDownloadImage(), + width: this.getWidth(), + height: this.getHeight(), + transparent: true, + append: false + }); + } +});+ \ No newline at end of file diff --git a/src/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/Ext.ux.Exporter/Exporter.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/Ext.ux.Exporter/Exporter.js @@ -0,0 +1,83 @@ +/** + * @class Ext.ux.Exporter + * @author Ed Spencer (http://edspencer.net), with modifications from iwiznia. + * Class providing a common way of downloading data in .xls or .csv format + */ +Ext.define("Ext.ux.exporter.Exporter", { + uses: [ + "Ext.ux.exporter.Base64", + "Ext.ux.exporter.Button", + "Ext.ux.exporter.csvFormatter.CsvFormatter", + "Ext.ux.exporter.wikiFormatter.WikiFormatter", + "Ext.ux.exporter.excelFormatter.ExcelFormatter" + ], + + statics: { + exportAny: function(component, formatter, config) { + var func = "export"; + if(!component.is) { + func = func + "Store"; + } else if(component.is("gridpanel")) { + func = func + "Grid"; + } else if (component.is("treepanel")) { + func = func + "Tree"; + } else { + func = func + "Store"; + component = component.getStore(); + } + + return this[func](component, this.getFormatterByName(formatter), config); + }, + + /** + * Exports a grid, using the .xls formatter by default + * @param {Ext.grid.GridPanel} grid The grid to export from + * @param {Object} config Optional config settings for the formatter + */ + exportGrid: function(grid, formatter, config) { + config = config || {}; + formatter = this.getFormatterByName(formatter); + + var columns = Ext.Array.filter(grid.columns, function(col) { + return !col.hidden; // && (!col.xtype || col.xtype != "actioncolumn"); + }); + + Ext.applyIf(config, { + title : grid.title, + columns: columns + }); + + return formatter.format(grid.store, config); + }, + + exportStore: function(store, formatter, config) { + config = config || {}; + formatter = this.getFormatterByName(formatter); + + Ext.applyIf(config, { + columns: store.fields ? store.fields.items : store.model.prototype.fields.items + }); + + return formatter.format(store, config); + }, + + exportTree: function(tree, formatter, config) { + config = config || {}; + formatter = this.getFormatterByName(formatter); + + var store = tree.store || config.store; + + Ext.applyIf(config, { + title: tree.title + }); + + return formatter.format(store, config); + }, + + getFormatterByName: function(formatter) { + formatter = formatter ? formatter : "excel"; + formatter = !Ext.isString(formatter) ? formatter : Ext.create("Ext.ux.exporter." + formatter + "Formatter." + Ext.String.capitalize(formatter) + "Formatter"); + return formatter; + } + } +});+ \ No newline at end of file diff --git a/src/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/Ext.ux.Exporter/Ext.ux.Exporter.jsb b/src/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/Ext.ux.Exporter/Ext.ux.Exporter.jsb @@ -0,0 +1,37 @@ +{ + "projectName": "Ext.ux.Exporter", + "packages": [{ + "name": "Ext.ux.Exporter", + "id": "ext-ux-exporter", + "files": [ + {"path": "", "name": "Formatter.js"}, + {"path": "", "name": "Base64.js"}, + {"path": "", "name": "Exporter.js"}, + {"path": "", "name": "Button.js"}, + {"path": "csvFormatter/", "name": "CsvFormatter.js"}, + {"path": "wikiFormatter/", "name": "WikiFormatter.js"}, + {"path": "excelFormatter/", "name": "Cell.js"}, + {"path": "excelFormatter/", "name": "Style.js"}, + {"path": "excelFormatter/", "name": "ExcelFormatter.js"}, + {"path": "excelFormatter/", "name": "Workbook.js"}, + {"path": "excelFormatter/", "name": "Worksheet.js"} + ] + }], + "builds": [ + { + "name": "All", + "target": "Ext.ux.formatter-all.js", + "compress": true, + "packages": [ + "ext-ux-exporter" + ] + }, + { + "name": "Debug", + "target": "Ext.ux.formatter-all-debug.js", + "compress": false, + "packages": [ + "ext-ux-exporter" + ] + }] +}+ \ No newline at end of file diff --git a/src/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/Ext.ux.Exporter/Formatter.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/Ext.ux.Exporter/Formatter.js @@ -0,0 +1,18 @@ +/** + * @class Ext.ux.Exporter.Formatter + * @author Ed Spencer (http://edspencer.net) + * @cfg {Ext.data.Store} store The store to export + */ +Ext.define("Ext.ux.exporter.Formatter", { + /** + * Performs the actual formatting. This must be overridden by a subclass + */ + format: Ext.emptyFn, + constructor: function(config) { + config = config || {}; + + Ext.applyIf(config, { + + }); + } +});+ \ No newline at end of file diff --git a/src/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/Ext.ux.Exporter/README.textile b/src/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/Ext.ux.Exporter/README.textile @@ -0,0 +1,9 @@ +h1. Ext.ux.Exporter + +h2. About + +p. Exporter is a generic export class which takes any Ext.data.Store-based component (e.g. grids and similar) and exports the data in any format. + +p. Exporter works completely client-side. It uses a Formatter class to generate a document (.xls, .csv etc) and then uses the donwloadify library so that the user can view or download it. + +p. Right now, there isn't a readme or example. You can check this post for more info for now: http://www.sencha.com/forum/showthread.php?136598-Export-store-to-Excel diff --git a/src/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/Ext.ux.Exporter/build b/src/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/Ext.ux.Exporter/build @@ -0,0 +1,21 @@ +# This file defines the order in which the plugin files must be loaded. +# It is used by the Ext MVC's ruby plugin builder, which which can be invoked from your application's base directory like this: + +# ruby script/plugin build Exporter + +# This will generate a file named Exporter-all.js in this directory, which is just a concatenation of all the files you list here +# NOTE: This is only used by the plugin builder, not the app itself. You must always ensure that your plugin is compiled to +# Exporter-all.js by some other means if you do not use the plugin builder, as it is that file that will be loaded by your app + +Base64.js + +Exporter.js +Button.js + +Formatter.js + +excelFormatter/ExcelFormatter.js +excelFormatter/Workbook.js +excelFormatter/Worksheet.js +excelFormatter/Cell.js +excelFormatter/Style.js+ \ No newline at end of file diff --git a/src/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/Ext.ux.Exporter/csvFormatter/CsvFormatter.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/Ext.ux.Exporter/csvFormatter/CsvFormatter.js @@ -0,0 +1,112 @@ +/** + * @class Ext.ux.Exporter.CSVFormatter + * @extends Ext.ux.Exporter.Formatter + * Specialised Format class for outputting .csv files + */ +Ext.define("Ext.ux.exporter.csvFormatter.CsvFormatter", { + extend: "Ext.ux.exporter.Formatter", + + /** + * @cfg {String} contentType The content type to use. Defaults to 'data:text/csv;base64,' + */ + contentType: 'data:text/csv;base64,', + + /** + * @cfg {String} separator The separator to use. Defaults to ';' + */ + separator: ";", + + /** + * @cfg {String} extension The extension to use. Defaults to 'csv' + */ + extension: "csv", + + /** + * @cfg {String} lineSeparator The line separator to use. Defaults to "\n" + */ + lineSeparator: "\n", + + /** + * @cfg {Boolean} capitalizeHeaders Capitalizes the header fields. Defaults to false + */ + capitalizeHeaders: false, + + /** + * Formats the store to the CSV format. + * @param store The store to export + * @param config {Object} [config] Config object. Contains the "columns" property, which is an array of field names. + */ + format: function(store, config) { + this.columns = config.columns || (store.fields ? store.fields.items : store.model.prototype.fields.items); + return this.getHeaders() + this.lineSeparator + this.getRows(store); + }, + + /** + * Returns the headers for the specific store. + * + * @param {Object} store The store to process + * @returns {String} The header line + */ + getHeaders: function(store) { + var columns = []; + + Ext.each(this.columns, function(col) { + var title; + if (col.text != undefined) { + title = col.text; + } else if(col.name) { + title = col.name.replace(/_/g, " "); + } else { + title = ""; + } + + if (this.capitalizeHeaders) { + title = Ext.String.capitalize(title); + } + + columns.push(title); + }, this); + + return columns.join(this.separator); + }, + /** + * Returns all rows for the store + * + * @param {Object} store The store to use + * @returns {String} + */ + getRows: function(store) { + var rows = []; + store.each(function(record) { + rows.push(this.getCells(record)); + }, this); + + return rows.join(this.lineSeparator); + }, + /** + * Returns the cells for a specific row + * @param {Object} record The record + * @returns {String} The cells of the record + */ + getCells: function(record) { + var cells = []; + + Ext.each(this.columns, function(col) { + var name = col.name || col.dataIndex; + var value = ""; + + if(typeof name !== 'undefined') { + if (Ext.isFunction(col.renderer)) { + value = col.renderer(record.get(name), null, record); + } else { + value = record.get(name); + } + + value = '"' + value + '"'; + cells.push(value); + } + }); + + return cells.join(this.separator); + } +});+ \ No newline at end of file diff --git a/src/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/Ext.ux.Exporter/download.png b/src/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/Ext.ux.Exporter/download.png Binary files differ. diff --git a/src/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/Ext.ux.Exporter/downloadify.min.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/Ext.ux.Exporter/downloadify.min.js @@ -0,0 +1,3 @@ +/* Downloadify 0.2 (c) 2009 by Douglas Neiner. Licensed under the MIT license */ +/* See http://github.com/dcneiner/Downloadify for license and more info */ +(function(){Downloadify=window.Downloadify={queue:{},uid:new Date().getTime(),getTextForSave:function(a){var b=Downloadify.queue[a];if(b)return b.getData();return""},getFileNameForSave:function(a){var b=Downloadify.queue[a];if(b)return b.getFilename();return""},getDataTypeForSave:function(a){var b=Downloadify.queue[a];if(b)return b.getDataType();return""},saveComplete:function(a){var b=Downloadify.queue[a];if(b)b.complete();return true},saveCancel:function(a){var b=Downloadify.queue[a];if(b)b.cancel();return true},saveError:function(a){var b=Downloadify.queue[a];if(b)b.error();return true},addToQueue:function(a){Downloadify.queue[a.queue_name]=a},getUID:function(a){if(a.id=="")a.id='downloadify_'+Downloadify.uid++;return a.id}};Downloadify.create=function(a,b){var c=(typeof(a)=="string"?document.getElementById(a):a);return new Downloadify.Container(c,b)};Downloadify.Container=function(d,e){var f=this;f.el=d;f.enabled=true;f.dataCallback=null;f.filenameCallback=null;f.data=null;f.filename=null;var g=function(){f.options=e;if(!f.options.append)f.el.innerHTML="";f.flashContainer=document.createElement('span');f.el.appendChild(f.flashContainer);f.queue_name=Downloadify.getUID(f.flashContainer);if(typeof(f.options.filename)==="function")f.filenameCallback=f.options.filename;else if(f.options.filename)f.filename=f.options.filename;if(typeof(f.options.data)==="function")f.dataCallback=f.options.data;else if(f.options.data)f.data=f.options.data;var a={queue_name:f.queue_name,width:f.options.width,height:f.options.height};var b={allowScriptAccess:'always'};var c={id:f.flashContainer.id,name:f.flashContainer.id};if(f.options.enabled===false)f.enabled=false;if(f.options.transparent===true)b.wmode="transparent";if(f.options.downloadImage)a.downloadImage=f.options.downloadImage;swfobject.embedSWF(f.options.swf,f.flashContainer.id,f.options.width,f.options.height,"10",null,a,b,c);Downloadify.addToQueue(f)};f.enable=function(){var a=document.getElementById(f.flashContainer.id);a.setEnabled(true);f.enabled=true};f.disable=function(){var a=document.getElementById(f.flashContainer.id);a.setEnabled(false);f.enabled=false};f.getData=function(){if(!f.enabled)return"";if(f.dataCallback)return f.dataCallback();else if(f.data)return f.data;else return""};f.getFilename=function(){if(f.filenameCallback)return f.filenameCallback();else if(f.filename)return f.filename;else return""};f.getDataType=function(){if(f.options.dataType)return f.options.dataType;return"string"};f.complete=function(){if(typeof(f.options.onComplete)==="function")f.options.onComplete()};f.cancel=function(){if(typeof(f.options.onCancel)==="function")f.options.onCancel()};f.error=function(){if(typeof(f.options.onError)==="function")f.options.onError()};g()};Downloadify.defaultOptions={swf:'media/downloadify.swf',downloadImage:'images/download.png',width:100,height:30,transparent:true,append:false,dataType:"string"}})();if(typeof(jQuery)!="undefined"){(function($){$.fn.downloadify=function(b){return this.each(function(){b=$.extend({},Downloadify.defaultOptions,b);var a=Downloadify.create(this,b);$(this).data('Downloadify',a)})}})(jQuery)};if(typeof(MooTools)!='undefined'){Element.implement({downloadify:function(a){a=$merge(Downloadify.defaultOptions,a);return this.store('Downloadify',Downloadify.create(this,a))}})};+ \ No newline at end of file diff --git a/src/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/Ext.ux.Exporter/downloadify.swf b/src/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/Ext.ux.Exporter/downloadify.swf Binary files differ. diff --git a/src/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/Ext.ux.Exporter/excelFormatter/Cell.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/Ext.ux.Exporter/excelFormatter/Cell.js @@ -0,0 +1,27 @@ +/** + * @class Ext.ux.Exporter.ExcelFormatter.Cell + * @extends Object + * Represents a single cell in a worksheet + */ + +Ext.define("Ext.ux.exporter.excelFormatter.Cell", { + constructor: function(config) { + Ext.applyIf(config, { + type: "String" + }); + + Ext.apply(this, config); + + Ext.ux.exporter.excelFormatter.Cell.superclass.constructor.apply(this, arguments); + }, + + render: function() { + return this.tpl.apply(this); + }, + + tpl: new Ext.XTemplate( + '<ss:Cell ss:StyleID="{style}">', + '<ss:Data ss:Type="{type}"><![CDATA[{value}]]></ss:Data>', + '</ss:Cell>' + ) +});+ \ No newline at end of file diff --git a/src/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/Ext.ux.Exporter/excelFormatter/ExcelFormatter.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/Ext.ux.Exporter/excelFormatter/ExcelFormatter.js @@ -0,0 +1,23 @@ +/** + * @class Ext.ux.Exporter.ExcelFormatter + * @extends Ext.ux.Exporter.Formatter + * Specialised Format class for outputting .xls files + */ +Ext.define("Ext.ux.exporter.excelFormatter.ExcelFormatter", { + extend: "Ext.ux.exporter.Formatter", + uses: [ + "Ext.ux.exporter.excelFormatter.Cell", + "Ext.ux.exporter.excelFormatter.Style", + "Ext.ux.exporter.excelFormatter.Worksheet", + "Ext.ux.exporter.excelFormatter.Workbook" + ], + contentType: 'data:application/vnd.ms-excel;base64,', + extension: "xls", + + format: function(store, config) { + var workbook = new Ext.ux.exporter.excelFormatter.Workbook(config); + workbook.addWorksheet(store, config || {}); + + return workbook.render(); + } +});+ \ No newline at end of file diff --git a/src/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/Ext.ux.Exporter/excelFormatter/Style.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/Ext.ux.Exporter/excelFormatter/Style.js @@ -0,0 +1,101 @@ +/** + * @class Ext.ux.Exporter.ExcelFormatter.Style + * @extends Object + * Represents a style declaration for a Workbook (this is like defining CSS rules). Example: + * + * new Ext.ux.Exporter.ExcelFormatter.Style({ + * attributes: [ + * { + * name: "Alignment", + * properties: [ + * {name: "Vertical", value: "Top"}, + * {name: "WrapText", value: "1"} + * ] + * }, + * { + * name: "Borders", + * children: [ + * name: "Border", + * properties: [ + * {name: "Color", value: "#e4e4e4"}, + * {name: "Weight", value: "1"} + * ] + * ] + * } + * ] + * }) + * + * @cfg {String} id The ID of this style (required) + * @cfg {Array} attributes The attributes for this style + * @cfg {String} parentStyle The (optional parentStyle ID) + */ +Ext.define("Ext.ux.exporter.excelFormatter.Style", { + constructor: function(config) { + config = config || {}; + + Ext.apply(this, config, { + parentStyle: '', + attributes : [] + }); + + Ext.ux.exporter.excelFormatter.Style.superclass.constructor.apply(this, arguments); + + if (this.id == undefined) throw new Error("An ID must be provided to Style"); + + this.preparePropertyStrings(); + }, + + /** + * Iterates over the attributes in this style, and any children they may have, creating property + * strings on each suitable for use in the XTemplate + */ + preparePropertyStrings: function() { + Ext.each(this.attributes, function(attr, index) { + this.attributes[index].propertiesString = this.buildPropertyString(attr); + this.attributes[index].children = attr.children || []; + + Ext.each(attr.children, function(child, childIndex) { + this.attributes[index].children[childIndex].propertiesString = this.buildPropertyString(child); + }, this); + }, this); + }, + + /** + * Builds a concatenated property string for a given attribute, suitable for use in the XTemplate + */ + buildPropertyString: function(attribute) { + var propertiesString = ""; + + Ext.each(attribute.properties || [], function(property) { + propertiesString += Ext.String.format('ss:{0}="{1}" ', property.name, property.value); + }, this); + + return propertiesString; + }, + + render: function() { + return this.tpl.apply(this); + }, + + tpl: new Ext.XTemplate( + '<tpl if="parentStyle.length == 0">', + '<ss:Style ss:ID="{id}">', + '</tpl>', + '<tpl if="parentStyle.length != 0">', + '<ss:Style ss:ID="{id}" ss:Parent="{parentStyle}">', + '</tpl>', + '<tpl for="attributes">', + '<tpl if="children.length == 0">', + '<ss:{name} {propertiesString} />', + '</tpl>', + '<tpl if="children.length > 0">', + '<ss:{name} {propertiesString}>', + '<tpl for="children">', + '<ss:{name} {propertiesString} />', + '</tpl>', + '</ss:{name}>', + '</tpl>', + '</tpl>', + '</ss:Style>' + ) +});+ \ No newline at end of file diff --git a/src/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/Ext.ux.Exporter/excelFormatter/Workbook.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/Ext.ux.Exporter/excelFormatter/Workbook.js @@ -0,0 +1,325 @@ +/** + * @class Ext.ux.Exporter.ExcelFormatter.Workbook + * @extends Object + * Represents an Excel workbook + */ +Ext.define("Ext.ux.exporter.excelFormatter.Workbook", { + + constructor: function(config) { + config = config || {}; + + Ext.apply(this, config, { + /** + * @property title + * @type String + * The title of the workbook (defaults to "Workbook") + */ + title: "Workbook", + + /** + * @property worksheets + * @type Array + * The array of worksheets inside this workbook + */ + worksheets: [], + + /** + * @property compileWorksheets + * @type Array + * Array of all rendered Worksheets + */ + compiledWorksheets: [], + + /** + * @property cellBorderColor + * @type String + * The colour of border to use for each Cell + */ + cellBorderColor: "#e4e4e4", + + /** + * @property styles + * @type Array + * The array of Ext.ux.Exporter.ExcelFormatter.Style objects attached to this workbook + */ + styles: [], + + /** + * @property compiledStyles + * @type Array + * Array of all rendered Ext.ux.Exporter.ExcelFormatter.Style objects for this workbook + */ + compiledStyles: [], + + /** + * @property hasDefaultStyle + * @type Boolean + * True to add the default styling options to all cells (defaults to true) + */ + hasDefaultStyle: true, + + /** + * @property hasStripeStyles + * @type Boolean + * True to add the striping styles (defaults to true) + */ + hasStripeStyles: true, + + windowHeight : 9000, + windowWidth : 50000, + protectStructure: false, + protectWindows : false + }); + + if (this.hasDefaultStyle) this.addDefaultStyle(); + if (this.hasStripeStyles) this.addStripedStyles(); + + this.addTitleStyle(); + this.addHeaderStyle(); + }, + + render: function() { + this.compileStyles(); + this.joinedCompiledStyles = this.compiledStyles.join(""); + + this.compileWorksheets(); + this.joinedWorksheets = this.compiledWorksheets.join(""); + + return this.tpl.apply(this); + }, + + /** + * Adds a worksheet to this workbook based on a store and optional config + * @param {Ext.data.Store} store The store to initialize the worksheet with + * @param {Object} config Optional config object + * @return {Ext.ux.Exporter.ExcelFormatter.Worksheet} The worksheet + */ + addWorksheet: function(store, config) { + var worksheet = new Ext.ux.exporter.excelFormatter.Worksheet(store, config); + + this.worksheets.push(worksheet); + + return worksheet; + }, + + /** + * Adds a new Ext.ux.Exporter.ExcelFormatter.Style to this Workbook + * @param {Object} config The style config, passed to the Style constructor (required) + */ + addStyle: function(config) { + var style = new Ext.ux.exporter.excelFormatter.Style(config || {}); + + this.styles.push(style); + + return style; + }, + + /** + * Compiles each Style attached to this Workbook by rendering it + * @return {Array} The compiled styles array + */ + compileStyles: function() { + this.compiledStyles = []; + + Ext.each(this.styles, function(style) { + this.compiledStyles.push(style.render()); + }, this); + + return this.compiledStyles; + }, + + /** + * Compiles each Worksheet attached to this Workbook by rendering it + * @return {Array} The compiled worksheets array + */ + compileWorksheets: function() { + this.compiledWorksheets = []; + + Ext.each(this.worksheets, function(worksheet) { + this.compiledWorksheets.push(worksheet.render()); + }, this); + + return this.compiledWorksheets; + }, + + tpl: new Ext.XTemplate( + '<?xml version="1.0" encoding="utf-8"?>', + '<ss:Workbook xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:o="urn:schemas-microsoft-com:office:office">', + '<o:DocumentProperties>', + '<o:Title>{title}</o:Title>', + '</o:DocumentProperties>', + '<ss:ExcelWorkbook>', + '<ss:WindowHeight>{windowHeight}</ss:WindowHeight>', + '<ss:WindowWidth>{windowWidth}</ss:WindowWidth>', + '<ss:ProtectStructure>{protectStructure}</ss:ProtectStructure>', + '<ss:ProtectWindows>{protectWindows}</ss:ProtectWindows>', + '</ss:ExcelWorkbook>', + '<ss:Styles>', + '{joinedCompiledStyles}', + '</ss:Styles>', + '{joinedWorksheets}', + '</ss:Workbook>' + ), + + /** + * Adds the default Style to this workbook. This sets the default font face and size, as well as cell borders + */ + addDefaultStyle: function() { + var borderProperties = [ + {name: "Color", value: this.cellBorderColor}, + {name: "Weight", value: "1"}, + {name: "LineStyle", value: "Continuous"} + ]; + + this.addStyle({ + id: 'Default', + attributes: [ + { + name: "Alignment", + properties: [ + {name: "Vertical", value: "Top"}, + {name: "WrapText", value: "1"} + ] + }, + { + name: "Font", + properties: [ + {name: "FontName", value: "arial"}, + {name: "Size", value: "10"} + ] + }, + {name: "Interior"}, {name: "NumberFormat"}, {name: "Protection"}, + { + name: "Borders", + children: [ + { + name: "Border", + properties: [{name: "Position", value: "Top"}].concat(borderProperties) + }, + { + name: "Border", + properties: [{name: "Position", value: "Bottom"}].concat(borderProperties) + }, + { + name: "Border", + properties: [{name: "Position", value: "Left"}].concat(borderProperties) + }, + { + name: "Border", + properties: [{name: "Position", value: "Right"}].concat(borderProperties) + } + ] + } + ] + }); + }, + + addTitleStyle: function() { + this.addStyle({ + id: "title", + attributes: [ + {name: "Borders"}, + {name: "Font"}, + { + name: "NumberFormat", + properties: [ + {name: "Format", value: "@"} + ] + }, + { + name: "Alignment", + properties: [ + {name: "WrapText", value: "1"}, + {name: "Horizontal", value: "Center"}, + {name: "Vertical", value: "Center"} + ] + } + ] + }); + }, + + addHeaderStyle: function() { + this.addStyle({ + id: "headercell", + attributes: [ + { + name: "Font", + properties: [ + {name: "Bold", value: "1"}, + {name: "Size", value: "10"} + ] + }, + { + name: "Interior", + properties: [ + {name: "Pattern", value: "Solid"}, + {name: "Color", value: "#A3C9F1"} + ] + }, + { + name: "Alignment", + properties: [ + {name: "WrapText", value: "1"}, + {name: "Horizontal", value: "Center"} + ] + } + ] + }); + }, + + /** + * Adds the default striping styles to this workbook + */ + addStripedStyles: function() { + this.addStyle({ + id: "even", + attributes: [ + { + name: "Interior", + properties: [ + {name: "Pattern", value: "Solid"}, + {name: "Color", value: "#CCFFFF"} + ] + } + ] + }); + + this.addStyle({ + id: "odd", + attributes: [ + { + name: "Interior", + properties: [ + {name: "Pattern", value: "Solid"}, + {name: "Color", value: "#CCCCFF"} + ] + } + ] + }); + + Ext.each(['even', 'odd'], function(parentStyle) { + this.addChildNumberFormatStyle(parentStyle, parentStyle + 'date', "[ENG][$-409]dd\-mmm\-yyyy;@"); + this.addChildNumberFormatStyle(parentStyle, parentStyle + 'int', "0"); + this.addChildNumberFormatStyle(parentStyle, parentStyle + 'float', "0.00"); + }, this); + }, + + /** + * Private convenience function to easily add a NumberFormat style for a given parentStyle + * @param {String} parentStyle The ID of the parentStyle Style + * @param {String} id The ID of the new style + * @param {String} value The value of the NumberFormat's Format property + */ + addChildNumberFormatStyle: function(parentStyle, id, value) { + this.addStyle({ + id: id, + parentStyle: "even", + attributes: [ + { + name: "NumberFormat", + properties: [{name: "Format", value: value}] + } + ] + }); + } +});+ \ No newline at end of file diff --git a/src/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/Ext.ux.Exporter/excelFormatter/Worksheet.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/Ext.ux.Exporter/excelFormatter/Worksheet.js @@ -0,0 +1,183 @@ +/** + * @class Ext.ux.Exporter.ExcelFormatter.Worksheet + * @extends Object + * Represents an Excel worksheet + * @cfg {Ext.data.Store} store The store to use (required) + */ +Ext.define("Ext.ux.exporter.excelFormatter.Worksheet", { + + constructor: function(store, config) { + config = config || {}; + + this.store = store; + + Ext.applyIf(config, { + hasTitle : true, + hasHeadings: true, + stripeRows : true, + + title : "Workbook", + columns : store.fields == undefined ? {} : store.fields.items + }); + + Ext.apply(this, config); + + Ext.ux.exporter.excelFormatter.Worksheet.superclass.constructor.apply(this, arguments); + }, + + /** + * @property dateFormatString + * @type String + * String used to format dates (defaults to "Y-m-d"). All other data types are left unmolested + */ + dateFormatString: "Y-m-d", + + worksheetTpl: new Ext.XTemplate( + '<ss:Worksheet ss:Name="{title}">', + '<ss:Names>', + '<ss:NamedRange ss:Name="Print_Titles" ss:RefersTo="=\'{title}\'!R1:R2" />', + '</ss:Names>', + '<ss:Table x:FullRows="1" x:FullColumns="1" ss:ExpandedColumnCount="{colCount}" ss:ExpandedRowCount="{rowCount}">', + '{columns}', + '<ss:Row ss:Height="38">', + '<ss:Cell ss:StyleID="title" ss:MergeAcross="{colCount - 1}">', + '<ss:Data xmlns:html="http://www.w3.org/TR/REC-html40" ss:Type="String">', + '<html:B><html:U><html:Font html:Size="15">{title}', + '</html:Font></html:U></html:B></ss:Data><ss:NamedCell ss:Name="Print_Titles" />', + '</ss:Cell>', + '</ss:Row>', + '<ss:Row ss:AutoFitHeight="1">', + '{header}', + '</ss:Row>', + '{rows}', + '</ss:Table>', + '<x:WorksheetOptions>', + '<x:PageSetup>', + '<x:Layout x:CenterHorizontal="1" x:Orientation="Landscape" />', + '<x:Footer x:Data="Page &amp;P of &amp;N" x:Margin="0.5" />', + '<x:PageMargins x:Top="0.5" x:Right="0.5" x:Left="0.5" x:Bottom="0.8" />', + '</x:PageSetup>', + '<x:FitToPage />', + '<x:Print>', + '<x:PrintErrors>Blank</x:PrintErrors>', + '<x:FitWidth>1</x:FitWidth>', + '<x:FitHeight>32767</x:FitHeight>', + '<x:ValidPrinterInfo />', + '<x:VerticalResolution>600</x:VerticalResolution>', + '</x:Print>', + '<x:Selected />', + '<x:DoNotDisplayGridlines />', + '<x:ProtectObjects>False</x:ProtectObjects>', + '<x:ProtectScenarios>False</x:ProtectScenarios>', + '</x:WorksheetOptions>', + '</ss:Worksheet>' + ), + + /** + * Builds the Worksheet XML + * @param {Ext.data.Store} store The store to build from + */ + render: function(store) { + return this.worksheetTpl.apply({ + header : this.buildHeader(), + columns : this.buildColumns().join(""), + rows : this.buildRows().join(""), + colCount: this.columns.length, + rowCount: this.store.getCount() + 2, + title : this.title + }); + }, + + buildColumns: function() { + var cols = []; + + Ext.each(this.columns, function(column) { + cols.push(this.buildColumn()); + }, this); + + return cols; + }, + + buildColumn: function(width) { + return Ext.String.format('<ss:Column ss:AutoFitWidth="1" ss:Width="{0}" />', width || 164); + }, + + buildRows: function() { + var rows = []; + + this.store.each(function(record, index) { + rows.push(this.buildRow(record, index)); + }, this); + + return rows; + }, + + buildHeader: function() { + var cells = []; + + Ext.each(this.columns, function(col) { + var title; + + //if(col.dataIndex) { + if (col.text != undefined) { + title = col.text; + } else if(col.name) { + //make columns taken from Record fields (e.g. with a col.name) human-readable + title = col.name.replace(/_/g, " "); + title = Ext.String.capitalize(title); + } + + cells.push(Ext.String.format('<ss:Cell ss:StyleID="headercell"><ss:Data ss:Type="String">{0}</ss:Data><ss:NamedCell ss:Name="Print_Titles" /></ss:Cell>', title)); + //} + }, this); + + return cells.join(""); + }, + + buildRow: function(record, index) { + var style, + cells = []; + if (this.stripeRows === true) style = index % 2 == 0 ? 'even' : 'odd'; + + Ext.each(this.columns, function(col) { + var name = col.name || col.dataIndex; + + if(typeof name !== 'undefined') { + //if given a renderer via a ColumnModel, use it and ensure data type is set to String + if (Ext.isFunction(col.renderer)) { + var value = col.renderer(record.get(name), null, record), + type = "String"; + } else { + var value = record.get(name), + type = this.typeMappings[col.type || record.fields.get(name).type.type]; + } + + cells.push(this.buildCell(value, type, style).render()); + } + }, this); + + return Ext.String.format("<ss:Row>{0}</ss:Row>", cells.join("")); + }, + + buildCell: function(value, type, style) { + if (type == "DateTime" && Ext.isFunction(value.format)) value = value.format(this.dateFormatString); + + return new Ext.ux.exporter.excelFormatter.Cell({ + value: value, + type : type, + style: style + }); + }, + + /** + * @property typeMappings + * @type Object + * Mappings from Ext.data.Record types to Excel types + */ + typeMappings: { + 'int' : "Number", + 'string': "String", + 'float' : "Number", + 'date' : "DateTime" + } +});+ \ No newline at end of file diff --git a/src/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/Ext.ux.Exporter/wikiFormatter/WikiFormatter.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/Ext.ux.Exporter/wikiFormatter/WikiFormatter.js @@ -0,0 +1,115 @@ +/** + * @class Ext.ux.Exporter.WikiFormatter + * @extends Ext.ux.Exporter.Formatter + * Specialised Format class for outputting mediawiki tables + */ +Ext.define("Ext.ux.exporter.wikiFormatter.WikiFormatter", { + extend: "Ext.ux.exporter.Formatter", + + /** + * @cfg {String} contentType The content type to use. Defaults to 'data:text/plain;base64,' + */ + contentType: 'data:text/plain;base64,', + + /** + * @cfg {String} cls The table class. Defaults to "wikitable" + */ + cls: "wikitable", + + /** + * @cfg {String} extension The extension to use. Defaults to 'txt' + */ + extension: "txt", + + /** + * @cfg {String} lineSeparator The line separator to use. Defaults to "\n" + */ + lineSeparator: "\n", + + /** + * @cfg {Boolean} capitalizeHeaders Capitalizes the header fields. Defaults to false + */ + capitalizeHeaders: false, + + /** + * Formats the store to the wiki table format. + * @param store The store to export + * @param config {Object} [config] Config object. Contains the "columns" property, which is an array of field names. + */ + format: function(store, config) { + this.columns = config.columns || (store.fields ? store.fields.items : store.model.prototype.fields.items); + return "{|" + this.getHeaders() + this.lineSeparator + + this.getRows(store) + this.lineSeparator + "|}"; + }, + + /** + * Returns the headers for the specific store. + * + * @param {Object} store The store to process + * @returns {String} The header line + */ + getHeaders: function(store) { + var columns = []; + + Ext.each(this.columns, function(col) { + var title; + if (col.text != undefined) { + title = col.text; + } else if(col.name) { + title = col.name.replace(/_/g, " "); + } else { + title = ""; + } + + if (this.capitalizeHeaders) { + title = Ext.String.capitalize(title); + } + + columns.push("! " + title); + }, this); + + var retVal = ' class="'+ this.cls + '" valign="top"' + this.lineSeparator; + retVal += columns.join(this.lineSeparator); + + return retVal; + }, + /** + * Returns all rows for the store + * + * @param {Object} store The store to use + * @returns {String} + */ + getRows: function(store) { + var rows = []; + store.each(function(record) { + rows.push("|-" + this.lineSeparator + this.getCells(record)); + }, this); + + return rows.join(this.lineSeparator); + }, + /** + * Returns the cells for a specific row + * @param {Object} record The record + * @returns {String} The cells of the record + */ + getCells: function(record) { + var cells = []; + + Ext.each(this.columns, function(col) { + var name = col.name || col.dataIndex; + var value = ""; + + if(typeof name !== 'undefined') { + if (Ext.isFunction(col.renderer)) { + value = col.renderer(record.get(name), null, record); + } else { + value = record.get(name); + } + + cells.push("| " + value); + } + }); + + return cells.join(this.lineSeparator); + } +});+ \ No newline at end of file diff --git a/src/frontend/js/Ext.ux/Iframe.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/Iframe.js diff --git a/src/frontend/js/Ext.ux/NumericField.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/NumericField.js diff --git a/src/frontend/js/Ext.ux/SearchField.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Ext.ux/SearchField.js diff --git a/src/frontend/js/ExtJS/Bugfixes/Ext.panel.Table-scrollDelta.js b/src/PartKeepr/FrontendBundle/Resources/public/js/ExtJS/Bugfixes/Ext.panel.Table-scrollDelta.js diff --git a/src/frontend/js/ExtJS/Bugfixes/Ext.selection.RowModel-EXTJSIV-4312.js b/src/PartKeepr/FrontendBundle/Resources/public/js/ExtJS/Bugfixes/Ext.selection.RowModel-EXTJSIV-4312.js diff --git a/src/frontend/js/ExtJS/Enhancements/Ext.data.Connection-sessionInjection.js b/src/PartKeepr/FrontendBundle/Resources/public/js/ExtJS/Enhancements/Ext.data.Connection-sessionInjection.js diff --git a/src/frontend/js/ExtJS/Enhancements/Ext.data.Model-setDataWithAssociations.js b/src/PartKeepr/FrontendBundle/Resources/public/js/ExtJS/Enhancements/Ext.data.Model-setDataWithAssociations.js diff --git a/src/frontend/js/ExtJS/Enhancements/Ext.data.reader.Json-exceptionHandling.js b/src/PartKeepr/FrontendBundle/Resources/public/js/ExtJS/Enhancements/Ext.data.reader.Json-exceptionHandling.js diff --git a/src/frontend/js/ExtJS/Enhancements/Ext.form.field.Trigger-themeAdjustment.js b/src/PartKeepr/FrontendBundle/Resources/public/js/ExtJS/Enhancements/Ext.form.field.Trigger-themeAdjustment.js diff --git a/src/frontend/js/ExtJS/Enhancements/Ext.grid.Column-injectDefaultRenderer.js b/src/PartKeepr/FrontendBundle/Resources/public/js/ExtJS/Enhancements/Ext.grid.Column-injectDefaultRenderer.js diff --git a/src/frontend/js/ExtJS/Enhancements/Ext.grid.feature.Grouping.expandCollapseAll.js b/src/PartKeepr/FrontendBundle/Resources/public/js/ExtJS/Enhancements/Ext.grid.feature.Grouping.expandCollapseAll.js diff --git a/src/frontend/js/ExtJS/Enhancements/Ext.input.CharContextMenu.js b/src/PartKeepr/FrontendBundle/Resources/public/js/ExtJS/Enhancements/Ext.input.CharContextMenu.js diff --git a/src/frontend/js/ExtJS/Enhancements/Ext.layout.component.field.Trigger-theme.js b/src/PartKeepr/FrontendBundle/Resources/public/js/ExtJS/Enhancements/Ext.layout.component.field.Trigger-theme.js diff --git a/src/frontend/js/ExtJS/Enhancements/Ext.tree.View-missingMethods.js b/src/PartKeepr/FrontendBundle/Resources/public/js/ExtJS/Enhancements/Ext.tree.View-missingMethods.js diff --git a/src/frontend/js/Models/AbstractCategory.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Models/AbstractCategory.js diff --git a/src/frontend/js/Models/Distributor.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Models/Distributor.js diff --git a/src/frontend/js/Models/Footprint.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Models/Footprint.js diff --git a/src/frontend/js/Models/FootprintAttachment.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Models/FootprintAttachment.js diff --git a/src/frontend/js/Models/FootprintCategory.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Models/FootprintCategory.js diff --git a/src/frontend/js/Models/Manufacturer.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Models/Manufacturer.js diff --git a/src/frontend/js/Models/ManufacturerICLogo.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Models/ManufacturerICLogo.js diff --git a/src/frontend/js/Models/Message.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Models/Message.js diff --git a/src/PartKeepr/FrontendBundle/Resources/public/js/Models/Part.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Models/Part.js @@ -0,0 +1,61 @@ +Ext.define("PartKeepr.Part", { + extend: "Ext.data.Model", + fields: [ + { id: 'id', name: 'id', type: 'int' }, + { name: 'category', type: 'int'}, + { name: 'footprint', type: 'int'}, + { name: 'storageLocation', type: 'int'}, + { name: 'partUnit', type: 'int'}, + { name: 'averagePrice', type: 'float'}, + { name: 'name', type: 'string'}, + { name: 'description', type: 'string'}, + { name: 'comment', type: 'string'}, + { name: 'status', type: 'string'}, + { name: 'stockLevel', type: 'int'}, + { name: 'minStockLevel', type: 'int'}, + { name: 'createDate', type: 'date'}, + { name: 'needsReview', type: 'boolean'}, + { name: 'partCondition', type: 'string'}, + + // Various things that don't belong to the part, but are transmitted anyways to make handling easier + { name: 'initialStockLevel', type: 'int'}, + { name: 'initialStockLevelUser', type: 'int'}, + { name: 'initialStockLevelPrice', type: 'float'}, + { name: 'initialStockLevelPricePerItem', type: 'boolean'}, + { name: 'partUnitName', type: 'string'}, + { name: 'partUnitShortName', type: 'string'}, + + { name: 'footprintName', type: 'string'}, + { name: 'storageLocationName',type: 'string'}, + { name: 'categoryName', type: 'string'}, + { name: 'categoryPath', type: 'string'}, + { name: 'projects', type: 'string'}, + { name: 'internalPartNumber', type: 'string'}, + { name: 'attachmentCount', type: 'int'}, + { + name: 'partUnitDefault', + type: 'boolean', + convert: function (val) { + if (val === "true" || val === "1" || val === true) + { return true; } + else { return false; } + } + } + + ], + belongsTo: [ + { model: 'PartKeepr.StorageLocation', primaryKey: 'id', foreignKey: 'storageLocation'}, + { model: 'PartKeepr.Footprint', primaryKey: 'id', foreignKey: 'footprint'}, + { model: 'PartKeepr.PartCategory', primaryKey: 'id', foreignKey: 'category'} + ], + hasMany: [ + { model: 'PartKeepr.PartDistributor', name: 'distributors'}, + { model: 'PartKeepr.PartManufacturer', name: 'manufacturers'}, + { model: 'PartKeepr.PartParameter', name: 'parameters'}, + { model: 'PartKeepr.PartAttachment', name: 'attachments'} + ], + proxy: PartKeepr.getRESTProxy("Part"), + getRecordName: function () { + return this.get("name"); + } +}); diff --git a/src/frontend/js/Models/PartAttachment.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Models/PartAttachment.js diff --git a/src/frontend/js/Models/PartCategory.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Models/PartCategory.js diff --git a/src/frontend/js/Models/PartDistributor.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Models/PartDistributor.js diff --git a/src/frontend/js/Models/PartManufacturer.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Models/PartManufacturer.js diff --git a/src/frontend/js/Models/PartParameter.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Models/PartParameter.js diff --git a/src/frontend/js/Models/PartUnit.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Models/PartUnit.js diff --git a/src/frontend/js/Models/PrintingPageBasicLayout.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Models/PrintingPageBasicLayout.js diff --git a/src/frontend/js/Models/PrintingPrintingJobConfiguration.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Models/PrintingPrintingJobConfiguration.js diff --git a/src/frontend/js/Models/PrintingRenderer.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Models/PrintingRenderer.js diff --git a/src/frontend/js/Models/PrintingResponse.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Models/PrintingResponse.js diff --git a/src/frontend/js/Models/PrintingType.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Models/PrintingType.js diff --git a/src/frontend/js/Models/Project.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Models/Project.js diff --git a/src/frontend/js/Models/ProjectAttachment.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Models/ProjectAttachment.js diff --git a/src/frontend/js/Models/ProjectPart.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Models/ProjectPart.js diff --git a/src/frontend/js/Models/ProjectReport.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Models/ProjectReport.js diff --git a/src/frontend/js/Models/ProjectReportList.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Models/ProjectReportList.js diff --git a/src/frontend/js/Models/SiPrefix.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Models/SiPrefix.js diff --git a/src/frontend/js/Models/StatisticSample.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Models/StatisticSample.js diff --git a/src/PartKeepr/FrontendBundle/Resources/public/js/Models/StockEntry.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Models/StockEntry.js @@ -0,0 +1,15 @@ +Ext.define("PartKeepr.StockEntry", { + extend: "Ext.data.Model", + fields: [ + { id: 'id', name: 'id', type: 'int' }, + { name: 'username', type: 'string'}, + { name: 'user_id', type: 'int'}, + { name: 'dateTime', type: 'date'}, + { name: 'stockLevel', type: 'int'}, + { name: 'storageLocation_name', type: 'string'}, + { name: 'direction', type: 'string'}, + { name: 'part_name', type: 'string'}, + { name: 'price', type: 'float'}, + { name: 'comment', type: 'string'} + ] +});+ \ No newline at end of file diff --git a/src/frontend/js/Models/StorageLocation.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Models/StorageLocation.js diff --git a/src/frontend/js/Models/SystemInformationRecord.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Models/SystemInformationRecord.js diff --git a/src/frontend/js/Models/SystemNotice.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Models/SystemNotice.js diff --git a/src/frontend/js/Models/TipOfTheDay.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Models/TipOfTheDay.js diff --git a/src/frontend/js/Models/Unit.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Models/Unit.js diff --git a/src/frontend/js/Models/User.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Models/User.js diff --git a/src/frontend/js/Models/UserPreference.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Models/UserPreference.js diff --git a/src/PartKeepr/FrontendBundle/Resources/public/js/PartKeepr.js b/src/PartKeepr/FrontendBundle/Resources/public/js/PartKeepr.js @@ -0,0 +1,670 @@ +Ext.namespace('PartKeepr'); + +PartKeepr.application = null; + +Ext.application({ + name: 'PartKeepr', + launch: function() { + Ext.get("loading").hide(); + Ext.setLocale('en_US'); + + this.createLayout(); + + PartKeepr.application = this; + + // Set static data of the server + PartKeepr.setMaxUploadSize(window.parameters.maxUploadSize); + PartKeepr.setAvailableImageFormats(window.parameters.availableImageFormats); + + this.sessionManager = new PartKeepr.SessionManager(); + + /* Automatic session starting is active. This disables login/logout functionality. */ + if (window.parameters.auto_start_session) { + this.getSessionManager().setSession(window.parameters.auto_start_session); + this.getStatusbar().connectionButton.hide(); + this.setUsername(window.parameters.autoLoginUsername); + this.onLogin(); + } else { + // If auto login is wanted (for e.g. demo systems), put it in here + this.sessionManager.on("login", this.onLogin, this); + + if (window.parameters.autoLoginUsername) { + this.sessionManager.login(window.parameters.autoLoginUsername, window.parameters.autoLoginPassword); + } else { + this.sessionManager.login(); + } + } + + Ext.fly(document.body).on('contextmenu', this.onContextMenu, this); + }, + getPartManager: function () { + return this.partManager; + }, + onContextMenu: function (e, target) { + if (!e.ctrlKey) { + e.preventDefault(); + } + }, + /** + * Handles the login function. Initializes the part manager window, + * enables the menu bar and creates the stores+loads them. + */ + onLogin: function () { + this.createGlobalStores(); + + if (window.parameters.userPreferences) { + PartKeepr.getApplication().setInitialUserPreferences(window.parameters.userPreferences); + } + + if (PartKeepr.initialUserPreferences) { + var records = this.getUserPreferenceStore().getProxy().getReader().read(PartKeepr.initialUserPreferences); + this.getUserPreferenceStore().loadRecords(records.records); + } + + this.reloadStores(); + + this.createPartManager(); + + this.menuBar.enable(); + + this.doSystemStatusCheck(); + this.doUnacknowledgedNoticesCheck(); + + /* Give the user preference stuff enough time to load */ + /* @todo Load user preferences directly on login and not via delayed task */ + this.displayTipWindowTask = new Ext.util.DelayedTask(this.displayTipOfTheDayWindow, this); + this.displayTipWindowTask.delay(100); + + if (window.parameters.motd) { + this.displayMOTD(); + } + + this.setSession(this.getSessionManager().getSession()); + + this.getStatusbar().getConnectionButton().setConnected(); + + }, + /** + * Re-creates the part manager. This is usually called when the "compactLayout" configuration option has been + * changed. + * + * @param none + * @return nothing + */ + recreatePartManager: function () { + this.centerPanel.remove(this.partManager); + this.getPartManager().destroy(); + + this.createPartManager(); + }, + /** + * Creates the part manager. While this is usually only done after login, it can also happen when the user changes + * the "compact" preference. + */ + createPartManager: function () { + this.partManager = Ext.create("PartKeepr.PartManager", { + title: i18n("Part Manager"), + compactLayout: PartKeepr.getApplication().getUserPreference("partkeepr.partmanager.compactlayout", false), + iconCls: 'icon-brick', + closable: false + }); + + this.centerPanel.insert(0, this.partManager); + }, + /** + * Sets the initial user preferences, which are applied into the userPreferenceStore after login. + */ + setInitialUserPreferences: function (obj) { + PartKeepr.initialUserPreferences = obj; + }, + /** + * Displays the tip of the day window. + * + * This method checks if the user has disabled tips, and if so, this method + * avoids showing the window. + */ + displayTipOfTheDayWindow: function () { + if (!this.tipOfTheDayStore._loaded) { + this.displayTipWindowTask.delay(100); + return; + } + + if (PartKeepr.getApplication().getUserPreference("partkeepr.tipoftheday.showtips") !== false) { + var j = Ext.create("PartKeepr.TipOfTheDayWindow"); + + if (j.getLastUnreadTip() !== null) { + j.show(); + } + } + }, + /** + * Displays a message-of-the-day + */ + displayMOTD: function () { + Ext.MessageBox.alert(i18n("Message of the day"), window.parameters.motd); + }, + /** + * Does a schema status call against the PartKeepr installation, in order to verify if the schema is up-to-date. + * + * @param none + * @return nothing + */ + doSystemStatusCheck: function () { + var call = new PartKeepr.ServiceCall("System", "getSystemStatus"); + call.setHandler(Ext.bind(this.onSystemStatusCheck, this)); + call.doCall(); + }, + /** + * Handler for the schema check + * @param data The data returned from the server + */ + onSystemStatusCheck: function (data) { + if (data.data.schemaStatus !== "complete") { + alert(i18n("Your database schema is not up-to-date! Please re-run setup immediately!")); + } + + if (data.data.inactiveCronjobCount > 0) { + alert(i18n("The following cronjobs aren't running:")+"\n\n"+data.data.inactiveCronjobs.join("\n")); + } + }, + /** + * Returns the session manager + * + * @returns SessionManager + */ + getSessionManager: function () { + return this.sessionManager; + }, + /* + * Checks for unacknowledged system notices. Triggers a service call against the server. + * + * Checks if a session is active; otherwise, nothing will happen. + * + * @param none + * @return nothing + */ + doUnacknowledgedNoticesCheck: function () { + if (this.getSessionManager().getSession() !== null) { + var call = new PartKeepr.ServiceCall("SystemNotice", "hasUnacknowledgedNotices"); + + call.setHandler(Ext.bind(this.onUnacknowledgedNoticesCheck, this)); + call.doCall(); + } + }, + /** + * Handler for the unacknowledged system notices check + * @param data The data returned from the server + */ + onUnacknowledgedNoticesCheck: function (data) { + if (data.data.unacknowledgedNotices === true) { + this.statusBar.systemNoticeButton.show(); + } else { + this.statusBar.systemNoticeButton.hide(); + } + + Ext.defer(this.doUnacknowledgedNoticesCheck, 10000, this); + }, + logout: function () { + this.menuBar.disable(); + this.centerPanel.removeAll(true); + this.getSessionManager().logout(); + }, + /** + * Handles a runtime error. + * + * @param error A string indicating which error has occured. + */ + raiseRuntimeError: function (error) { + var exception = { + message: i18n("Runtime Error"), + detail: error + }; + + PartKeepr.ExceptionWindow.showException(exception); + }, + createGlobalStores: function () { + this.footprintStore = Ext.create("Ext.data.Store", + { + model: 'PartKeepr.Footprint', + pageSize: -1, + autoLoad: false + }); + + this.siPrefixStore = Ext.create("Ext.data.Store", + { + model: 'PartKeepr.SiPrefix', + pageSize: -1, + autoLoad: true + }); + + this.distributorStore = Ext.create("Ext.data.Store", + { + model: 'PartKeepr.Distributor', + pageSize: -1, + autoLoad: false + }); + + this.manufacturerStore = Ext.create("Ext.data.Store", + { + model: 'PartKeepr.Manufacturer', + pageSize: -1, + autoLoad: false + }); + + this.partUnitStore = Ext.create("Ext.data.Store", + { + model: 'PartKeepr.PartUnit', + pageSize: -1, + autoLoad: false + }); + + this.unitStore = Ext.create("Ext.data.Store", + { + model: 'PartKeepr.Unit', + pageSize: -1, + autoLoad: false + }); + + this.userStore = Ext.create("Ext.data.Store", + { + model: 'PartKeepr.User', + pageSize: -1, + autoLoad: false + }); + + this.tipOfTheDayStore = Ext.create("Ext.data.Store", + { + model: 'PartKeepr.TipOfTheDay', + pageSize: -1, + autoLoad: true, + listeners: { + scope: this, + load: this.storeLoaded + } + }); + + this.userPreferenceStore = Ext.create("Ext.data.Store", + { + model: 'PartKeepr.UserPreference', + pageSize: -1, + autoLoad: false, + listeners: { + scope: this, + load: this.storeLoaded + } + }); + }, + storeLoaded: function (store) { + store._loaded = true; + }, + setAdmin: function (admin) { + this.admin = admin; + }, + isAdmin: function () { + return this.admin; + }, + getTipOfTheDayStore: function () { + return this.tipOfTheDayStore; + }, + /** + * Queries for a specific user preference. Returns either the value or a default value if + * the preference was not found. + * @param key The key to query + * @param defaultValue A default value to return (optional) + * @returns the key value, or defaultValue if preference key was not found + */ + getUserPreference: function (key, defaultValue) { + var record = this.userPreferenceStore.findRecord("key", key); + + if (record) { + return record.get("value"); + } else { + return (typeof defaultValue == "undefined") ? null : defaultValue; + } + }, + /** + * Sets a specific user preference. Directly commits the change to the server. + * + * @param key The key to set + * @param value The value to set + */ + setUserPreference: function (key, value) { + var record = this.userPreferenceStore.findRecord("key", key); + + if (record) { + record.set("value", value); + } else { + var j = new PartKeepr.UserPreference(); + j.set("key", key); + j.set("value", value); + + this.userPreferenceStore.add(j); + } + + this.userPreferenceStore.sync(); + }, + getUserPreferenceStore: function () { + return this.userPreferenceStore; + }, + getUnitStore: function () { + return this.unitStore; + }, + getPartUnitStore: function () { + return this.partUnitStore; + }, + getFootprintStore: function () { + return this.footprintStore; + }, + getManufacturerStore: function () { + return this.manufacturerStore; + }, + getDistributorStore: function () { + return this.distributorStore; + }, + getDefaultPartUnit: function () { + return this.partUnitStore.findRecord("default", true); + }, + getUserStore: function () { + return this.userStore; + }, + getSiPrefixStore: function () { + return this.siPrefixStore; + }, + /** + * Converts the Character "micro" (µ, available on german keyboards via AltGr+m) to the Character "Mu" (μ). + * + * The standard for Si-Prefixes defines that the "Mu"-character should be used instead of the "micro" character. + * + * Wikipedia Entry for the "Micro" Si Prefix: http://en.wikipedia.org/wiki/Micro- + * + */ + convertMicroToMu: function (value) { + /** + * Since the Si-Prefix for "micro" is μ, but keyboard have "µ" on it + * (note: both chars might look identical, depending on your font), we need + * to convert "µ" (on the keyboard, Unicode U+00B5) to the Mu (U+03BC). + */ + + return str_replace("µ", "μ", value); + }, + /** + * Reload all global stores each 100 seconds. + * + * @todo In the future, it would be nice to trigger a specific + * store reload when something happens. Example: + * + * If the user pulls down the storage location combo box, + * reload it. + * + * YES, this is becoming nasty. We have now 6 stores, each + * reloading every minute. This NEEDS to be fixed soon! + * + */ + reloadStores: function () { + if (this.getSessionManager().getSession()) { + this.footprintStore.load(); + this.manufacturerStore.load(); + this.distributorStore.load(); + this.partUnitStore.load(); + this.unitStore.load(); + this.userStore.load(); + Ext.defer(PartKeepr.getApplication().reloadStores, 100000, this); + } + }, + /** + * Creates the main view of PartKeepr. + */ + createLayout: function () { + + this.statusBar = Ext.create("PartKeepr.Statusbar"); + + this.messageLog = this.createMessageLog(); + + this.centerPanel = Ext.create("Ext.tab.Panel", { + xtype: 'tabpanel', + border: false, + region: 'center', + bodyStyle: 'background:#DBDBDB', + plugins: Ext.create('Ext.ux.TabCloseMenu') + + }); + + this.menuBar = Ext.create("PartKeepr.MenuBar"); + + this.menuBar.disable(); + Ext.create('Ext.container.Viewport', { + layout: 'fit', + items: [{ + xtype: 'panel', + border: false, + layout: 'border', + items: [ + this.centerPanel, + this.messageLog + ], + bbar: this.statusBar, + tbar: this.menuBar + }] + + }); + }, + addItem: function (item) { + this.centerPanel.add(item); + }, + createMessageLog: function () { + return Ext.create("PartKeepr.MessageLog", { + height: 200, + hidden: true, + split: true, + title: i18n("Message Log"), + titleCollapse: true, + collapsible: true, + region: 'south', + listeners: { + beforecollapse: Ext.bind( + function (obj) { + this.hideMessageLog(); + return false; + }, + this) + } + }); + }, + log: function (message) { + this.logMessage(message, "none"); + }, + logMessage: function (message, severity) { + if (message != i18n("Ready.")) { + var r = Ext.ModelManager.create({ + message: message, + severity: severity, + date: new Date() + }, 'PartKeepr.Message'); + + this.messageLog.getStore().add(r); + } + }, + hideMessageLog: function () { + this.messageLog.hide(); + }, + showMessageLog: function () { + this.messageLog.show(); + }, + toggleMessageLog: function () { + if (this.messageLog.isHidden()) { + this.showMessageLog(); + } else { + this.hideMessageLog(); + } + + }, + getStatusbar: function () { + return this.statusBar; + }, + getSession: function () { + return this.getSessionManager().getSession(); + }, + setSession: function (session) { + if (session) { + this.getStatusbar().getConnectionButton().setConnected(); + } else { + this.getStatusbar().getConnectionButton().setDisconnected(); + this.setUsername(""); + } + + }, + /** + * Sets the username. This should only be called from the login dialog. + * + * Also updates the statusbar to reflect the username. + * + * @param {string} username The username to set + */ + setUsername: function (username) { + this.username = username; + this.getStatusbar().setCurrentUser(username); + }, + /** + * Returns the current username + * @returns {string} + */ + getUsername: function () { + return this.username; + }, + formatCurrency: function (value) { + var format = Ext.util.Format; + format.currencyPrecision = PartKeepr.getApplication().getUserPreference("partkeepr.formatting.currency.numdecimals", 2); + format.currencySign = PartKeepr.getApplication().getUserPreference("partkeepr.formatting.currency.symbol", "€"); + format.currencyAtEnd = PartKeepr.getApplication().getUserPreference("partkeepr.formatting.currency.currencySymbolAtEnd", true); + + if (PartKeepr.getApplication().getUserPreference("partkeepr.formatting.currency.thousandsSeparator", true) === true) { + // @todo This is hard-coded for now + format.thousandSeparator = ","; + } else { + format.thousandSeparator = ""; + } + + return format.currency(value); + } +}); + +/** + * <p>This static method returns a REST object definition for use with any models.</p> + * <p>It automatically sets the session (if available) and the prefix for the given REST service.</p> + * @param {string} service The REST service to call. Only use the base name, e.g. "Footprint" instead of "FootprintService". + * @return {Object} The RESTProxy definition +*/ +PartKeepr.getRESTProxy = function (service) { + var request,requestData = {}; + + var obj = { + batchActions: false, + url: PartKeepr.getBasePath()+ '/'+service, + listeners: { + exception: function (proxy, response, operation) { + try { + var data = Ext.decode(response.responseText); + + requestData.method = operation.request.method; + requestData.headers = operation.request.headers; + requestData.jsonData = operation.request.jsonData; + + request = { + request: Ext.encode(requestData), + response: response.responseText + }; + + PartKeepr.ExceptionWindow.showException(data.exception, request); + } catch (ex) { + var exception = { + message: i18n("Critical Error"), + detail: i18n("The server returned a response which we were not able to interpret.") + }; + + + requestData.method = operation.request.method; + requestData.headers = operation.request.headers; + requestData.jsonData = operation.request.jsonData; + + request = { + request: Ext.encode(requestData), + response: response.responseText + }; + + PartKeepr.ExceptionWindow.showException(exception, request); + } + } + }, + reader: { + type: 'json', + rootProperty: 'response.data', + successProperty: "success", + messageProperty: 'message', + totalProperty : 'response.totalCount' + }, + writer: { + type: 'jsonwithassociations' + } + + }; + //Ext.data.AjaxProxy.superclass.constructor.apply(this, arguments); + return new Ext.data.proxy.Rest(obj); +}; + +PartKeepr.getSession = function () { + alert("This should not be called."); + return "hli2ong0ktnise68p9f5nu6nk1"; +}; + +PartKeepr.log = function (message) { + PartKeepr.getApplication().log(message); +}; + +/** + * <p>This static method returns the instance of the application.</p> + * @return {Object} The application +*/ +PartKeepr.getApplication = function () { + return PartKeepr.application; +}; + +PartKeepr.getBasePath = function () { + return "rest.php"; +}; + +PartKeepr.getImagePath = function () { + return "image.php"; +}; + +PartKeepr.setMaxUploadSize = function (size) { + PartKeepr.maxUploadSize = size; +}; + +PartKeepr.getMaxUploadSize = function () { + return PartKeepr.maxUploadSize; +}; + +PartKeepr.bytesToSize = function (bytes) { + var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB']; + if (bytes === 0) return 'n/a'; + var i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024)),10); + return Math.round(bytes / Math.pow(1024, i), 2) + ' ' + sizes[i]; +}; + +PartKeepr.setAvailableImageFormats = function (formats) { + PartKeepr.imageFormats = formats; +}; + +PartKeepr.getAvailableImageFormats = function () { + return PartKeepr.imageFormats; +}; + +PartKeepr.serializeRecords = function (records) { + var finalData = []; + + for (var i=0;i<records.length;i++) { + finalData.push(records[i].data); + } + + return finalData; +}; diff --git a/src/frontend/js/Util/JsonWithAssociationsWriter.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Util/JsonWithAssociationsWriter.js diff --git a/src/frontend/js/Util/ServiceCall.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Util/ServiceCall.js diff --git a/src/frontend/js/Util/i18n.js b/src/PartKeepr/FrontendBundle/Resources/public/js/Util/i18n.js diff --git a/src/frontend/js/compat.js b/src/PartKeepr/FrontendBundle/Resources/public/js/compat.js diff --git a/src/frontend/js/org.jerrymouse.util.locale/locale.js b/src/PartKeepr/FrontendBundle/Resources/public/js/org.jerrymouse.util.locale/locale.js diff --git a/src/PartKeepr/FrontendBundle/Resources/public/js/php.default.min.js b/src/PartKeepr/FrontendBundle/Resources/public/js/php.default.min.js @@ -0,0 +1,821 @@ +/* + * More info at: http://phpjs.org + * + * This is version: 2.4 + * php.js is copyright 2009 Kevin van Zonneveld. + * + * Portions copyright Brett Zamir, Kevin van Zonneveld + * (http://kevin.vanzonneveld.net), Onno Marsman, Michael White + * (http://getsprink.com), Waldo Malqui Silva, Paulo Ricardo F. Santos, Jack, + * Jonas Raoni Soares Silva (http://www.jsfromhell.com), Philip Peterson, + * Legaev Andrey, Ates Goral (http://magnetiq.com), Martijn Wieringa, Nate, + * Philippe Baumann, Enrique Gonzalez, Webtoolkit.info + * (http://www.webtoolkit.info/), Jani Hartikainen, Carlos R. L. Rodrigues + * (http://www.jsfromhell.com), Ash Searle (http://hexmen.com/blog/), Johnny + * Mast (http://www.phpvrouwen.nl), GeekFG (http://geekfg.blogspot.com), + * Erkekjetter, Alex, d3x, marrtins, Andrea Giammarchi + * (http://webreflection.blogspot.com), mdsjack (http://www.mdsjack.bo.it), + * Mirek Slugen, Steven Levithan (http://blog.stevenlevithan.com), Marc Palau, + * Public Domain (http://www.json.org/json2.js), David, Arpad Ray + * (mailto:arpad@php.net), Caio Ariede (http://caioariede.com), Pellentesque + * Malesuada, Sakimori, AJ, Tyler Akins (http://rumkin.com), Thunder.m, Aman + * Gupta, Karol Kowalski, Steve Hilder, Alfonso Jimenez + * (http://www.alfonsojimenez.com), gorthaur, T. Wild, Sanjoy Roy, Felix + * Geisendoerfer (http://www.debuggable.com/felix), 0m3r, kenneth, Hyam Singer + * (http://www.impact-computing.com/), Paul, class_exists, Steve Clay, john + * (http://www.jd-tech.net), ger, marc andreu, nobbler, Douglas Crockford + * (http://javascript.crockford.com), madipta, David James, Subhasis Deb, + * noname, Marco, sankai, Francesco, J A R, Bayron Guevara, T0bsn, Peter-Paul + * Koch (http://www.quirksmode.org/js/beat.html), MeEtc + * (http://yass.meetcweb.com), Pyerre, Jon Hohle, Lincoln Ramsay, djmix, + * Linuxworld, Thiago Mata (http://thiagomata.blog.com), Brad Touesnard, Tim + * Wiel, Der Simon (http://innerdom.sourceforge.net/), Gilbert, LH, Marc + * Jansen, echo is bad, duncan, Bryan Elliott, David Randall, Ozh, XoraX + * (http://www.xorax.info), Francois, Nathan, Bobby Drake, Pul, Eric Nagel, + * rezna, Martin Pool, Kirk Strobeck, Mick@el, Luke Godfrey, Blues + * (http://tech.bluesmoon.info/), YUI Library: + * http://developer.yahoo.com/yui/docs/YAHOO.util.DateLocale.html, Blues at + * http://hacks.bluesmoon.info/strftime/strftime.js, Christian Doebler, + * penutbutterjelly, Anton Ongson, Simon Willison (http://simonwillison.net), + * Gabriel Paderni, Pierre-Luc Paour, Kristof Coomans (SCK-CEN Belgian + * Nucleair Research Centre), hitwork, Norman "zEh" Fuchs, sowberry, Yves + * Sucaet, Nick Callen, ejsanders, johnrembo, dptr1988, Pedro Tainha + * (http://www.pedrotainha.com), uestla, Valentina De Rosa, Saulo Vallory, + * T.Wild, metjay, DxGx, Alexander Ermolaev + * (http://snippets.dzone.com/user/AlexanderErmolaev), ChaosNo1, Andreas, + * Garagoth, Robin, Matt Bradley, taith, FremyCompany, Tod Gentille, Breaking + * Par Consulting Inc + * (http://www.breakingpar.com/bkp/home.nsf/0/87256B280015193F87256CFB006C45F7), + * Josh Fraser + * (http://onlineaspect.com/2007/06/08/auto-detect-a-time-zone-with-javascript/), + * Manish, Cord, ReverseSyntax, Mateusz "loonquawl" Zalega, Arno, Slawomir + * Kaniecki, Scott Cariss, Victor, stensi, Jalal Berrami, baris ozdil, + * FGFEmperor, booeyOH, Cagri Ekin, Ben Bryan, Leslie Hoare, Andrej Pavlovic, + * Dino, mk.keck, Luke Smith (http://lucassmith.name), Rival, jakes, Yannoo, + * gabriel paderni, Atli Þór, Benjamin Lupton, Diogo Resende, Howard Yeend, + * Allan Jensen (http://www.winternet.no) + * + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL KEVIN VAN ZONNEVELD BE LIABLE FOR ANY CLAIM, DAMAGES + * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + + +// Compression: minified + + +function abs(mixed_number){return Math.abs(mixed_number)||0;} +function acos(arg){return Math.acos(arg);} +function acosh(arg){return Math.log(arg+Math.sqrt(arg*arg-1));} +function addslashes(str){return(str+'').replace(/([\\"'])/g,"\\$1").replace(/\0/g,"\\0");} +function array_change_key_case(array){var case_fn,tmp_ar=new Object,argc=arguments.length,argv=arguments,key;if(array instanceof Array){return array;} +if(array instanceof Object){if(argc==1||argv[1]=='CASE_LOWER'||argv[1]==0){case_fn="toLowerCase";}else{case_fn="toUpperCase";} +for(key in array){tmp_ar[key[case_fn]()]=array[key];} +return tmp_ar;} +return false;} +function array_chunk(input,size){for(var x,i=0,c=-1,l=input.length,n=[];i<l;i++){(x=i%size)?n[c][x]=input[i]:n[++c]=[input[i]];} +return n;} +function array_combine(keys,values){var new_array={},keycount=keys.length,i;if(!keys||!values||keys.constructor!==Array||values.constructor!==Array){return false;} +if(keycount!=values.length){return false;} +for(i=0;i<keycount;i++){new_array[keys[i]]=values[i];} +return new_array;} +function array_count_values(array){var tmp_arr={},key='',t='';var __getType=function(obj){var t=typeof obj;t=t.toLowerCase();if(t=="object"){t="array";} +return t;} +var __countValue=function(value){switch(typeof(value)){case"number":if(Math.floor(value)!=value){return;} +case"string":if(value in this){++this[value];}else{this[value]=1;}}};t=__getType(array);if(t=='array'){for(key in array){__countValue.call(tmp_arr,array[key]);}} +return tmp_arr;} +function array_diff(){var arr1=arguments[0],retArr={};var k1='',i=1,k='',arr={};arr1keys:for(k1 in arr1){for(i=1;i<arguments.length;i++){arr=arguments[i];for(k in arr){if(arr[k]===arr1[k1]){continue arr1keys;}} +retArr[k1]=arr1[k1];}} +return retArr;} +function array_diff_assoc(){var arr1=arguments[0],retArr={};var k1='',i=1,k='',arr={};arr1keys:for(k1 in arr1){for(i=1;i<arguments.length;i++){arr=arguments[i];for(k in arr){if(arr[k]===arr1[k1]&&k===k1){continue arr1keys;}} +retArr[k1]=arr1[k1];}} +return retArr;} +function array_diff_key(){var arr1=arguments[0],retArr={};var k1='',i=1,k='',arr={};arr1keys:for(k1 in arr1){for(i=1;i<arguments.length;i++){arr=arguments[i];for(k in arr){if(k===k1){continue arr1keys;}} +retArr[k1]=arr1[k1];}} +return retArr;} +function array_diff_uassoc(){var arr1=arguments[0],retArr={},cb=arguments[arguments.length-1];var arr={},i=1,k1='',k='';cb=(typeof cb==='string')?window[cb]:(cb instanceof Array)?window[cb[0]][cb[1]]:cb;arr1keys:for(k1 in arr1){for(i=1;i<arguments.length-1;i++){arr=arguments[i];for(k in arr){if(arr[k]===arr1[k1]&&cb(k,k1)===0){continue arr1keys;}} +retArr[k1]=arr1[k1];}} +return retArr;} +function array_diff_ukey(){var arr1=arguments[0],retArr={},cb=arguments[arguments.length-1];var arr={},i=1,k1='',k='';cb=(typeof cb==='string')?window[cb]:(cb instanceof Array)?window[cb[0]][cb[1]]:cb;arr1keys:for(k1 in arr1){for(i=1;i<arguments.length-1;i++){arr=arguments[i];for(k in arr){if(cb(k,k1)===0){continue arr1keys;}} +retArr[k1]=arr1[k1];}} +return retArr;} +function array_fill(start_index,num,mixed_val){var key,tmp_arr={};if(!isNaN(start_index)&&!isNaN(num)){for(key=0;key<num;key++){tmp_arr[(key+start_index)]=mixed_val;}} +return tmp_arr;} +function array_fill_keys(keys,value){var retObj={},key='';for(key in keys){retObj[keys[key]]=value;} +return retObj;} +function array_filter(arr,func){var retObj={},k;for(k in arr){if(func(arr[k])){retObj[k]=arr[k];}} +return retObj;} +function array_flip(trans){var key,tmp_ar={};for(key in trans){tmp_ar[trans[key]]=key;} +return tmp_ar;} +function array_intersect(){var arr1=arguments[0],retArr={};var k1='',arr={},i=0,k='';arr1keys:for(k1 in arr1){arrs:for(i=1;i<arguments.length;i++){arr=arguments[i];for(k in arr){if(arr[k]===arr1[k1]){if(i===arguments.length-1){retArr[k1]=arr1[k1];} +continue arrs;}} +continue arr1keys;}} +return retArr;} +function array_intersect_assoc(){var arr1=arguments[0],retArr={};var k1='',arr={},i=0,k='';arr1keys:for(k1 in arr1){arrs:for(i=1;i<arguments.length;i++){arr=arguments[i];for(k in arr){if(arr[k]===arr1[k1]&&k===k1){if(i===arguments.length-1){retArr[k1]=arr1[k1];} +continue arrs;}} +continue arr1keys;}} +return retArr;} +function array_intersect_key(){var arr1=arguments[0],retArr={};var k1='',arr={},i=0,k='';arr1keys:for(k1 in arr1){arrs:for(i=1;i<arguments.length;i++){arr=arguments[i];for(k in arr){if(k===k1){if(i===arguments.length-1){retArr[k1]=arr1[k1];} +continue arrs;}} +continue arr1keys;}} +return retArr;} +function array_intersect_uassoc(){var arr1=arguments[0],retArr={},cb=arguments[arguments.length-1];var k1='',i=1,arr={},k='';cb=(typeof cb==='string')?window[cb]:(cb instanceof Array)?window[cb[0]][cb[1]]:cb;arr1keys:for(k1 in arr1){arrs:for(i=1;i<arguments.length-1;i++){arr=arguments[i];for(k in arr){if(arr[k]===arr1[k1]&&cb(k,k1)===0){if(i===arguments.length-2){retArr[k1]=arr1[k1];} +continue arrs;}} +continue arr1keys;}} +return retArr;} +function array_intersect_ukey(){var arr1=arguments[0],retArr={},cb=arguments[arguments.length-1];var k1='',i=1,arr={},k='';cb=(typeof cb==='string')?window[cb]:(cb instanceof Array)?window[cb[0]][cb[1]]:cb;arr1keys:for(k1 in arr1){arrs:for(i=1;i<arguments.length-1;i++){arr=arguments[i];for(k in arr){if(cb(k,k1)===0){if(i===arguments.length-2){retArr[k1]=arr1[k1];} +continue arrs;}} +continue arr1keys;}} +return retArr;} +function array_key_exists(key,search){if(!search||(search.constructor!==Array&&search.constructor!==Object)){return false;} +return key in search;} +function array_keys(input,search_value,argStrict){var tmp_arr={},strict=!!argStrict,include=true,cnt=0;var key='';for(key in input){include=true;if(search_value!=undefined){if(strict&&input[key]!==search_value){include=false;}else if(input[key]!=search_value){include=false;}} +if(include){tmp_arr[cnt]=key;cnt++;}} +return tmp_arr;} +function array_map(callback){var argc=arguments.length,argv=arguments;var j=argv[1].length,i=0,k=1,m=0;var tmp=[],tmp_ar=[];while(i<j){while(k<argc){tmp[m++]=argv[k++][i];} +m=0;k=1;if(callback){tmp_ar[i++]=callback.apply(null,tmp);}else{tmp_ar[i++]=tmp;} +tmp=[];} +return tmp_ar;} +function array_merge(){var args=Array.prototype.slice.call(arguments);var retObj={},k,j=0,i=0;var retArr;for(i=0,retArr=true;i<args.length;i++){if(!(args[i]instanceof Array)){retArr=false;break;}} +if(retArr){return args;} +var ct=0;for(i=0,ct=0;i<args.length;i++){if(args[i]instanceof Array){for(j=0;j<args[i].length;j++){retObj[ct++]=args[i][j];}}else{for(k in args[i]){if(is_int(k)){retObj[ct++]=args[i][k];}else{retObj[k]=args[i][k];}}}} +return retObj;} +function array_merge_recursive(arr1,arr2){var idx='';if((arr1&&(arr1 instanceof Array))&&(arr2&&(arr2 instanceof Array))){for(idx in arr2){arr1.push(arr2[idx]);}}else if((arr1&&(arr1 instanceof Object))&&(arr2&&(arr2 instanceof Object))){for(idx in arr2){if(idx in arr1){if(typeof arr1[idx]=='object'&&typeof arr2=='object'){arr1[idx]=array_merge(arr1[idx],arr2[idx]);}else{arr1[idx]=arr2[idx];}}else{arr1[idx]=arr2[idx];}}} +return arr1;} +function array_pad(input,pad_size,pad_value){var pad=[],newArray=[],newLength,i=0;if(input instanceof Array&&!isNaN(pad_size)){newLength=((pad_size<0)?(pad_size*-1):pad_size);if(newLength>input.length){for(i=0;i<(newLength-input.length);i++){newArray[i]=pad_value;} +pad=((pad_size<0)?newArray.concat(input):input.concat(newArray));}else{pad=input;}} +return pad;} +function array_pop(array){var key='',cnt=0;if(array.hasOwnProperty('length')){if(!array.length){return null;} +return array.pop();}else{for(key in array){cnt++;} +if(cnt){delete(array[key]);return array[key];}else{return null;}}} +function array_product(input){var Index=0,Product=1;if(input instanceof Array){while(Index<input.length){Product*=(!isNaN(input[Index])?input[Index]:0);Index++;}}else{Product=null;} +return Product;} +function array_push(array){var i,argv=arguments,argc=argv.length;for(i=1;i<argc;i++){array[array.length++]=argv[i];} +return array.length;} +function array_rand(input,num_req){var Indexes=[];var Ticks=num_req||1;var checkDuplicate=function(input,value){var Exist=false,Index=0;while(Index<input.length){if(input[Index]===value){Exist=true;break;} +Index++;} +return Exist;};if(input instanceof Array&&Ticks<=input.length){while(true){var Rand=Math.floor((Math.random()*input.length));if(Indexes.length===Ticks){break;} +if(!checkDuplicate(Indexes,Rand)){Indexes.push(Rand);}}}else{Indexes=null;} +return((Ticks==1)?Indexes.join():Indexes);} +function array_reduce(a_input,callback){var lon=a_input.length;var res=0,i=0;var tmp=[];for(i=0;i<lon;i+=2){tmp[0]=a_input[i];if(a_input[(i+1)]){tmp[1]=a_input[(i+1)];}else{tmp[1]=0;} +res+=callback.apply(null,tmp);tmp=[];} +return res;} +function array_reverse(array,preserve_keys){var arr_len=array.length,newkey=0,tmp_arr={},key='';preserve_keys=!!preserve_keys;for(key in array){newkey=arr_len-key-1;tmp_arr[preserve_keys?key:newkey]=array[key];} +return tmp_arr;} +function array_search(needle,haystack,argStrict){var strict=!!argStrict;var key='';for(key in haystack){if((strict&&haystack[key]===needle)||(!strict&&haystack[key]==needle)){return key;}} +return false;} +function array_shift(array){if(array.length>0){return array.shift();} +return null;} +function array_slice(arr,offst,lgth,preserve_keys){var key='';if(!(arr instanceof Array)||(preserve_keys&&offst!=0)){var lgt=0,newAssoc={};for(key in arr){lgt+=1;newAssoc[key]=arr[key];} +arr=newAssoc;offst=(offst<0)?lgt+offst:offst;lgth=lgth==undefined?lgt:(lgth<0)?lgt+lgth-offst:lgth;var assoc={};var start=false,it=-1,arrlgth=0,no_pk_idx=0;for(key in arr){++it;if(arrlgth>=lgth){break;} +if(it==offst){start=true;} +if(!start){continue;} +++arrlgth;if(is_int(key)&&!preserve_keys){assoc[no_pk_idx++]=arr[key];}else{assoc[key]=arr[key];}} +return assoc;} +if(lgth===undefined){return arr.slice(offst);}else if(lgth>=0){return arr.slice(offst,offst+lgth);}else{return arr.slice(offst,lgth);}} +function array_splice(arr,offst,lgth,replacement){var checkToUpIndices=function(arr,ct,key){if(arr[ct]!==undefined){var tmp=ct;ct+=1;if(ct===key){ct+=1;} +ct=checkToUpIndices(arr,ct,key);arr[ct]=arr[tmp];delete arr[tmp];} +return ct;} +if(replacement&&!(typeof replacement==='object')){replacement=[replacement];} +if(lgth===undefined){lgth=offst>=0?arr.length-offst:-offst;}else if(lgth<0){lgth=(offst>=0?arr.length-offst:-offst)+lgth;} +if(!(arr instanceof Array)){var lgt=0,ct=-1,rmvd=[],rmvdObj={},repl_ct=-1,int_ct=-1;var returnArr=true,rmvd_ct=0,rmvd_lgth=0,key='';for(key in arr){lgt+=1;} +offst=(offst>=0)?offst:lgt+offst;for(key in arr){ct+=1;if(ct<offst){if(is_int(key)){int_ct+=1;if(parseInt(key,10)===int_ct){continue;} +checkToUpIndices(arr,int_ct,key);arr[int_ct]=arr[key];delete arr[key];} +continue;} +if(returnArr&&is_int(key)){rmvd.push(arr[key]);rmvdObj[rmvd_ct++]=arr[key];}else{rmvdObj[key]=arr[key];returnArr=false;} +rmvd_lgth+=1;if(replacement&&replacement[++repl_ct]){arr[key]=replacement[repl_ct]}else{delete arr[key];}} +return returnArr?rmvd:rmvdObj;} +if(replacement){replacement.unshift(offst,lgth);return Array.prototype.splice.apply(arr,replacement);} +return arr.splice(offst,lgth);} +function array_sum(array){var key,sum=0;if(typeof array!=='object'){return null;} +for(key in array){sum+=(array[key]*1);} +return sum;} +function array_udiff(){var arr1=arguments[0],retArr={},cb=arguments[arguments.length-1];var arr='',i=1,k1='',k='';cb=(typeof cb==='string')?window[cb]:(cb instanceof Array)?window[cb[0]][cb[1]]:cb;arr1keys:for(k1 in arr1){for(i=1;i<arguments.length-1;i++){arr=arguments[i];for(k in arr){if(cb(arr[k],arr1[k1])===0){continue arr1keys;}} +retArr[k1]=arr1[k1];}} +return retArr;} +function array_udiff_assoc(){var arr1=arguments[0],retArr={},cb=arguments[arguments.length-1];var arr={},i=1,k1='',k='';cb=(typeof cb==='string')?window[cb]:(cb instanceof Array)?window[cb[0]][cb[1]]:cb;arr1keys:for(k1 in arr1){for(i=1;i<arguments.length-1;i++){arr=arguments[i];for(k in arr){if(cb(arr[k],arr1[k1])===0&&k===k1){continue arr1keys;}} +retArr[k1]=arr1[k1];}} +return retArr;} +function array_udiff_uassoc(){var arr1=arguments[0],retArr={},cb=arguments[arguments.length-1],cb0=arguments[arguments.length-2];var k1='',i=1,k='',arr={};cb=(typeof cb==='string')?window[cb]:(cb instanceof Array)?window[cb[0]][cb[1]]:cb;cb0=(typeof cb0==='string')?window[cb0]:(cb0 instanceof Array)?window[cb0[0]][cb0[1]]:cb0;arr1keys:for(k1 in arr1){for(i=1;i<arguments.length-2;i++){arr=arguments[i];for(k in arr){if(cb0(arr[k],arr1[k1])===0&&cb(k,k1)===0){continue arr1keys;}} +retArr[k1]=arr1[k1];}} +return retArr;} +function array_uintersect(){var arr1=arguments[0],retArr={},cb=arguments[arguments.length-1];var k1='',i=1,arr={},k='';cb=(typeof cb==='string')?window[cb]:(cb instanceof Array)?window[cb[0]][cb[1]]:cb;arr1keys:for(k1 in arr1){arrs:for(i=1;i<arguments.length-1;i++){arr=arguments[i];for(k in arr){if(cb(arr[k],arr1[k1])===0){if(i===arguments.length-2){retArr[k1]=arr1[k1];} +continue arrs;}} +continue arr1keys;}} +return retArr;} +function array_uintersect_assoc(){var arr1=arguments[0],retArr={},cb=arguments[arguments.length-1];var k1='',i=1,arr={},k='';cb=(typeof cb==='string')?window[cb]:(cb instanceof Array)?window[cb[0]][cb[1]]:cb;arr1keys:for(k1 in arr1){arrs:for(i=1;i<arguments.length-1;i++){arr=arguments[i];for(k in arr){if(cb(arr[k],arr1[k1])===0&&k===k1){if(i===arguments.length-2){retArr[k1]=arr1[k1];} +continue arrs;}} +continue arr1keys;}} +return retArr;} +function array_uintersect_uassoc(){var arr1=arguments[0],retArr={},cb=arguments[arguments.length-1],cb0=arguments[arguments.length-2];var k1='',i=1,k='',arr={};cb=(typeof cb==='string')?window[cb]:(cb instanceof Array)?window[cb[0]][cb[1]]:cb;cb0=(typeof cb0==='string')?window[cb0]:(cb0 instanceof Array)?window[cb0[0]][cb0[1]]:cb0;arr1keys:for(k1 in arr1){arrs:for(i=1;i<arguments.length-2;i++){arr=arguments[i];for(k in arr){if(cb0(arr[k],arr1[k1])===0&&cb(k,k1)===0){if(i===arguments.length-3){retArr[k1]=arr1[k1];} +continue arrs;}} +continue arr1keys;}} +return retArr;} +function array_unique(array){var key='',tmp_arr1={},tmp_arr2={};var val='';tmp_arr1=array;var __array_search=function(needle,haystack,argStrict){var fkey='';var strict=!!argStrict;for(fkey in haystack){if((strict&&haystack[fkey]===needle)||(!strict&&haystack[fkey]==needle)){return fkey;}} +return false;} +for(key in tmp_arr1){val=tmp_arr1[key];if(false===__array_search(val,tmp_arr2)){tmp_arr2[key]=val;} +delete tmp_arr1[key];} +return tmp_arr2;} +function array_unshift(array){var argc=arguments.length,argv=arguments,i;for(i=1;i<argc;i++){array.unshift(argv[i]);} +return(array.length);} +function array_values(input){var tmp_arr=[],cnt=0;var key='';for(key in input){tmp_arr[cnt]=input[key];cnt++;} +return tmp_arr;} +function array_walk(array,funcname,userdata){var key;if(typeof array!='object'){return false;} +for(key in array){if(typeof(userdata)!='undefined'){eval(funcname+'( array [key] , key , userdata )');}else{eval(funcname+'( userdata ) ');}} +return true;} +function array_walk_recursive(array,funcname,userdata){var key;if(typeof array!='object'){return false;} +for(key in array){if(typeof array[key]=='object'){return array_walk_recursive(array[key],funcname,userdata);} +if(typeof(userdata)!='undefined'){eval(funcname+'( array [key] , key , userdata )');}else{eval(funcname+'( userdata ) ');}} +return true;} +function arsort(inputArr,sort_flags){var valArr=[],keyArr=[],k,i,ret,sorter;switch(sort_flags){case'SORT_STRING':sorter=function(a,b){return strnatcmp(b,a);};break;case'SORT_LOCALE_STRING':sorter=function(a,b){return(b.localeCompare(a));};break;case'SORT_NUMERIC':sorter=function(a,b){return(a-b);};break;case'SORT_REGULAR':default:sorter=function(a,b){if(a>b) +return 1;if(a<b) +return-1;return 0;};break;} +var bubbleSort=function(keyArr,inputArr){var i,j,tempValue,tempKeyVal;for(i=inputArr.length-2;i>=0;i--){for(j=0;j<=i;j++){ret=sorter(inputArr[j+1],inputArr[j]);if(ret>0){tempValue=inputArr[j];inputArr[j]=inputArr[j+1];inputArr[j+1]=tempValue;tempKeyVal=keyArr[j];keyArr[j]=keyArr[j+1];keyArr[j+1]=tempKeyVal;}}}};for(k in inputArr){valArr.push(inputArr[k]);keyArr.push(k);delete inputArr[k];} +try{bubbleSort(keyArr,valArr);}catch(e){return false;} +for(i=0;i<valArr.length;i++){inputArr[keyArr[i]]=valArr[i];} +return true;} +function asin(arg){return Math.asin(arg);} +function asinh(arg){return Math.log(arg+Math.sqrt(arg*arg+1));} +function asort(inputArr,sort_flags){var valArr=[],keyArr=[],k,i,ret,sorter;switch(sort_flags){case'SORT_STRING':sorter=function(a,b){return strnatcmp(a,b);};break;case'SORT_LOCALE_STRING':sorter=function(a,b){return(a.localeCompare(b));};break;case'SORT_NUMERIC':sorter=function(a,b){return(a-b);};break;case'SORT_REGULAR':default:sorter=function(a,b){if(a>b) +return 1;if(a<b) +return-1;return 0;};break;} +var bubbleSort=function(keyArr,inputArr){var i,j,tempValue,tempKeyVal;for(i=inputArr.length-2;i>=0;i--){for(j=0;j<=i;j++){ret=sorter(inputArr[j+1],inputArr[j]);if(ret<0){tempValue=inputArr[j];inputArr[j]=inputArr[j+1];inputArr[j+1]=tempValue;tempKeyVal=keyArr[j];keyArr[j]=keyArr[j+1];keyArr[j+1]=tempKeyVal;}}}};for(k in inputArr){valArr.push(inputArr[k]);keyArr.push(k);delete inputArr[k];} +try{bubbleSort(keyArr,valArr);}catch(e){return false;} +for(i=0;i<valArr.length;i++){inputArr[keyArr[i]]=valArr[i];} +return true;} +function atan(arg){return Math.atan(arg);} +function atanh(arg){return 0.5*Math.log((1+arg)/(1-arg));} +function base64_decode(data){var b64="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";var o1,o2,o3,h1,h2,h3,h4,bits,i=0,ac=0,dec="",tmp_arr=[];if(!data){return data;} +data+='';do{h1=b64.indexOf(data.charAt(i++));h2=b64.indexOf(data.charAt(i++));h3=b64.indexOf(data.charAt(i++));h4=b64.indexOf(data.charAt(i++));bits=h1<<18|h2<<12|h3<<6|h4;o1=bits>>16&0xff;o2=bits>>8&0xff;o3=bits&0xff;if(h3==64){tmp_arr[ac++]=String.fromCharCode(o1);}else if(h4==64){tmp_arr[ac++]=String.fromCharCode(o1,o2);}else{tmp_arr[ac++]=String.fromCharCode(o1,o2,o3);}}while(i<data.length);dec=tmp_arr.join('');dec=utf8_decode(dec);return dec;} +function base64_encode(data){var b64="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";var o1,o2,o3,h1,h2,h3,h4,bits,i=0,ac=0,enc="",tmp_arr=[];if(!data){return data;} +data=utf8_encode(data+'');do{o1=data.charCodeAt(i++);o2=data.charCodeAt(i++);o3=data.charCodeAt(i++);bits=o1<<16|o2<<8|o3;h1=bits>>18&0x3f;h2=bits>>12&0x3f;h3=bits>>6&0x3f;h4=bits&0x3f;tmp_arr[ac++]=b64.charAt(h1)+b64.charAt(h2)+b64.charAt(h3)+b64.charAt(h4);}while(i<data.length);enc=tmp_arr.join('');switch(data.length%3){case 1:enc=enc.slice(0,-2)+'==';break;case 2:enc=enc.slice(0,-1)+'=';break;} +return enc;} +function base_convert(number,frombase,tobase){return parseInt(number+'',frombase+0).toString(tobase+0);} +function bin2hex(s){var i,f=0,a=[];s+='';f=s.length;for(i=0;i<f;i++){a[i]=s.charCodeAt(i).toString(16).replace(/^([\da-f])$/,"0$1");} +return a.join('');} +function bindec(binary_string){binary_string=(binary_string+'').replace(/[^01]/gi,'');return parseInt(binary_string,2);} +function ceil(value){return Math.ceil(value);} +function checkdate(month,day,year){var myDate=new Date();myDate.setFullYear(year,(month-1),day);return((myDate.getMonth()+1)==month&&day<32);} +function chop(str,charlist){return rtrim(str,charlist);} +function chr(ascii){return String.fromCharCode(ascii);} +function chunk_split(body,argChunklen,argEnd){if(chunklen<1){return false;} +var result='',chunklen=argChunklen||76,end=argEnd||'\r\n';while(body.length>chunklen){result+=body.substring(0,chunklen)+end;body=body.substring(chunklen);} +return result+body+end;} +function class_exists(cls){var i='';cls=window[cls];if(typeof cls!=='function'){return false;} +for(i in cls.prototype){return true;} +for(i in cls){if(i!=='prototype'){return true;}} +if(cls.toSource&&cls.toSource().match(/this\./)){return true;} +return false;} +function compact(){var Matrix={};var key_value;var process=function(value){var i=0,l=value.length,key_value='';for(i=0;i<l;i++){key_value=value[i];if(key_value instanceof Array){process(key_value);}else{if(typeof window[key_value]!=='undefined'){Matrix[key_value]=window[key_value];}}} +return true;};process(arguments);return Matrix;} +function cos(arg){return Math.cos(arg);} +function cosh(arg){return(Math.exp(arg)+Math.exp(-arg))/2;} +function count(mixed_var,mode){var key,cnt=0;if(mode=='COUNT_RECURSIVE')mode=1;if(mode!=1)mode=0;for(key in mixed_var){cnt++;if(mode==1&&mixed_var[key]&&(mixed_var[key].constructor===Array||mixed_var[key].constructor===Object)){cnt+=count(mixed_var[key],1);}} +return cnt;} +function count_chars(str,mode){var histogram={},tmp_arr=[];var key,i,code,strl=0;var argc=arguments.length;var mode_even=0;if(argc==1){mode=0;} +mode_even=(mode&1)==0;if(mode_even){for(i=1;i<256;++i){histogram[i]=0;}} +str+='';strl=str.length;for(i=0;i<strl;++i){code=str.charCodeAt(i);if(code in histogram){++histogram[code];}else{histogram[code]=1;}} +if(mode>0){for(key in histogram){if(histogram[key]==0!=mode_even){delete histogram[key];}}} +if(mode<3){return histogram;}else{for(key in histogram){tmp_arr.push(String.fromCharCode(key));} +return tmp_arr.join("");}} +function crc32(str){str=utf8_encode(str);var table="00000000 77073096 EE0E612C 990951BA 076DC419 706AF48F E963A535 9E6495A3 0EDB8832 79DCB8A4 E0D5E91E 97D2D988 09B64C2B 7EB17CBD E7B82D07 90BF1D91 1DB71064 6AB020F2 F3B97148 84BE41DE 1ADAD47D 6DDDE4EB F4D4B551 83D385C7 136C9856 646BA8C0 FD62F97A 8A65C9EC 14015C4F 63066CD9 FA0F3D63 8D080DF5 3B6E20C8 4C69105E D56041E4 A2677172 3C03E4D1 4B04D447 D20D85FD A50AB56B 35B5A8FA 42B2986C DBBBC9D6 ACBCF940 32D86CE3 45DF5C75 DCD60DCF ABD13D59 26D930AC 51DE003A C8D75180 BFD06116 21B4F4B5 56B3C423 CFBA9599 B8BDA50F 2802B89E 5F058808 C60CD9B2 B10BE924 2F6F7C87 58684C11 C1611DAB B6662D3D 76DC4190 01DB7106 98D220BC EFD5102A 71B18589 06B6B51F 9FBFE4A5 E8B8D433 7807C9A2 0F00F934 9609A88E E10E9818 7F6A0DBB 086D3D2D 91646C97 E6635C01 6B6B51F4 1C6C6162 856530D8 F262004E 6C0695ED 1B01A57B 8208F4C1 F50FC457 65B0D9C6 12B7E950 8BBEB8EA FCB9887C 62DD1DDF 15DA2D49 8CD37CF3 FBD44C65 4DB26158 3AB551CE A3BC0074 D4BB30E2 4ADFA541 3DD895D7 A4D1C46D D3D6F4FB 4369E96A 346ED9FC AD678846 DA60B8D0 44042D73 33031DE5 AA0A4C5F DD0D7CC9 5005713C 270241AA BE0B1010 C90C2086 5768B525 206F85B3 B966D409 CE61E49F 5EDEF90E 29D9C998 B0D09822 C7D7A8B4 59B33D17 2EB40D81 B7BD5C3B C0BA6CAD EDB88320 9ABFB3B6 03B6E20C 74B1D29A EAD54739 9DD277AF 04DB2615 73DC1683 E3630B12 94643B84 0D6D6A3E 7A6A5AA8 E40ECF0B 9309FF9D 0A00AE27 7D079EB1 F00F9344 8708A3D2 1E01F268 6906C2FE F762575D 806567CB 196C3671 6E6B06E7 FED41B76 89D32BE0 10DA7A5A 67DD4ACC F9B9DF6F 8EBEEFF9 17B7BE43 60B08ED5 D6D6A3E8 A1D1937E 38D8C2C4 4FDFF252 D1BB67F1 A6BC5767 3FB506DD 48B2364B D80D2BDA AF0A1B4C 36034AF6 41047A60 DF60EFC3 A867DF55 316E8EEF 4669BE79 CB61B38C BC66831A 256FD2A0 5268E236 CC0C7795 BB0B4703 220216B9 5505262F C5BA3BBE B2BD0B28 2BB45A92 5CB36A04 C2D7FFA7 B5D0CF31 2CD99E8B 5BDEAE1D 9B64C2B0 EC63F226 756AA39C 026D930A 9C0906A9 EB0E363F 72076785 05005713 95BF4A82 E2B87A14 7BB12BAE 0CB61B38 92D28E9B E5D5BE0D 7CDCEFB7 0BDBDF21 86D3D2D4 F1D4E242 68DDB3F8 1FDA836E 81BE16CD F6B9265B 6FB077E1 18B74777 88085AE6 FF0F6A70 66063BCA 11010B5C 8F659EFF F862AE69 616BFFD3 166CCF45 A00AE278 D70DD2EE 4E048354 3903B3C2 A7672661 D06016F7 4969474D 3E6E77DB AED16A4A D9D65ADC 40DF0B66 37D83BF0 A9BCAE53 DEBB9EC5 47B2CF7F 30B5FFE9 BDBDF21C CABAC28A 53B39330 24B4A3A6 BAD03605 CDD70693 54DE5729 23D967BF B3667A2E C4614AB8 5D681B02 2A6F2B94 B40BBE37 C30C8EA1 5A05DF1B 2D02EF8D";var crc=0;var x=0;var y=0;crc=crc^(-1);for(var i=0,iTop=str.length;i<iTop;i++){y=(crc^str.charCodeAt(i))&0xFF;x="0x"+table.substr(y*9,8);crc=(crc>>>8)^x;} +return crc^(-1);} +function date(format,timestamp){var a,tal=[],jsdate=((typeof(timestamp)=='undefined')?new Date():(typeof(timestamp)=='number')?new Date(timestamp*1000):new Date(timestamp));var pad=function(n,c){if((n=n+"").length<c){return new Array(++c-n.length).join("0")+n;}else{return n;}};var ret='';var txt_weekdays=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];var txt_ordin={1:"st",2:"nd",3:"rd",21:"st",22:"nd",23:"rd",31:"st"};var txt_months=["","January","February","March","April","May","June","July","August","September","October","November","December"];var f={d:function(){return pad(f.j(),2);},D:function(){var t=f.l();return t.substr(0,3);},j:function(){return jsdate.getDate();},l:function(){return txt_weekdays[f.w()];},N:function(){return f.w()+1;},S:function(){return txt_ordin[f.j()]?txt_ordin[f.j()]:'th';},w:function(){return jsdate.getDay();},z:function(){return(jsdate-new Date(jsdate.getFullYear()+"/1/1"))/864e5>>0;},W:function(){var a=f.z(),b=364+f.L()-a;var nd2,nd=(new Date(jsdate.getFullYear()+"/1/1").getDay()||7)-1;if(b<=2&&((jsdate.getDay()||7)-1)<=2-b){return 1;}else{if(a<=2&&nd>=4&&a>=(6-nd)){nd2=new Date(jsdate.getFullYear()-1+"/12/31");return date("W",Math.round(nd2.getTime()/1000));}else{return(1+(nd<=3?((a+nd)/7):(a-(7-nd))/7)>>0);}}},F:function(){return txt_months[f.n()];},m:function(){return pad(f.n(),2);},M:function(){var t;t=f.F();return t.substr(0,3);},n:function(){return jsdate.getMonth()+1;},t:function(){var n;if((n=jsdate.getMonth()+1)==2){return 28+f.L();}else{if(n&1&&n<8||!(n&1)&&n>7){return 31;}else{return 30;}}},L:function(){var y=f.Y();return(!(y&3)&&(y%1e2||!(y%4e2)))?1:0;},o:function(){if(f.n()===12&&f.W()===1){return jsdate.getFullYear()+1;} +if(f.n()===1&&f.W()>=52){return jsdate.getFullYear()-1;} +return jsdate.getFullYear();},Y:function(){return jsdate.getFullYear();},y:function(){return(jsdate.getFullYear()+"").slice(2);},a:function(){return jsdate.getHours()>11?"pm":"am";},A:function(){return f.a().toUpperCase();},B:function(){var off=(jsdate.getTimezoneOffset()+60)*60;var theSeconds=(jsdate.getHours()*3600)+ +(jsdate.getMinutes()*60)+ +jsdate.getSeconds()+off;var beat=Math.floor(theSeconds/86.4);if(beat>1000)beat-=1000;if(beat<0)beat+=1000;if((String(beat)).length==1)beat="00"+beat;if((String(beat)).length==2)beat="0"+beat;return beat;},g:function(){return jsdate.getHours()%12||12;},G:function(){return jsdate.getHours();},h:function(){return pad(f.g(),2);},H:function(){return pad(jsdate.getHours(),2);},i:function(){return pad(jsdate.getMinutes(),2);},s:function(){return pad(jsdate.getSeconds(),2);},u:function(){return pad(jsdate.getMilliseconds()*1000,6);},e:function(){var abbr='',i=0;if(this.php_js&&this.php_js.default_timezone){return this.php_js.default_timezone;} +if(!tal.length){tal=timezone_abbreviations_list();} +for(abbr in tal){for(i=0;i<tal[abbr].length;i++){if(tal[abbr][i].offset===-jsdate.getTimezoneOffset()*60){return tal[abbr][i].timezone_id;}}} +return'UTC';},I:function(){var DST=(new Date(jsdate.getFullYear(),6,1,0,0,0));DST=DST.getHours()-DST.getUTCHours();var ref=jsdate.getHours()-jsdate.getUTCHours();return ref!=DST?1:0;},O:function(){var t=pad(Math.abs(jsdate.getTimezoneOffset()/60*100),4);if(jsdate.getTimezoneOffset()>0)t="-"+t;else t="+"+t;return t;},P:function(){var O=f.O();return(O.substr(0,3)+":"+O.substr(3,2));},T:function(){var abbr='',i=0;if(!tal.length){tal=timezone_abbreviations_list();} +if(this.php_js&&this.php_js.default_timezone){for(abbr in tal){for(i=0;i<tal[abbr].length;i++){if(tal[abbr][i].timezone_id===this.php_js.default_timezone){return abbr.toUpperCase();}}}} +for(abbr in tal){for(i=0;i<tal[abbr].length;i++){if(tal[abbr][i].offset===-jsdate.getTimezoneOffset()*60){return abbr.toUpperCase();}}} +return'UTC';},Z:function(){var t=-jsdate.getTimezoneOffset()*60;return t;},c:function(){return f.Y()+"-"+f.m()+"-"+f.d()+"T"+f.h()+":"+f.i()+":"+f.s()+f.P();},r:function(){return f.D()+', '+f.d()+' '+f.M()+' '+f.Y()+' '+f.H()+':'+f.i()+':'+f.s()+' '+f.O();},U:function(){return Math.round(jsdate.getTime()/1000);}};return format.replace(/[\\]?([a-zA-Z])/g,function(t,s){if(t!=s){ret=s;}else if(f[s]){ret=f[s]();}else{ret=s;} +return ret;});} +function decbin(number){return parseInt(number).toString(2);} +function dechex(number){return parseInt(number).toString(16);} +function decoct(number){return parseInt(number).toString(8);} +function deg2rad(angle){return(angle/180)*Math.PI;} +function doubleval(mixed_var){return floatval(mixed_var);} +function echo(){var arg='',argc=arguments.length,argv=arguments,i=0;var stringToDOM=function(q){var d=document;var r=function(a){return a.replace(/\r/g,' ').replace(/\n/g,' ');};var s=function(a){return a.replace(/&amp;/g,'&').replace(/&gt;/g,'>').replace(/&lt;/g,'<').replace(/&nbsp;/g,' ').replace(/&quot;/g,'"');};var t=function(a){return a.replace(/ /g,'');};var u=function(a){var b,c,e,f,g,h,i;b=d.createDocumentFragment();c=a.indexOf(' ');if(c===-1){b.appendChild(d.createElement(a.toLowerCase()));}else{i=t(a.substring(0,c)).toLowerCase();a=a.substr(c+1);b.appendChild(d.createElement(i));while(a.length){e=a.indexOf('=');if(e>=0){f=t(a.substring(0,e)).toLowerCase();g=a.indexOf('"');a=a.substr(g+1);g=a.indexOf('"');h=s(a.substring(0,g));a=a.substr(g+2);b.lastChild.setAttribute(f,h);}else{break}}} +return b;} +var v=function(a,b,c){var e,f;e=b;c=c.toLowerCase();f=e.indexOf('</'+c+'>');a=a.concat(e.substring(0,f));e=e.substr(f);while(a.indexOf('<'+c)!=-1){a=a.substr(a.indexOf('<'+c));a=a.substr(a.indexOf('>')+1);e=e.substr(e.indexOf('>')+1);f=e.indexOf('</'+c+'>');a=a.concat(e.substring(0,f));e=e.substr(f);} +return b.length-e.length;};var w=function(a){var b,c,e,f,g,h,i,j,k,l,m,n,o,p,q;b=d.createDocumentFragment();while(a&&a.length){c=a.indexOf('<');if(c===-1){a=s(a);b.appendChild(d.createTextNode(a));a=null;}else if(c){q=s(a.substring(0,c));b.appendChild(d.createTextNode(q));a=a.substr(c);}else{e=a.indexOf('<!--');if(!e){f=a.indexOf('-->');g=a.substring(4,f);g=s(g);b.appendChild(d.createComment(g));a=a.substr(f+3);}else{h=a.indexOf('>');if(a.substring(h-1,h)==='/'){i=a.indexOf('/>');j=a.substring(1,i);b.appendChild(u(j));a=a.substr(i+2);}else{k=a.indexOf('>');l=a.substring(1,k);m=d.createDocumentFragment();m.appendChild(u(l));a=a.substr(k+1);n=a.substring(0,a.indexOf('</'));a=a.substr(a.indexOf('</'));if(n.indexOf('<')!=-1){o=m.lastChild.nodeName;p=v(n,a,o);n=n.concat(a.substring(0,p));a=a.substr(p);} +a=a.substr(a.indexOf('>')+1);m.lastChild.appendChild(w(n));b.appendChild(m);}}}} +return b;};return w(q);} +for(i=0;i<argc;i++){arg=argv[i];if(document.createDocumentFragment&&document.createTextNode&&document.appendChild){if(document.body){document.body.appendChild(stringToDOM(arg));}else{document.documentElement.appendChild(stringToDOM(arg));}}else if(document.write){document.write(arg);}else{print(arg);}}} +function end(arr){if(!this.php_js)this.php_js={};if(!this.php_js.pointers)this.php_js.pointers=[];var pointers=this.php_js.pointers;if(pointers.indexOf(arr)===-1){pointers.push(arr,0);} +var arrpos=pointers.indexOf(arr);if(!(arr instanceof Array)){var ct=0;for(var k in arr){ct++;var val=arr[k];} +if(ct===0){return false;} +pointers[arrpos+1]=ct-1;return val;} +if(arr.length===0){return false;} +pointers[arrpos+1]=arr.length-1;return arr[pointers[arrpos+1]];} +function exp(arg){return Math.exp(arg);} +function explode(delimiter,string,limit){var emptyArray={0:''};if(arguments.length<2||typeof arguments[0]=='undefined'||typeof arguments[1]=='undefined') +{return null;} +if(delimiter===''||delimiter===false||delimiter===null) +{return false;} +if(typeof delimiter=='function'||typeof delimiter=='object'||typeof string=='function'||typeof string=='object') +{return emptyArray;} +if(delimiter===true){delimiter='1';} +if(!limit){return string.toString().split(delimiter.toString());}else{var splitted=string.toString().split(delimiter.toString());var partA=splitted.splice(0,limit-1);var partB=splitted.join(delimiter.toString());partA.push(partB);return partA;}} +function floatval(mixed_var){return(parseFloat(mixed_var)||0);} +function floor(value){return Math.floor(value);} +function fmod(x,y){var tmp,tmp2,p=0,pY=0,l=0.0,l2=0.0;tmp=x.toExponential().match(/^.\.?(.*)e(.+)$/);p=parseInt(tmp[2])-(tmp[1]+'').length;tmp=y.toExponential().match(/^.\.?(.*)e(.+)$/);pY=parseInt(tmp[2])-(tmp[1]+'').length;if(pY>p){p=pY;} +tmp2=(x%y);if(p<-100||p>20){l=Math.round(Math.log(tmp2)/Math.log(10));l2=Math.pow(10,l);return(tmp2/l2).toFixed(l-p)*l2;}else{return parseFloat(tmp2.toFixed(-p));}} +function get_class(obj){if(obj instanceof Object&&!(obj instanceof Array)&&!(obj instanceof Function)&&obj.constructor&&obj!=window){var arr=obj.constructor.toString().match(/function\s*(\w+)/);if(arr&&arr.length==2){return arr[1];}} +return false;} +function get_defined_vars(){var i='',arr=[],already={};for(i in window){try{if(typeof window[i]==='function'){if(!already[i]){already[i]=1;arr.push(i);}} +else if(typeof window[i]==='object'){for(var j in window[i]){if(typeof window[j]==='function'&&window[j]&&!already[j]){already[j]=1;arr.push(j);}}}} +catch(e){}} +return arr;} +function get_headers(url,format){var req=window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();if(!req)throw new Error('XMLHttpRequest not supported');var tmp,headers,pair,i;req.open('HEAD',url,false);req.send(null);if(req.readyState<3){return false;} +tmp=req.getAllResponseHeaders();alert(tmp);tmp=tmp.split('\n');tmp=array_filter(tmp,function(value){return value.substring(1)!='';});headers=[req.status+' '+req.statusText];for(i in tmp){if(format){pair=tmp[i].split(':');headers[pair.splice(0,1)]=pair.join(':').substring(1);}else{headers[headers.length]=tmp[i];}} +return headers;} +function get_html_translation_table(table,quote_style){var entities={},histogram={},decimal=0,symbol='';var constMappingTable={},constMappingQuoteStyle={};var useTable={},useQuoteStyle={};useTable=(table?table.toUpperCase():'HTML_SPECIALCHARS');useQuoteStyle=(quote_style?quote_style.toUpperCase():'ENT_COMPAT');constMappingTable[0]='HTML_SPECIALCHARS';constMappingTable[1]='HTML_ENTITIES';constMappingQuoteStyle[0]='ENT_NOQUOTES';constMappingQuoteStyle[2]='ENT_COMPAT';constMappingQuoteStyle[3]='ENT_QUOTES';if(!isNaN(useTable)){useTable=constMappingTable[useTable];} +if(!isNaN(useQuoteStyle)){useQuoteStyle=constMappingQuoteStyle[useQuoteStyle];} +if(useTable=='HTML_SPECIALCHARS'){entities['38']='&amp;';if(useQuoteStyle!='ENT_NOQUOTES'){entities['34']='&quot;';} +if(useQuoteStyle=='ENT_QUOTES'){entities['39']='&#039;';} +entities['60']='&lt;';entities['62']='&gt;';}else if(useTable=='HTML_ENTITIES'){entities['38']='&amp;';if(useQuoteStyle!='ENT_NOQUOTES'){entities['34']='&quot;';} +if(useQuoteStyle=='ENT_QUOTES'){entities['39']='&#039;';} +entities['60']='&lt;';entities['62']='&gt;';entities['160']='&nbsp;';entities['161']='&iexcl;';entities['162']='&cent;';entities['163']='&pound;';entities['164']='&curren;';entities['165']='&yen;';entities['166']='&brvbar;';entities['167']='&sect;';entities['168']='&uml;';entities['169']='&copy;';entities['170']='&ordf;';entities['171']='&laquo;';entities['172']='&not;';entities['173']='&shy;';entities['174']='&reg;';entities['175']='&macr;';entities['176']='&deg;';entities['177']='&plusmn;';entities['178']='&sup2;';entities['179']='&sup3;';entities['180']='&acute;';entities['181']='&micro;';entities['182']='&para;';entities['183']='&middot;';entities['184']='&cedil;';entities['185']='&sup1;';entities['186']='&ordm;';entities['187']='&raquo;';entities['188']='&frac14;';entities['189']='&frac12;';entities['190']='&frac34;';entities['191']='&iquest;';entities['192']='&Agrave;';entities['193']='&Aacute;';entities['194']='&Acirc;';entities['195']='&Atilde;';entities['196']='&Auml;';entities['197']='&Aring;';entities['198']='&AElig;';entities['199']='&Ccedil;';entities['200']='&Egrave;';entities['201']='&Eacute;';entities['202']='&Ecirc;';entities['203']='&Euml;';entities['204']='&Igrave;';entities['205']='&Iacute;';entities['206']='&Icirc;';entities['207']='&Iuml;';entities['208']='&ETH;';entities['209']='&Ntilde;';entities['210']='&Ograve;';entities['211']='&Oacute;';entities['212']='&Ocirc;';entities['213']='&Otilde;';entities['214']='&Ouml;';entities['215']='&times;';entities['216']='&Oslash;';entities['217']='&Ugrave;';entities['218']='&Uacute;';entities['219']='&Ucirc;';entities['220']='&Uuml;';entities['221']='&Yacute;';entities['222']='&THORN;';entities['223']='&szlig;';entities['224']='&agrave;';entities['225']='&aacute;';entities['226']='&acirc;';entities['227']='&atilde;';entities['228']='&auml;';entities['229']='&aring;';entities['230']='&aelig;';entities['231']='&ccedil;';entities['232']='&egrave;';entities['233']='&eacute;';entities['234']='&ecirc;';entities['235']='&euml;';entities['236']='&igrave;';entities['237']='&iacute;';entities['238']='&icirc;';entities['239']='&iuml;';entities['240']='&eth;';entities['241']='&ntilde;';entities['242']='&ograve;';entities['243']='&oacute;';entities['244']='&ocirc;';entities['245']='&otilde;';entities['246']='&ouml;';entities['247']='&divide;';entities['248']='&oslash;';entities['249']='&ugrave;';entities['250']='&uacute;';entities['251']='&ucirc;';entities['252']='&uuml;';entities['253']='&yacute;';entities['254']='&thorn;';entities['255']='&yuml;';}else{throw Error("Table: "+useTable+' not supported');return false;} +for(decimal in entities){symbol=String.fromCharCode(decimal);histogram[symbol]=entities[decimal];} +return histogram;} +function getdate(timestamp){var _w=['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'];var _m=['January','February','March','April','May','June','July','August','September','October','November','December'];var d=(typeof timestamp=='number')?new Date(timestamp*1000):new Date();var w=d.getDay();var m=d.getMonth();var y=d.getFullYear();var r={};r['seconds']=d.getSeconds();r['minutes']=d.getMinutes();r['hours']=d.getHours();r['mday']=d.getDate();r['wday']=w;r['mon']=m+1;r['year']=y;r['yday']=Math.floor((d-(new Date(y,0,1)))/86400000);r['weekday']=_w[w];r['month']=_m[m];r['0']=parseInt(d.getTime()/1000);return r;} +function getrandmax() +{return 2147483647;} +function hexdec(hex_string){hex_string=(hex_string+'').replace(/[^a-f0-9]/gi,'');return parseInt(hex_string,16);} +function html_entity_decode(string,quote_style){var histogram={},symbol='',tmp_str='',entity='';tmp_str=string.toString();if(false===(histogram=get_html_translation_table('HTML_ENTITIES',quote_style))){return false;} +delete(histogram['&']);histogram['&']='&amp;';for(symbol in histogram){entity=histogram[symbol];tmp_str=tmp_str.split(entity).join(symbol);} +return tmp_str;} +function htmlentities(string,quote_style){var histogram={},symbol='',tmp_str='',entity='';tmp_str=string.toString();if(false===(histogram=get_html_translation_table('HTML_ENTITIES',quote_style))){return false;} +for(symbol in histogram){entity=histogram[symbol];tmp_str=tmp_str.split(symbol).join(entity);} +return tmp_str;} +function htmlspecialchars(string,quote_style){var histogram={},symbol='',tmp_str='',entity='';tmp_str=string.toString();if(false===(histogram=get_html_translation_table('HTML_SPECIALCHARS',quote_style))){return false;} +for(symbol in histogram){entity=histogram[symbol];tmp_str=tmp_str.split(symbol).join(entity);} +return tmp_str;} +function htmlspecialchars_decode(string,quote_style){var histogram={},symbol='',tmp_str='',entity='';tmp_str=string.toString();if(false===(histogram=get_html_translation_table('HTML_SPECIALCHARS',quote_style))){return false;} +delete(histogram['&']);histogram['&']='&amp;';for(symbol in histogram){entity=histogram[symbol];tmp_str=tmp_str.split(entity).join(symbol);} +return tmp_str;} +function http_build_query(formdata,numeric_prefix,arg_separator){var key,use_val,use_key,i=0,j=0,tmp_arr=[];if(!arg_separator){arg_separator='&';} +for(key in formdata){use_val=urlencode(formdata[key].toString());use_key=urlencode(key);if(numeric_prefix&&!isNaN(key)){use_key=numeric_prefix+j;j++;} +tmp_arr[i++]=use_key+'='+use_val;} +return tmp_arr.join(arg_separator);} +function hypot(x,y){return Math.sqrt(x*x+y*y)||0;} +function implode(glue,pieces){return((pieces instanceof Array)?pieces.join(glue):pieces);} +function in_array(needle,haystack,argStrict){var found=false,key,strict=!!argStrict;for(key in haystack){if((strict&&haystack[key]===needle)||(!strict&&haystack[key]==needle)){found=true;break;}} +return found;} +function intval(mixed_var,base){var tmp;var type=typeof(mixed_var);if(type=='boolean'){if(mixed_var==true){return 1;}else{return 0;}}else if(type=='string'){tmp=parseInt(mixed_var*1);if(isNaN(tmp)||!isFinite(tmp)){return 0;}else{return tmp.toString(base||10);}}else if(type=='number'&&isFinite(mixed_var)){return Math.floor(mixed_var);}else{return 0;}} +function ip2long(ip_address){var output=false;var parts=[];if(ip_address.match(/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/)){parts=ip_address.split('.');output=(parts[0]*16777216+ +(parts[1]*65536)+ +(parts[2]*256)+ +(parts[3]*1));} +return output;} +function is_bool(mixed_var) +{return(typeof mixed_var=='boolean');} +function is_double(mixed_var){return is_float(mixed_var);} +function is_finite(val){var warningType='';if(val===Infinity||val===-Infinity){return false;} +if(typeof val=='object'){warningType=(val instanceof Array?'array':'object');}else if(typeof val=='string'&&!val.match(/^[\+\-]?\d/)){warningType='string';} +if(warningType){throw new Error('Warning: is_finite() expects parameter 1 to be double, '+warningType+' given');} +return true;} +function is_float(mixed_var){return parseFloat(mixed_var*1)!=parseInt(mixed_var*1);} +function is_infinite(val){var warningType='';if(val===Infinity||val===-Infinity){return true;} +if(typeof val=='object'){warningType=(val instanceof Array?'array':'object');}else if(typeof val=='string'&&!val.match(/^[\+\-]?\d/)){warningType='string';} +if(warningType){throw new Error('Warning: is_infinite() expects parameter 1 to be double, '+warningType+' given');} +return false;} +function is_int(mixed_var){if(typeof mixed_var!=='number'){return false;} +if(parseFloat(mixed_var)!=parseInt(mixed_var)){return false;} +return true;} +function is_integer(mixed_var){return is_int(mixed_var);} +function is_long(mixed_var){return is_float(mixed_var);} +function is_nan(val){var warningType='';if(typeof val=='number'&&isNaN(val)){return true;} +if(typeof val=='object'){warningType=(val instanceof Array?'array':'object');}else if(typeof val=='string'&&!val.match(/^[\+\-]?\d/)){warningType='string';} +if(warningType){throw new Error('Warning: is_nan() expects parameter 1 to be double, '+warningType+' given');} +return false;} +function is_null(mixed_var){return(mixed_var===null);} +function is_numeric(mixed_var){return!isNaN(mixed_var*1);} +function is_real(mixed_var){return is_float(mixed_var);} +function is_scalar(mixed_var){return/boolean|number|string/.test(typeof mixed_var);} +function is_string(mixed_var){return(typeof(mixed_var)=='string');} +function join(glue,pieces){return implode(glue,pieces);} +function json_decode(str_json){var cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;var j;var text=str_json;var walk=function(holder,key){var k,v,value=holder[key];if(value&&typeof value==='object'){for(k in value){if(Object.hasOwnProperty.call(value,k)){v=walk(value,k);if(v!==undefined){value[k]=v;}else{delete value[k];}}}} +return reviver.call(holder,key,value);} +cx.lastIndex=0;if(cx.test(text)){text=text.replace(cx,function(a){return'\\u'+ +('0000'+a.charCodeAt(0).toString(16)).slice(-4);});} +if(/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,'@').replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,']').replace(/(?:^|:|,)(?:\s*\[)+/g,''))){j=eval('('+text+')');return typeof reviver==='function'?walk({'':j},''):j;} +throw new SyntaxError('json_decode');} +function json_encode(mixed_val){var indent;var value=mixed_val;var i;var quote=function(string){var escapable=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;var meta={'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','"':'\\"','\\':'\\\\'};escapable.lastIndex=0;return escapable.test(string)?'"'+string.replace(escapable,function(a){var c=meta[a];return typeof c==='string'?c:'\\u'+('0000'+a.charCodeAt(0).toString(16)).slice(-4);})+'"':'"'+string+'"';} +var str=function(key,holder){var gap='';var indent=' ';var i=0;var k='';var v='';var length=0;var mind=gap;var partial=[];var value=holder[key];if(value&&typeof value==='object'&&typeof value.toJSON==='function'){value=value.toJSON(key);} +switch(typeof value){case'string':return quote(value);case'number':return isFinite(value)?String(value):'null';case'boolean':case'null':return String(value);case'object':if(!value){return'null';} +gap+=indent;partial=[];if(Object.prototype.toString.apply(value)==='[object Array]'){length=value.length;for(i=0;i<length;i+=1){partial[i]=str(i,value)||'null';} +v=partial.length===0?'[]':gap?'[\n'+gap+ +partial.join(',\n'+gap)+'\n'+ +mind+']':'['+partial.join(',')+']';gap=mind;return v;} +for(k in value){if(Object.hasOwnProperty.call(value,k)){v=str(k,value);if(v){partial.push(quote(k)+(gap?': ':':')+v);}}} +v=partial.length===0?'{}':gap?'{\n'+gap+partial.join(',\n'+gap)+'\n'+ +mind+'}':'{'+partial.join(',')+'}';gap=mind;return v;}};return str('',{'':value});} +function krsort(array,sort_flags){var tmp_arr={},keys=[],sorter,i,key;switch(sort_flags){case'SORT_STRING':sorter=function(a,b){return strnatcmp(b,a);};break;case'SORT_LOCALE_STRING':sorter=function(a,b){return(b.localeCompare(a));};break;case'SORT_NUMERIC':sorter=function(a,b){return(b-a);};break;case'SORT_REGULAR':default:sorter=function(a,b){if(a<b) +return 1;if(a>b) +return-1;return 0;};break;} +for(key in array){keys.push(key);} +keys.sort(sorter);for(i=0;i<keys.length;i++){key=keys[i];tmp_arr[key]=array[key];delete array[key];} +for(i in tmp_arr){array[i]=tmp_arr[i]} +return true;} +function ksort(array,sort_flags){var tmp_arr={},keys=[],sorter,i,key;switch(sort_flags){case'SORT_STRING':sorter=function(a,b){return strnatcmp(a,b);};break;case'SORT_LOCALE_STRING':sorter=function(a,b){return(a.localeCompare(b));};break;case'SORT_NUMERIC':sorter=function(a,b){return(a-b);};break;case'SORT_REGULAR':default:sorter=function(a,b){if(a>b) +return 1;if(a<b) +return-1;return 0;};break;} +for(key in array){keys.push(key);} +keys.sort(sorter);for(i=0;i<keys.length;i++){key=keys[i];tmp_arr[key]=array[key];delete array[key];} +for(i in tmp_arr){array[i]=tmp_arr[i]} +return true;} +function lcfirst(str){str+='';var f=str.charAt(0).toLowerCase();return f+str.substr(1);} +function lcg_value(){return Math.random();} +function levenshtein(a,b){var min=Math.min,len1=0,len2=0,I=0,i=0,d=[],c='',j=0,J=0;var split=false;try{split=!('0')[0];}catch(i){split=true;} +if(a==b){return 0;} +if(!a.length||!b.length){return b.length||a.length;} +if(split){a=a.split('');b=b.split('');} +len1=a.length+1;len2=b.length+1;d=[[0]];while(++i<len2){d[0][i]=i;} +i=0;while(++i<len1){J=j=0;c=a[I];d[i]=[i];while(++j<len2){d[i][j]=min(d[I][j]+1,d[i][J]+1,d[I][J]+(c!=b[J]));++J;} +++I;} +return d[len1-1][len2-1];} +function log(arg,base){if(base===undefined){return Math.log(arg);}else{return Math.log(arg)/Math.log(base);}} +function log10(arg){return Math.log(arg)/Math.LN10;} +function long2ip(proper_address){var output=false;if(!isNaN(proper_address)&&(proper_address>=0||proper_address<=4294967295)){output=Math.floor(proper_address/Math.pow(256,3))+'.'+ +Math.floor((proper_address%Math.pow(256,3))/Math.pow(256,2))+'.'+ +Math.floor(((proper_address%Math.pow(256,3))%Math.pow(256,2))/Math.pow(256,1))+'.'+ +Math.floor((((proper_address%Math.pow(256,3))%Math.pow(256,2))%Math.pow(256,1))/Math.pow(256,0));} +return output;} +function ltrim(str,charlist){charlist=!charlist?' \s\xA0':(charlist+'').replace(/([\[\]\(\)\.\?\/\*\{\}\+\$\^\:])/g,'\$1');var re=new RegExp('^['+charlist+']+','g');return(str+'').replace(re,'');} +function max(){var ar,retVal,i=0,n=0;var argv=arguments,argc=argv.length;var _obj2Array=function(obj){if(obj instanceof Array){return obj;}else{var ar=[];for(var i in obj){ar.push(obj[i]);} +return ar;}} +var _compare=function(current,next){var i=0,n=0,tmp=0;var nl=0,cl=0;if(current===next){return 0;}else if(typeof current=='object'){if(typeof next=='object'){current=_obj2Array(current);next=_obj2Array(next);cl=current.length;nl=next.length;if(nl>cl){return 1;}else if(nl<cl){return-1;}else{for(i=0,n=cl;i<n;++i){tmp=_compare(current[i],next[i]);if(tmp==1){return 1;}else if(tmp==-1){return-1;}} +return 0;}}else{return-1;}}else if(typeof next=='object'){return 1;}else if(isNaN(next)&&!isNaN(current)){if(current==0){return 0;}else{return(current<0?1:-1);}}else if(isNaN(current)&&!isNaN(next)){if(next==0){return 0;}else{return(next>0?1:-1);}}else{if(next==current){return 0;}else{return(next>current?1:-1);}}} +if(argc==0){throw new Error('At least one value should be passed to max()');}else if(argc==1){if(typeof argv[0]=='object'){ar=_obj2Array(argv[0]);}else{throw new Error('Wrong parameter count for max()');} +if(ar.length==0){throw new Error('Array must contain at least one element for max()');}}else{ar=argv;} +retVal=ar[0];for(i=1,n=ar.length;i<n;++i){if(_compare(retVal,ar[i])==1){retVal=ar[i];}} +return retVal;} +function md5(str){var xl;var RotateLeft=function(lValue,iShiftBits){return(lValue<<iShiftBits)|(lValue>>>(32-iShiftBits));};var AddUnsigned=function(lX,lY){var lX4,lY4,lX8,lY8,lResult;lX8=(lX&0x80000000);lY8=(lY&0x80000000);lX4=(lX&0x40000000);lY4=(lY&0x40000000);lResult=(lX&0x3FFFFFFF)+(lY&0x3FFFFFFF);if(lX4&lY4){return(lResult^0x80000000^lX8^lY8);} +if(lX4|lY4){if(lResult&0x40000000){return(lResult^0xC0000000^lX8^lY8);}else{return(lResult^0x40000000^lX8^lY8);}}else{return(lResult^lX8^lY8);}};var F=function(x,y,z){return(x&y)|((~x)&z);};var G=function(x,y,z){return(x&z)|(y&(~z));};var H=function(x,y,z){return(x^y^z);};var I=function(x,y,z){return(y^(x|(~z)));};var FF=function(a,b,c,d,x,s,ac){a=AddUnsigned(a,AddUnsigned(AddUnsigned(F(b,c,d),x),ac));return AddUnsigned(RotateLeft(a,s),b);};var GG=function(a,b,c,d,x,s,ac){a=AddUnsigned(a,AddUnsigned(AddUnsigned(G(b,c,d),x),ac));return AddUnsigned(RotateLeft(a,s),b);};var HH=function(a,b,c,d,x,s,ac){a=AddUnsigned(a,AddUnsigned(AddUnsigned(H(b,c,d),x),ac));return AddUnsigned(RotateLeft(a,s),b);};var II=function(a,b,c,d,x,s,ac){a=AddUnsigned(a,AddUnsigned(AddUnsigned(I(b,c,d),x),ac));return AddUnsigned(RotateLeft(a,s),b);};var ConvertToWordArray=function(str){var lWordCount;var lMessageLength=str.length;var lNumberOfWords_temp1=lMessageLength+8;var lNumberOfWords_temp2=(lNumberOfWords_temp1-(lNumberOfWords_temp1%64))/64;var lNumberOfWords=(lNumberOfWords_temp2+1)*16;var lWordArray=Array(lNumberOfWords-1);var lBytePosition=0;var lByteCount=0;while(lByteCount<lMessageLength){lWordCount=(lByteCount-(lByteCount%4))/4;lBytePosition=(lByteCount%4)*8;lWordArray[lWordCount]=(lWordArray[lWordCount]|(str.charCodeAt(lByteCount)<<lBytePosition));lByteCount++;} +lWordCount=(lByteCount-(lByteCount%4))/4;lBytePosition=(lByteCount%4)*8;lWordArray[lWordCount]=lWordArray[lWordCount]|(0x80<<lBytePosition);lWordArray[lNumberOfWords-2]=lMessageLength<<3;lWordArray[lNumberOfWords-1]=lMessageLength>>>29;return lWordArray;};var WordToHex=function(lValue){var WordToHexValue="",WordToHexValue_temp="",lByte,lCount;for(lCount=0;lCount<=3;lCount++){lByte=(lValue>>>(lCount*8))&255;WordToHexValue_temp="0"+lByte.toString(16);WordToHexValue=WordToHexValue+WordToHexValue_temp.substr(WordToHexValue_temp.length-2,2);} +return WordToHexValue;};var x=Array();var k,AA,BB,CC,DD,a,b,c,d;var S11=7,S12=12,S13=17,S14=22;var S21=5,S22=9,S23=14,S24=20;var S31=4,S32=11,S33=16,S34=23;var S41=6,S42=10,S43=15,S44=21;str=utf8_encode(str);x=ConvertToWordArray(str);a=0x67452301;b=0xEFCDAB89;c=0x98BADCFE;d=0x10325476;xl=x.length;for(k=0;k<xl;k+=16){AA=a;BB=b;CC=c;DD=d;a=FF(a,b,c,d,x[k+0],S11,0xD76AA478);d=FF(d,a,b,c,x[k+1],S12,0xE8C7B756);c=FF(c,d,a,b,x[k+2],S13,0x242070DB);b=FF(b,c,d,a,x[k+3],S14,0xC1BDCEEE);a=FF(a,b,c,d,x[k+4],S11,0xF57C0FAF);d=FF(d,a,b,c,x[k+5],S12,0x4787C62A);c=FF(c,d,a,b,x[k+6],S13,0xA8304613);b=FF(b,c,d,a,x[k+7],S14,0xFD469501);a=FF(a,b,c,d,x[k+8],S11,0x698098D8);d=FF(d,a,b,c,x[k+9],S12,0x8B44F7AF);c=FF(c,d,a,b,x[k+10],S13,0xFFFF5BB1);b=FF(b,c,d,a,x[k+11],S14,0x895CD7BE);a=FF(a,b,c,d,x[k+12],S11,0x6B901122);d=FF(d,a,b,c,x[k+13],S12,0xFD987193);c=FF(c,d,a,b,x[k+14],S13,0xA679438E);b=FF(b,c,d,a,x[k+15],S14,0x49B40821);a=GG(a,b,c,d,x[k+1],S21,0xF61E2562);d=GG(d,a,b,c,x[k+6],S22,0xC040B340);c=GG(c,d,a,b,x[k+11],S23,0x265E5A51);b=GG(b,c,d,a,x[k+0],S24,0xE9B6C7AA);a=GG(a,b,c,d,x[k+5],S21,0xD62F105D);d=GG(d,a,b,c,x[k+10],S22,0x2441453);c=GG(c,d,a,b,x[k+15],S23,0xD8A1E681);b=GG(b,c,d,a,x[k+4],S24,0xE7D3FBC8);a=GG(a,b,c,d,x[k+9],S21,0x21E1CDE6);d=GG(d,a,b,c,x[k+14],S22,0xC33707D6);c=GG(c,d,a,b,x[k+3],S23,0xF4D50D87);b=GG(b,c,d,a,x[k+8],S24,0x455A14ED);a=GG(a,b,c,d,x[k+13],S21,0xA9E3E905);d=GG(d,a,b,c,x[k+2],S22,0xFCEFA3F8);c=GG(c,d,a,b,x[k+7],S23,0x676F02D9);b=GG(b,c,d,a,x[k+12],S24,0x8D2A4C8A);a=HH(a,b,c,d,x[k+5],S31,0xFFFA3942);d=HH(d,a,b,c,x[k+8],S32,0x8771F681);c=HH(c,d,a,b,x[k+11],S33,0x6D9D6122);b=HH(b,c,d,a,x[k+14],S34,0xFDE5380C);a=HH(a,b,c,d,x[k+1],S31,0xA4BEEA44);d=HH(d,a,b,c,x[k+4],S32,0x4BDECFA9);c=HH(c,d,a,b,x[k+7],S33,0xF6BB4B60);b=HH(b,c,d,a,x[k+10],S34,0xBEBFBC70);a=HH(a,b,c,d,x[k+13],S31,0x289B7EC6);d=HH(d,a,b,c,x[k+0],S32,0xEAA127FA);c=HH(c,d,a,b,x[k+3],S33,0xD4EF3085);b=HH(b,c,d,a,x[k+6],S34,0x4881D05);a=HH(a,b,c,d,x[k+9],S31,0xD9D4D039);d=HH(d,a,b,c,x[k+12],S32,0xE6DB99E5);c=HH(c,d,a,b,x[k+15],S33,0x1FA27CF8);b=HH(b,c,d,a,x[k+2],S34,0xC4AC5665);a=II(a,b,c,d,x[k+0],S41,0xF4292244);d=II(d,a,b,c,x[k+7],S42,0x432AFF97);c=II(c,d,a,b,x[k+14],S43,0xAB9423A7);b=II(b,c,d,a,x[k+5],S44,0xFC93A039);a=II(a,b,c,d,x[k+12],S41,0x655B59C3);d=II(d,a,b,c,x[k+3],S42,0x8F0CCC92);c=II(c,d,a,b,x[k+10],S43,0xFFEFF47D);b=II(b,c,d,a,x[k+1],S44,0x85845DD1);a=II(a,b,c,d,x[k+8],S41,0x6FA87E4F);d=II(d,a,b,c,x[k+15],S42,0xFE2CE6E0);c=II(c,d,a,b,x[k+6],S43,0xA3014314);b=II(b,c,d,a,x[k+13],S44,0x4E0811A1);a=II(a,b,c,d,x[k+4],S41,0xF7537E82);d=II(d,a,b,c,x[k+11],S42,0xBD3AF235);c=II(c,d,a,b,x[k+2],S43,0x2AD7D2BB);b=II(b,c,d,a,x[k+9],S44,0xEB86D391);a=AddUnsigned(a,AA);b=AddUnsigned(b,BB);c=AddUnsigned(c,CC);d=AddUnsigned(d,DD);} +var temp=WordToHex(a)+WordToHex(b)+WordToHex(c)+WordToHex(d);return temp.toLowerCase();} +function method_exists(obj,method){if(typeof obj==='string'){return window[obj]&&typeof window[obj][method]==='function'} +return typeof obj[method]==='function';} +function microtime(get_as_float){var now=new Date().getTime()/1000;var s=parseInt(now);return(get_as_float)?now:(Math.round((now-s)*1000)/1000)+' '+s;} +function min(){var ar,retVal,i=0,n=0;var argv=arguments,argc=argv.length;var _obj2Array=function(obj){if(obj instanceof Array){return obj;}else{var ar=[];for(var i in obj){ar.push(obj[i]);} +return ar;}} +var _compare=function(current,next){var i=0,n=0,tmp=0;var nl=0,cl=0;if(current===next){return 0;}else if(typeof current=='object'){if(typeof next=='object'){current=_obj2Array(current);next=_obj2Array(next);cl=current.length;nl=next.length;if(nl>cl){return 1;}else if(nl<cl){return-1;}else{for(i=0,n=cl;i<n;++i){tmp=_compare(current[i],next[i]);if(tmp==1){return 1;}else if(tmp==-1){return-1;}} +return 0;}}else{return-1;}}else if(typeof next=='object'){return 1;}else if(isNaN(next)&&!isNaN(current)){if(current==0){return 0;}else{return(current<0?1:-1);}}else if(isNaN(current)&&!isNaN(next)){if(next==0){return 0;}else{return(next>0?1:-1);}}else{if(next==current){return 0;}else{return(next>current?1:-1);}}} +if(argc==0){throw new Error('At least one value should be passed to min()');}else if(argc==1){if(typeof argv[0]=='object'){ar=_obj2Array(argv[0]);}else{throw new Error('Wrong parameter count for min()');} +if(ar.length==0){throw new Error('Array must contain at least one element for min()');}}else{ar=argv;} +retVal=ar[0];for(i=1,n=ar.length;i<n;++i){if(_compare(retVal,ar[i])==-1){retVal=ar[i];}} +return retVal;} +function mktime(){var no,ma=0,mb=0,i=0,d=new Date(),argv=arguments,argc=argv.length;if(argc>0){d.setHours(0,0,0);d.setDate(1);d.setMonth(1);d.setYear(1972);} +var dateManip={0:function(tt){return d.setHours(tt);},1:function(tt){return d.setMinutes(tt);},2:function(tt){var set=d.setSeconds(tt);mb=d.getDate()-1;return set;},3:function(tt){var set=d.setMonth(parseInt(tt)-1);ma=d.getFullYear()-1972;return set;},4:function(tt){return d.setDate(tt+mb);},5:function(tt){return d.setYear(tt+ma);}};for(i=0;i<argc;i++){no=parseInt(argv[i]*1);if(isNaN(no)){return false;}else{if(!dateManip[i](no)){return false;}}} +return Math.floor(d.getTime()/1000);} +function mt_getrandmax() +{return 2147483647;} +function mt_rand(min,max){var argc=arguments.length;if(argc==0){min=0;max=2147483647;}else if(argc==1){throw new Error('Warning: mt_rand() expects exactly 2 parameters, 1 given');} +return Math.floor(Math.random()*(max-min+1))+min;} +function natcasesort(inputArr){var valArr=[],keyArr=[],k,i,ret;var bubbleSort=function(keyArr,inputArr){var i,j,tempValue,tempKeyVal;for(i=inputArr.length-2;i>=0;i--){for(j=0;j<=i;j++){ret=strnatcasecmp(inputArr[j+1],inputArr[j]);if(ret<0){tempValue=inputArr[j];inputArr[j]=inputArr[j+1];inputArr[j+1]=tempValue;tempKeyVal=keyArr[j];keyArr[j]=keyArr[j+1];keyArr[j+1]=tempKeyVal;}}}};for(k in inputArr){valArr.push(inputArr[k]);keyArr.push(k);delete inputArr[k];} +try{bubbleSort(keyArr,valArr);}catch(e){return false;} +for(i=0;i<valArr.length;i++){inputArr[keyArr[i]]=valArr[i];} +return true;} +function natsort(inputArr){var valArr=[],keyArr=[],k,i,ret;var bubbleSort=function(keyArr,inputArr){var i,j,tempValue,tempKeyVal;for(i=inputArr.length-2;i>=0;i--){for(j=0;j<=i;j++){ret=strnatcmp(inputArr[j+1],inputArr[j]);if(ret<0){tempValue=inputArr[j];inputArr[j]=inputArr[j+1];inputArr[j+1]=tempValue;tempKeyVal=keyArr[j];keyArr[j]=keyArr[j+1];keyArr[j+1]=tempKeyVal;}}}};for(k in inputArr){valArr.push(inputArr[k]);keyArr.push(k);delete inputArr[k];} +try{bubbleSort(keyArr,valArr);}catch(e){return false;} +for(i=0;i<valArr.length;i++){inputArr[keyArr[i]]=valArr[i];} +return true;} +function nl2br(str,is_xhtml){var breakTag='';breakTag='<br />';if(typeof is_xhtml!='undefined'&&!is_xhtml){breakTag='<br>';} +return(str+'').replace(/([^>]?)\n/g,'$1'+breakTag+'\n');} +function number_format(number,decimals,dec_point,thousands_sep){var n=number,prec=decimals;n=!isFinite(+n)?0:+n;prec=!isFinite(+prec)?0:Math.abs(prec);var sep=(typeof thousands_sep=="undefined")?',':thousands_sep;var dec=(typeof dec_point=="undefined")?'.':dec_point;var s=(prec>0)?n.toFixed(prec):Math.round(n).toFixed(prec);var abs=Math.abs(n).toFixed(prec);var _,i;if(abs>=1000){_=abs.split(/\D/);i=_[0].length%3||3;_[0]=s.slice(0,i+(n<0))+ +_[0].slice(i).replace(/(\d{3})/g,sep+'$1');s=_.join(dec);}else{s=s.replace('.',dec);} +return s;} +function octdec(oct_string){oct_string=(oct_string+'').replace(/[^0-7]/gi,'');return parseInt(oct_string,8);} +function ord(string){return(string+'').charCodeAt(0);} +function parse_str(str,array){var glue1='=';var glue2='&';var array2=(str+'').split(glue2);var array2l=0,tmp='',x=0;array2l=array2.length;for(x=0;x<array2l;x++){tmp=array2[x].split(glue1);array[unescape(tmp[0])]=unescape(tmp[1]).replace(/[+]/g,' ');}} +function parse_url(str,component){var o={strictMode:false,key:["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],q:{name:"queryKey",parser:/(?:^|&)([^&=]*)=?([^&]*)/g},parser:{strict:/^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,loose:/^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/\/?)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/}};var m=o.parser[o.strictMode?"strict":"loose"].exec(str),uri={},i=14;while(i--)uri[o.key[i]]=m[i]||"";switch(component){case'PHP_URL_SCHEME':return uri.protocol;case'PHP_URL_HOST':return uri.host;case'PHP_URL_PORT':return uri.port;case'PHP_URL_USER':return uri.user;case'PHP_URL_PASS':return uri.password;case'PHP_URL_PATH':return uri.path;case'PHP_URL_QUERY':return uri.query;case'PHP_URL_FRAGMENT':return uri.anchor;default:var retArr={};if(uri.protocol!=='')retArr.scheme=uri.protocol;if(uri.host!=='')retArr.host=uri.host;if(uri.port!=='')retArr.port=uri.port;if(uri.user!=='')retArr.user=uri.user;if(uri.password!=='')retArr.pass=uri.password;if(uri.path!=='')retArr.path=uri.path;if(uri.query!=='')retArr.query=uri.query;if(uri.anchor!=='')retArr.fragment=uri.anchor;return retArr;}} +function pi(){return Math.PI;} +function pow(base,exp){return Math.pow(base,exp);} +function preg_quote(str){return(str+'').replace(/([\\\.\+\*\?\[\^\]\$\(\)\{\}\=\!\<\>\|\:])/g,"\\$1");} +function print_r(array,return_val){var output="",pad_char=" ",pad_val=4;var formatArray=function(obj,cur_depth,pad_val,pad_char){if(cur_depth>0){cur_depth++;} +var base_pad=repeat_char(pad_val*cur_depth,pad_char);var thick_pad=repeat_char(pad_val*(cur_depth+1),pad_char);var str="";if(obj instanceof Array||obj instanceof Object){str+="Array\n"+base_pad+"(\n";for(var key in obj){if(obj[key]instanceof Array){str+=thick_pad+"["+key+"] => "+formatArray(obj[key],cur_depth+1,pad_val,pad_char);}else{str+=thick_pad+"["+key+"] => "+obj[key]+"\n";}} +str+=base_pad+")\n";}else if(obj==null||obj==undefined){str='';}else{str=obj.toString();} +return str;};var repeat_char=function(len,pad_char){var str="";for(var i=0;i<len;i++){str+=pad_char;} +return str;};output=formatArray(array,0,pad_val,pad_char);if(return_val!==true){if(document.body){echo(output);} +else{try{XULDocument;echo('<pre xmlns="http://www.w3.org/1999/xhtml" style="white-space:pre;">'+output+'</pre>');} +catch(e){echo(output);}} +return true;}else{return output;}} +function property_exists(cls,prop){cls=(typeof cls==='string')?window[cls]:cls;if(typeof cls==='function'&&cls.toSource&&cls.toSource().match(new RegExp('this\\.'+prop+'\\s'))){return true;} +return(cls[prop]!==undefined&&typeof cls[prop]!=='function')||(cls.prototype!==undefined&&cls.prototype[prop]!==undefined&&typeof cls.prototype[prop]!=='function')||(cls.constructor&&cls.constructor[prop]!==undefined&&typeof cls.constructor[prop]!=='function');} +function quotemeta(str){return(str+'').replace(/([\.\\\+\*\?\[\^\]\$\(\)])/g,'\\$1');} +function rad2deg(angle){return(angle/Math.PI)*180;} +function rand(min,max){var argc=arguments.length;if(argc==0){min=0;max=2147483647;}else if(argc==1){throw new Error('Warning: rand() expects exactly 2 parameters, 1 given');} +return Math.floor(Math.random()*(max-min+1))+min;} +function range(low,high,step){var matrix=[];var inival,endval,plus;var walker=step||1;var chars=false;if(!isNaN(low)&&!isNaN(high)){inival=low;endval=high;}else if(isNaN(low)&&isNaN(high)){chars=true;inival=low.charCodeAt(0);endval=high.charCodeAt(0);}else{inival=(isNaN(low)?0:low);endval=(isNaN(high)?0:high);} +plus=((inival>endval)?false:true);if(plus){while(inival<=endval){matrix.push(((chars)?String.fromCharCode(inival):inival));inival+=walker;}}else{while(inival>=endval){matrix.push(((chars)?String.fromCharCode(inival):inival));inival-=walker;}} +return matrix;} +function rawurldecode(str){var histogram={};var ret=str.toString();var replacer=function(search,replace,str){var tmp_arr=[];tmp_arr=str.split(search);return tmp_arr.join(replace);};histogram["'"]='%27';histogram['(']='%28';histogram[')']='%29';histogram['*']='%2A';histogram['~']='%7E';histogram['!']='%21';for(replace in histogram){search=histogram[replace];ret=replacer(search,replace,ret)} +ret=decodeURIComponent(ret);return ret;} +function rawurlencode(str){var histogram={},tmp_arr=[];var ret=str.toString();var replacer=function(search,replace,str){var tmp_arr=[];tmp_arr=str.split(search);return tmp_arr.join(replace);};histogram["'"]='%27';histogram['(']='%28';histogram[')']='%29';histogram['*']='%2A';histogram['~']='%7E';histogram['!']='%21';ret=encodeURIComponent(ret);ret=replacer('%20',' ',ret);for(search in histogram){replace=histogram[search];ret=replacer(search,replace,ret)} +return ret.replace(/(\%([a-z0-9]{2}))/g,function(full,m1,m2){return"%"+m2.toUpperCase();});return ret;} +function reset(arr){if(!this.php_js)this.php_js={};if(!this.php_js.pointers)this.php_js.pointers=[];var pointers=this.php_js.pointers;if(pointers.indexOf(arr)===-1){pointers.push(arr,0);} +var arrpos=pointers.indexOf(arr);if(!(arr instanceof Array)){for(var k in arr){if(pointers.indexOf(arr)===-1){pointers.push(arr,0);}else{pointers[arrpos+1]=0;} +return arr[k];} +return false;} +if(arr.length===0){return false;} +pointers[arrpos+1]=0;return arr[pointers[arrpos+1]];} +function round(val,precision){return parseFloat(parseFloat(val).toFixed(precision));} +function rsort(inputArr,sort_flags){var valArr=[],keyArr=[];var k='',i=0,sorter=false;for(k in inputArr){valArr.push(inputArr[k]);delete inputArr[k];} +switch(sort_flags){case'SORT_STRING':sorter=function(a,b){return strnatcmp(b,a);};break;case'SORT_LOCALE_STRING':sorter=function(a,b){return(b.localeCompare(a));};break;case'SORT_NUMERIC':sorter=function(a,b){return(b-a);};break;case'SORT_REGULAR':default:sorter=function(a,b){if(a<b) +return 1;if(a>b) +return-1;return 0;};break;} +valArr.sort(sorter);for(i=0;i<valArr.length;i++){inputArr[i]=valArr[i];} +return true;} +function rtrim(str,charlist){charlist=!charlist?' \s\xA0':(charlist+'').replace(/([\[\]\(\)\.\?\/\*\{\}\+\$\^\:])/g,'\$1');var re=new RegExp('['+charlist+']+$','g');return(str+'').replace(re,'');} +function serialize(mixed_value){var _getType=function(inp){var type=typeof inp,match;var key;if(type=='object'&&!inp){return'null';} +if(type=="object"){if(!inp.constructor){return'object';} +var cons=inp.constructor.toString();if(match=cons.match(/(\w+)\(/)){cons=match[1].toLowerCase();} +var types=["boolean","number","string","array"];for(key in types){if(cons==types[key]){type=types[key];break;}}} +return type;};var type=_getType(mixed_value);var val,ktype='';switch(type){case"function":val="";break;case"undefined":val="N";break;case"boolean":val="b:"+(mixed_value?"1":"0");break;case"number":val=(Math.round(mixed_value)==mixed_value?"i":"d")+":"+mixed_value;break;case"string":val="s:"+mixed_value.length+":\""+mixed_value+"\"";break;case"array":case"object":val="a";var count=0;var vals="";var okey;var key;for(key in mixed_value){ktype=_getType(mixed_value[key]);if(ktype=="function"){continue;} +okey=(key.match(/^[0-9]+$/)?parseInt(key):key);vals+=serialize(okey)+ +serialize(mixed_value[key]);count++;} +val+=":"+count+":{"+vals+"}";break;} +if(type!="object"&&type!="array")val+=";";return val;} +function setcookie(name,value,expires,path,domain,secure){return setrawcookie(name,encodeURIComponent(value),expires,path,domain,secure)} +function setrawcookie(name,value,expires,path,domain,secure){if(expires instanceof Date){expires=expires.toGMTString();}else if(typeof(expires)=='number'){expires=(new Date(+(new Date)+expires*1e3)).toGMTString();} +var r=[name+"="+value],s,i;for(i in s={expires:expires,path:path,domain:domain}){s[i]&&r.push(i+"="+s[i]);} +return secure&&r.push("secure"),document.cookie=r.join(";"),true;} +function settype(vr,type){var is_array=function(arr){return typeof arr==='object'&&typeof arr.length==='number'&&!(arr.propertyIsEnumerable('length'))&&typeof arr.splice==='function';};var v,mtch,i,obj;v=this[vr]?this[vr]:vr;try{switch(type){case'boolean':if(is_array(v)&&v.length===0){this[vr]=false;} +else if(v==='0'){this[vr]=false;} +else if(typeof v==='object'&&!is_array(v)){var lgth=false;for(i in v){lgth=true;} +this[vr]=lgth;} +else{this[vr]=!!v;} +break;case'integer':if(typeof v==='number'){this[vr]=parseInt(v,10);} +else if(typeof v==='string'){mtch=v.match(/^([+-]?)(\d+)/);if(!mtch){this[vr]=0;} +else{this[vr]=parseInt(v,10);}} +else if(v===true){this[vr]=1;} +else if(v===false||v===null){this[vr]=0;} +else if(is_array(v)&&v.length===0){this[vr]=0;} +else if(typeof v==='object'){this[vr]=1;} +break;case'float':if(typeof v==='string'){mtch=v.match(/^([+-]?)(\d+(\.\d+)?|\.\d+)([eE][+-]?\d+)?/);if(!mtch){this[vr]=0;} +else{this[vr]=parseFloat(v,10);}} +else if(v===true){this[vr]=1;} +else if(v===false||v===null){this[vr]=0;} +else if(is_array(v)&&v.length===0){this[vr]=0;} +else if(typeof v==='object'){this[vr]=1;} +break;case'string':if(v===null||v===false){this[vr]='';} +else if(is_array(v)){this[vr]='Array';} +else if(typeof v==='object'){this[vr]='Object';} +else if(v===true){this[vr]='1';} +else{this[vr]+='';} +break;case'array':if(v===null){this[vr]=[];} +else if(typeof v!=='object'){this[vr]=[v];} +break;case'object':if(v===null){this[vr]={};} +else if(is_array(v)){for(i=0,obj={};i<v.length;i++){obj[i]=v;} +this[vr]=obj;} +else if(typeof v!=='object'){this[vr]={scalar:v};} +break;case'null':delete this[vr];break;} +return true;}catch(e){return false;}} +function sha1(str){var rotate_left=function(n,s){var t4=(n<<s)|(n>>>(32-s));return t4;};var lsb_hex=function(val){var str="";var i;var vh;var vl;for(i=0;i<=6;i+=2){vh=(val>>>(i*4+4))&0x0f;vl=(val>>>(i*4))&0x0f;str+=vh.toString(16)+vl.toString(16);} +return str;};var cvt_hex=function(val){var str="";var i;var v;for(i=7;i>=0;i--){v=(val>>>(i*4))&0x0f;str+=v.toString(16);} +return str;};var blockstart;var i,j;var W=new Array(80);var H0=0x67452301;var H1=0xEFCDAB89;var H2=0x98BADCFE;var H3=0x10325476;var H4=0xC3D2E1F0;var A,B,C,D,E;var temp;str=utf8_encode(str);var str_len=str.length;var word_array=[];for(i=0;i<str_len-3;i+=4){j=str.charCodeAt(i)<<24|str.charCodeAt(i+1)<<16|str.charCodeAt(i+2)<<8|str.charCodeAt(i+3);word_array.push(j);} +switch(str_len%4){case 0:i=0x080000000;break;case 1:i=str.charCodeAt(str_len-1)<<24|0x0800000;break;case 2:i=str.charCodeAt(str_len-2)<<24|str.charCodeAt(str_len-1)<<16|0x08000;break;case 3:i=str.charCodeAt(str_len-3)<<24|str.charCodeAt(str_len-2)<<16|str.charCodeAt(str_len-1)<<8|0x80;break;} +word_array.push(i);while((word_array.length%16)!=14)word_array.push(0);word_array.push(str_len>>>29);word_array.push((str_len<<3)&0x0ffffffff);for(blockstart=0;blockstart<word_array.length;blockstart+=16){for(i=0;i<16;i++)W[i]=word_array[blockstart+i];for(i=16;i<=79;i++)W[i]=rotate_left(W[i-3]^W[i-8]^W[i-14]^W[i-16],1);A=H0;B=H1;C=H2;D=H3;E=H4;for(i=0;i<=19;i++){temp=(rotate_left(A,5)+((B&C)|(~B&D))+E+W[i]+0x5A827999)&0x0ffffffff;E=D;D=C;C=rotate_left(B,30);B=A;A=temp;} +for(i=20;i<=39;i++){temp=(rotate_left(A,5)+(B^C^D)+E+W[i]+0x6ED9EBA1)&0x0ffffffff;E=D;D=C;C=rotate_left(B,30);B=A;A=temp;} +for(i=40;i<=59;i++){temp=(rotate_left(A,5)+((B&C)|(B&D)|(C&D))+E+W[i]+0x8F1BBCDC)&0x0ffffffff;E=D;D=C;C=rotate_left(B,30);B=A;A=temp;} +for(i=60;i<=79;i++){temp=(rotate_left(A,5)+(B^C^D)+E+W[i]+0xCA62C1D6)&0x0ffffffff;E=D;D=C;C=rotate_left(B,30);B=A;A=temp;} +H0=(H0+A)&0x0ffffffff;H1=(H1+B)&0x0ffffffff;H2=(H2+C)&0x0ffffffff;H3=(H3+D)&0x0ffffffff;H4=(H4+E)&0x0ffffffff;} +temp=cvt_hex(H0)+cvt_hex(H1)+cvt_hex(H2)+cvt_hex(H3)+cvt_hex(H4);return temp.toLowerCase();} +function shuffle(inputArr){var valArr=[];var k='',i=0;for(k in inputArr){valArr.push(inputArr[k]);delete inputArr[k];} +valArr.sort(function(){return 0.5-Math.random();});for(i=0;i<valArr.length;i++){inputArr[i]=valArr[i];} +return true;} +function sin(arg){return Math.sin(arg);} +function sinh(arg){return(Math.exp(arg)-Math.exp(-arg))/2;} +function sizeof(mixed_var,mode){return count(mixed_var,mode);} +function sort(inputArr,sort_flags){var valArr=[],keyArr=[];var k='',i=0,sorter=false;for(k in inputArr){valArr.push(inputArr[k]);delete inputArr[k];} +switch(sort_flags){case'SORT_STRING':sorter=function(a,b){return strnatcmp(a,b);};break;case'SORT_LOCALE_STRING':sorter=function(a,b){return(a.localeCompare(b));};break;case'SORT_NUMERIC':sorter=function(a,b){return(a-b);};break;case'SORT_REGULAR':default:sorter=function(a,b){if(a>b) +return 1;if(a<b) +return-1;return 0;};break;} +valArr.sort(sorter);for(i=0;i<valArr.length;i++){inputArr[i]=valArr[i];} +return true;} +function soundex(str){var s='';var i,j,l,p=isNaN(p)?4:p>10?10:p<4?4:p;var m={BFPV:1,CGJKQSXZ:2,DT:3,L:4,MN:5,R:6};var r=(s=(str+'').toUpperCase().replace(/[^A-Z]/g,"").split("")).splice(0,1);var sl=0;sl=s.length;for(i=-1,l=sl;++i<l;){for(j in m){if(j.indexOf(s[i])+1&&r[r.length-1]!=m[j]&&r.push(m[j])){break;}}} +return r.length>p&&(r.length=p),r.join("")+(new Array(p-r.length+1)).join("0");} +function split(delimiter,string){return explode(delimiter,string);} +function sprintf(){var regex=/%%|%(\d+\$)?([-+\'#0 ]*)(\*\d+\$|\*|\d+)?(\.(\*\d+\$|\*|\d+))?([scboxXuidfegEG])/g;var a=arguments,i=0,format=a[i++];var pad=function(str,len,chr,leftJustify){if(!chr)chr=' ';var padding=(str.length>=len)?'':Array(1+len-str.length>>>0).join(chr);return leftJustify?str+padding:padding+str;};var justify=function(value,prefix,leftJustify,minWidth,zeroPad,customPadChar){var diff=minWidth-value.length;if(diff>0){if(leftJustify||!zeroPad){value=pad(value,minWidth,customPadChar,leftJustify);}else{value=value.slice(0,prefix.length)+pad('',diff,'0',true)+value.slice(prefix.length);}} +return value;};var formatBaseX=function(value,base,prefix,leftJustify,minWidth,precision,zeroPad){var number=value>>>0;prefix=prefix&&number&&{'2':'0b','8':'0','16':'0x'}[base]||'';value=prefix+pad(number.toString(base),precision||0,'0',false);return justify(value,prefix,leftJustify,minWidth,zeroPad);};var formatString=function(value,leftJustify,minWidth,precision,zeroPad,customPadChar){if(precision!=null){value=value.slice(0,precision);} +return justify(value,'',leftJustify,minWidth,zeroPad,customPadChar);};var doFormat=function(substring,valueIndex,flags,minWidth,_,precision,type){var number;var prefix;var method;var textTransform;var value;if(substring=='%%')return'%';var leftJustify=false,positivePrefix='',zeroPad=false,prefixBaseX=false,customPadChar=' ';var flagsl=flags.length;for(var j=0;flags&&j<flagsl;j++)switch(flags.charAt(j)){case' ':positivePrefix=' ';break;case'+':positivePrefix='+';break;case'-':leftJustify=true;break;case"'":customPadChar=flags.charAt(j+1);break;case'0':zeroPad=true;break;case'#':prefixBaseX=true;break;} +if(!minWidth){minWidth=0;}else if(minWidth=='*'){minWidth=+a[i++];}else if(minWidth.charAt(0)=='*'){minWidth=+a[minWidth.slice(1,-1)];}else{minWidth=+minWidth;} +if(minWidth<0){minWidth=-minWidth;leftJustify=true;} +if(!isFinite(minWidth)){throw new Error('sprintf: (minimum-)width must be finite');} +if(!precision){precision='fFeE'.indexOf(type)>-1?6:(type=='d')?0:void(0);}else if(precision=='*'){precision=+a[i++];}else if(precision.charAt(0)=='*'){precision=+a[precision.slice(1,-1)];}else{precision=+precision;} +value=valueIndex?a[valueIndex.slice(0,-1)]:a[i++];switch(type){case's':return formatString(String(value),leftJustify,minWidth,precision,zeroPad,customPadChar);case'c':return formatString(String.fromCharCode(+value),leftJustify,minWidth,precision,zeroPad);case'b':return formatBaseX(value,2,prefixBaseX,leftJustify,minWidth,precision,zeroPad);case'o':return formatBaseX(value,8,prefixBaseX,leftJustify,minWidth,precision,zeroPad);case'x':return formatBaseX(value,16,prefixBaseX,leftJustify,minWidth,precision,zeroPad);case'X':return formatBaseX(value,16,prefixBaseX,leftJustify,minWidth,precision,zeroPad).toUpperCase();case'u':return formatBaseX(value,10,prefixBaseX,leftJustify,minWidth,precision,zeroPad);case'i':case'd':{number=parseInt(+value);prefix=number<0?'-':positivePrefix;value=prefix+pad(String(Math.abs(number)),precision,'0',false);return justify(value,prefix,leftJustify,minWidth,zeroPad);} +case'e':case'E':case'f':case'F':case'g':case'G':{number=+value;prefix=number<0?'-':positivePrefix;method=['toExponential','toFixed','toPrecision']['efg'.indexOf(type.toLowerCase())];textTransform=['toString','toUpperCase']['eEfFgG'.indexOf(type)%2];value=prefix+Math.abs(number)[method](precision);return justify(value,prefix,leftJustify,minWidth,zeroPad)[textTransform]();} +default:return substring;}};return format.replace(regex,doFormat);} +function sqrt(arg){return Math.sqrt(arg);} +function str_ireplace(search,replace,subject){var i,k='';var searchl=0;var reg;search+='';searchl=search.length;if(!(replace instanceof Array)){replace=new Array(replace);if(search instanceof Array){while(searchl>replace.length){replace[replace.length]=replace[0];}}} +if(!(search instanceof Array)){search=new Array(search);} +while(search.length>replace.length){replace[replace.length]='';} +if(subject instanceof Array){for(k in subject){subject[k]=str_ireplace(search,replace,subject[k]);} +return subject;} +searchl=search.length;for(i=0;i<searchl;i++){reg=new RegExp(search[i],'gi');subject=subject.replace(reg,replace[i]);} +return subject;} +function str_pad(input,pad_length,pad_string,pad_type){var half='',pad_to_go;var str_pad_repeater=function(s,len){var collect='',i;while(collect.length<len)collect+=s;collect=collect.substr(0,len);return collect;};input+='';if(pad_type!='STR_PAD_LEFT'&&pad_type!='STR_PAD_RIGHT'&&pad_type!='STR_PAD_BOTH'){pad_type='STR_PAD_RIGHT';} +if((pad_to_go=pad_length-input.length)>0){if(pad_type=='STR_PAD_LEFT'){input=str_pad_repeater(pad_string,pad_to_go)+input;} +else if(pad_type=='STR_PAD_RIGHT'){input=input+str_pad_repeater(pad_string,pad_to_go);} +else if(pad_type=='STR_PAD_BOTH'){half=str_pad_repeater(pad_string,Math.ceil(pad_to_go/2));input=half+input+half;input=input.substr(0,pad_length);}} +return input;} +function str_repeat(input,multiplier){return new Array(multiplier+1).join(input);} +function str_replace(search,replace,subject){var s=subject;var ra=r instanceof Array,sa=s instanceof Array;var f=[].concat(search);var r=[].concat(replace);var i=(s=[].concat(s)).length;var j=0;while(j=0,i--){if(s[i]){while(s[i]=(s[i]+'').split(f[j]).join(ra?r[j]||"":r[0]),++j in f){};}} +return sa?s:s[0];} +function str_rot13(str){return(str+'').replace(/[A-Za-z]/g,function(c){return String.fromCharCode((((c=c.charCodeAt(0))&223)-52)%26+(c&32)+65);});} +function str_shuffle(str){if(str==undefined){throw'Wrong parameter count for str_shuffle()';} +var getRandomInt=function(max){return Math.floor(Math.random()*(max+1));};var newStr='',rand=0;while(str.length){rand=getRandomInt(str.length-1);newStr+=str[rand];str=str.substring(0,rand)+str.substr(rand+1);} +return newStr;} +function str_split(f_string,f_split_length){f_string+='';if(f_split_length==undefined){f_split_length=1;} +if(f_split_length>0){var result=[];while(f_string.length>f_split_length){result[result.length]=f_string.substring(0,f_split_length);f_string=f_string.substring(f_split_length);} +result[result.length]=f_string;return result;} +return false;} +function strcasecmp(f_string1,f_string2){var string1=(f_string1+'').toLowerCase();var string2=(f_string2+'').toLowerCase();if(string1>string2){return 1;} +else if(string1==string2){return 0;} +return-1;} +function strchr(haystack,needle,bool){return strstr(haystack,needle,bool);} +function strcmp(str1,str2){return((str1==str2)?0:((str1>str2)?1:-1));} +function strcspn(str,mask,start,length){start=start?start:0;var count=(length&&((start+length)<str.length))?start+length:str.length;strct:for(var i=start,lgth=0;i<count;i++){for(var j=0;j<mask.length;j++){if(str[i].indexOf(mask[j])!==-1){continue strct;}} +++lgth;} +return lgth;} +function strip_tags(str,allowed_tags){var key='',allowed=false;var matches=[];var allowed_array=[];var allowed_tag='';var i=0;var k='';var html='';var replacer=function(search,replace,str){return str.split(search).join(replace);};if(allowed_tags){allowed_array=allowed_tags.match(/([a-zA-Z]+)/gi);} +str+='';matches=str.match(/(<\/?[\S][^>]*>)/gi);for(key in matches){if(isNaN(key)){continue;} +html=matches[key].toString();allowed=false;for(k in allowed_array){allowed_tag=allowed_array[k];i=-1;if(i!=0){i=html.toLowerCase().indexOf('<'+allowed_tag+'>');} +if(i!=0){i=html.toLowerCase().indexOf('<'+allowed_tag+' ');} +if(i!=0){i=html.toLowerCase().indexOf('</'+allowed_tag);} +if(i==0){allowed=true;break;}} +if(!allowed){str=replacer(html,"",str);}} +return str;} +function stripos(f_haystack,f_needle,f_offset){var haystack=(f_haystack+'').toLowerCase();var needle=(f_needle+'').toLowerCase();var index=0;if((index=haystack.indexOf(needle,f_offset))!==-1){return index;} +return false;} +function stripslashes(str){return(str+'').replace(/\0/g,'0').replace(/\\([\\'"])/g,'$1');} +function stristr(haystack,needle,bool){var pos=0;haystack+='';pos=haystack.toLowerCase().indexOf((needle+'').toLowerCase());if(pos==-1){return false;}else{if(bool){return haystack.substr(0,pos);}else{return haystack.slice(pos);}}} +function strlen(string){var str=string+'';var i=0,chr='',lgth=0;var getWholeChar=function(str,i){var code=str.charCodeAt(i);var next='',prev='';if(0xD800<=code&&code<=0xDBFF){if(str.length<=(i+1)){throw'High surrogate without following low surrogate';} +next=str.charCodeAt(i+1);if(0xDC00>next||next>0xDFFF){throw'High surrogate without following low surrogate';} +return str[i]+str[i+1];}else if(0xDC00<=code&&code<=0xDFFF){if(i===0){throw'Low surrogate without preceding high surrogate';} +prev=str.charCodeAt(i-1);if(0xD800>prev||prev>0xDBFF){throw'Low surrogate without preceding high surrogate';} +return false;} +return str[i];};for(i=0,lgth=0;i<str.length;i++){if((chr=getWholeChar(str,i))===false){continue;} +lgth++;} +return lgth;} +function strnatcasecmp(str1,str2){a=(str1+'').toLowerCase();b=(str2+'').toLowerCase();var isWhitespaceChar=function(a){return a.charCodeAt(0)<=32;} +var isDigitChar=function(a){var charCode=a.charCodeAt(0);return(charCode>=48&&charCode<=57);} +var compareRight=function(a,b){var bias=0;var ia=0;var ib=0;var ca;var cb;for(;;ia++,ib++){ca=a.charAt(ia);cb=b.charAt(ib);if(!isDigitChar(ca)&&!isDigitChar(cb)){return bias;}else if(!isDigitChar(ca)){return-1;}else if(!isDigitChar(cb)){return+1;}else if(ca<cb){if(bias==0){bias=-1;}}else if(ca>cb){if(bias==0) +bias=+1;}else if(ca==0&&cb==0){return bias;}}} +var ia=0,ib=0;var nza=0,nzb=0;var ca,cb;var result;while(true){nza=nzb=0;ca=a.charAt(ia);cb=b.charAt(ib);while(isWhitespaceChar(ca)||ca=='0'){if(ca=='0'){nza++;}else{nza=0;} +ca=a.charAt(++ia);} +while(isWhitespaceChar(cb)||cb=='0'){if(cb=='0'){nzb++;}else{nzb=0;} +cb=b.charAt(++ib);} +if(isDigitChar(ca)&&isDigitChar(cb)){if((result=compareRight(a.substring(ia),b.substring(ib)))!=0){return result;}} +if(ca==0&&cb==0){return nza-nzb;} +if(ca<cb){return-1;}else if(ca>cb){return+1;} +++ia;++ib;}} +function strnatcmp(f_string1,f_string2,f_version){if(f_version==undefined){f_version=false;} +var __strnatcmp_split=function(f_string){var result=[];var buffer='';var chr='';var i=0,f_stringl=0;var text=true;f_stringl=f_string.length;for(i=0;i<f_stringl;i++){chr=f_string.substring(i,i+1);if(chr.match(/[0-9]/)){if(text){if(buffer.length>0){result[result.length]=buffer;buffer='';} +text=false;} +buffer+=chr;}else if((text==false)&&(chr=='.')&&(i<(f_string.length-1))&&(f_string.substring(i+1,i+2).match(/[0-9]/))){result[result.length]=buffer;buffer='';}else{if(text==false){if(buffer.length>0){result[result.length]=parseInt(buffer);buffer='';} +text=true;} +buffer+=chr;}} +if(buffer.length>0){if(text){result[result.length]=buffer;}else{result[result.length]=parseInt(buffer);}} +return result;};var array1=__strnatcmp_split(f_string1+'');var array2=__strnatcmp_split(f_string2+'');var len=array1.length;var text=true;var result=-1;var r=0;if(len>array2.length){len=array2.length;result=1;} +for(i=0;i<len;i++){if(isNaN(array1[i])){if(isNaN(array2[i])){text=true;if((r=strcmp(array1[i],array2[i]))!=0){return r;}}else if(text){return 1;}else{return-1;}}else if(isNaN(array2[i])){if(text){return-1;}else{return 1;}}else{if(text||f_version){if((r=(array1[i]-array2[i]))!=0){return r;}}else{if((r=strcmp(array1[i].toString(),array2[i].toString()))!=0){return r;}} +text=false;}} +return result;} +function strncasecmp(argStr1,argStr2,len){var diff,i=0;var str1=(argStr1+'').toLowerCase().substr(0,len);var str2=(argStr2+'').toLowerCase().substr(0,len);if(str1.length!==str2.length){if(str1.length<str2.length){len=str1.length;if(str2.substr(0,str1.length)==str1){return str1.length-str2.length;}}else{len=str2.length;if(str1.substr(0,str2.length)==str2){return str1.length-str2.length;}}}else{len=str1.length;} +for(diff=0,i=0;i<len;i++){diff=str1.charCodeAt(i)-str2.charCodeAt(i);if(diff!==0){return diff;}} +return 0;} +function strncmp(str1,str2,lgth){var s1=(str1+'').substr(0,lgth);var s2=(str2+'').substr(0,lgth);return((s1==s2)?0:((s1>s2)?1:-1));} +function strpbrk(haystack,char_list){haystack+='';char_list+='';var lon=haystack.length;var lon_search=char_list.length;var ret=false;var stack='';var i=0,j=0;if(lon>=lon_search){if(lon==lon_search){if(haystack==char_list){ret=haystack;}}else{j=0;i=0;while(i<lon_search&&j<lon&&!ret){if(char_list[i]==haystack[j]){i++;if(i==lon_search){ret=true;}} +j++;} +if(ret){for(i=(j-lon_search);i<lon;i++){stack+=haystack[i];}} +if(stack!=''){ret=stack;}}} +return ret;} +function strpos(haystack,needle,offset){var i=(haystack+'').indexOf(needle,offset);return i===-1?false:i;} +function strrchr(haystack,needle){var pos=0;if(typeof needle!=='string'){needle=String.fromCharCode(parseInt(needle,10));} +needle=needle[0];pos=haystack.lastIndexOf(needle);if(pos===-1){return false;} +return haystack.substr(pos);} +function strrev(string){var ret='',i=0;string+='';for(i=string.length-1;i>=0;i--){ret+=string.charAt(i);} +return ret;} +function strripos(haystack,needle,offset){var i=(haystack+'').toLowerCase().lastIndexOf((needle+'').toLowerCase(),offset);return i>=0?i:false;} +function strrpos(haystack,needle,offset){var i=(haystack+'').lastIndexOf(needle,offset);return i>=0?i:false;} +function strspn(str1,str2,start,lgth){var found;var stri;var strj;var j=0;var i=0;start=start?(start<0?(str1.length+start):start):0;lgth=lgth?((lgth<0)?(str1.length+lgth-start):lgth):str1.length-start;str1=str1.substr(start,lgth);for(i=0;i<str1.length;i++){found=0;stri=str1.substring(i,i+1);for(j=0;j<=str2.length;j++){strj=str2.substring(j,j+1);if(stri==strj){found=1;break;}} +if(found!=1){return i;}} +return i;} +function strstr(haystack,needle,bool){var pos=0;haystack+='';pos=haystack.indexOf(needle);if(pos==-1){return false;}else{if(bool){return haystack.substr(0,pos);}else{return haystack.slice(pos);}}} +function strtok(str,tokens){if(tokens===undefined){tokens=str;str=strtok.leftOver;} +if(str.length===0){return false;} +if(tokens.indexOf(str[0])!==-1){return strtok(str.substr(1),tokens);} +for(var i=0;i<str.length;i++){if(tokens.indexOf(str[i])!==-1){break;}} +strtok.leftOver=str.substr(i+1);return str.substring(0,i);} +function strtolower(str){return(str+'').toLowerCase();} +function strtotime(str,now){var i,match,s,strTmp='',parse='';strTmp=str;strTmp=strTmp.replace(/\s{2,}|^\s|\s$/g,' ');strTmp=strTmp.replace(/[\t\r\n]/g,'');if(strTmp=='now'){return(new Date()).getTime();}else if(!isNaN(parse=Date.parse(strTmp))){return parse/1000;}else if(now){now=new Date(now);}else{now=new Date();} +strTmp=strTmp.toLowerCase();var process=function(m){var ago=(m[2]&&m[2]=='ago');var num=(num=m[0]=='last'?-1:1)*(ago?-1:1);switch(m[0]){case'last':case'next':switch(m[1].substring(0,3)){case'yea':now.setFullYear(now.getFullYear()+num);break;case'mon':now.setMonth(now.getMonth()+num);break;case'wee':now.setDate(now.getDate()+(num*7));break;case'day':now.setDate(now.getDate()+num);break;case'hou':now.setHours(now.getHours()+num);break;case'min':now.setMinutes(now.getMinutes()+num);break;case'sec':now.setSeconds(now.getSeconds()+num);break;default:var day;if(typeof(day=__is_day[m[1].substring(0,3)])!='undefined'){var diff=day-now.getDay();if(diff==0){diff=7*num;}else if(diff>0){if(m[0]=='last')diff-=7;}else{if(m[0]=='next')diff+=7;} +now.setDate(now.getDate()+diff);}} +break;default:if(/\d+/.test(m[0])){num*=parseInt(m[0]);switch(m[1].substring(0,3)){case'yea':now.setFullYear(now.getFullYear()+num);break;case'mon':now.setMonth(now.getMonth()+num);break;case'wee':now.setDate(now.getDate()+(num*7));break;case'day':now.setDate(now.getDate()+num);break;case'hou':now.setHours(now.getHours()+num);break;case'min':now.setMinutes(now.getMinutes()+num);break;case'sec':now.setSeconds(now.getSeconds()+num);break;}}else{return false;} +break;} +return true;} +var __is={day:{'sun':0,'mon':1,'tue':2,'wed':3,'thu':4,'fri':5,'sat':6},mon:{'jan':0,'feb':1,'mar':2,'apr':3,'may':4,'jun':5,'jul':6,'aug':7,'sep':8,'oct':9,'nov':10,'dec':11}} +match=strTmp.match(/^(\d{2,4}-\d{2}-\d{2})(\s\d{1,2}:\d{1,2}(:\d{1,2})?)?$/);if(match!=null){if(!match[2]){match[2]='00:00:00';}else if(!match[3]){match[2]+=':00';} +s=match[1].split(/-/g);for(i in __is.mon){if(__is.mon[i]==s[1]-1){s[1]=i;}} +return strtotime(s[2]+' '+s[1]+' '+s[0]+' '+match[2]);} +var regex='([+-]?\\d+\\s' ++'(years?|months?|weeks?|days?|hours?|min|minutes?|sec|seconds?' ++'|sun\.?|sunday|mon\.?|monday|tue\.?|tuesday|wed\.?|wednesday' ++'|thu\.?|thursday|fri\.?|friday|sat\.?|saturday)' ++'|(last|next)\\s' ++'(years?|months?|weeks?|days?|hours?|min|minutes?|sec|seconds?' ++'|sun\.?|sunday|mon\.?|monday|tue\.?|tuesday|wed\.?|wednesday' ++'|thu\.?|thursday|fri\.?|friday|sat\.?|saturday))' ++'(\\sago)?';match=strTmp.match(new RegExp(regex,'g'));if(match==null){return false;} +for(i in match){if(!process(match[i].split(' '))){return false;}} +return(now);} +function strtoupper(str){return(str+'').toUpperCase();} +function strtr(str,from,to){var fr='',i=0,lgth=0;if(typeof from==='object'){for(fr in from){str=str.replace(fr,from[fr]);} +return str;} +lgth=to.length;if(from.length<to.length){lgth=from.length;} +for(i=0;i<lgth;i++){str=str.replace(from[i],to[i],'g');} +return str;} +function substr(f_string,f_start,f_length){f_string+='';if(f_start<0){f_start+=f_string.length;} +if(f_length==undefined){f_length=f_string.length;}else if(f_length<0){f_length+=f_string.length;}else{f_length+=f_start;} +if(f_length<f_start){f_length=f_start;} +return f_string.substring(f_start,f_length);} +function substr_count(haystack,needle,offset,length){var pos=0,cnt=0;haystack+='';needle+='';if(isNaN(offset))offset=0;if(isNaN(length))length=0;offset--;while((offset=haystack.indexOf(needle,offset+1))!=-1){if(length>0&&(offset+needle.length)>length){return false;}else{cnt++;}} +return cnt;} +function tan(arg){return Math.tan(arg);} +function tanh(arg){return(Math.exp(arg)-Math.exp(-arg))/(Math.exp(arg)+Math.exp(-arg));} +function time(){return Math.round(new Date().getTime()/1000);} +function trim(str,charlist){var whitespace,l=0,i=0;str+='';if(!charlist){whitespace=" \n\r\t\f\x0b\xa0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000";}else{charlist+='';whitespace=charlist.replace(/([\[\]\(\)\.\?\/\*\{\}\+\$\^\:])/g,'\$1');} +l=str.length;for(i=0;i<l;i++){if(whitespace.indexOf(str.charAt(i))===-1){str=str.substring(i);break;}} +l=str.length;for(i=l-1;i>=0;i--){if(whitespace.indexOf(str.charAt(i))===-1){str=str.substring(0,i+1);break;}} +return whitespace.indexOf(str.charAt(0))===-1?str:'';} +function uasort(inputArr,sorter){if(typeof sorter==='string'){sorter=this[sorter];}else if(sorter instanceof Array){sorter=this[sorter[0]][sorter[1]];} +var valArr=[],keyArr=[],tempKeyVal,tempValue,ret;var k='',i=0;var sorterNew=function(keyArr,valArr){for(var i=valArr.length-2;i>=0;i--){for(var j=0;j<=i;j++){ret=sorter(valArr[j+1],valArr[j]);if(ret<0){tempValue=valArr[j];valArr[j]=valArr[j+1];valArr[j+1]=tempValue;tempKeyVal=keyArr[j];keyArr[j]=keyArr[j+1];keyArr[j+1]=tempKeyVal;}}}} +for(k in inputArr){valArr.push(inputArr[k]);keyArr.push(k);delete inputArr[k];} +try{sorterNew(keyArr,valArr);}catch(e){return false;} +for(i=0;i<valArr.length;i++){inputArr[keyArr[i]]=valArr[i];} +return true;} +function ucfirst(str){str+='';var f=str.charAt(0).toUpperCase();return f+str.substr(1);} +function ucwords(str){return(str+'').replace(/^(.)|\s(.)/g,function($1){return $1.toUpperCase();});} +function uksort(array,sorter){if(typeof sorter==='string'){sorter=window[sorter];} +var tmp_arr={},keys=[],i=0,key='';for(key in array){keys.push(key);} +try{if(sorter){keys.sort(sorter);}else{keys.sort();}}catch(e){return false;} +for(i=0;i<keys.length;i++){key=keys[i];tmp_arr[key]=array[key];delete array[key];} +for(i in tmp_arr){array[i]=tmp_arr[i]} +return true;} +function unserialize(data){var error=function(type,msg,filename,line){throw new window[type](msg,filename,line);};var read_until=function(data,offset,stopchr){var buf=[];var chr=data.slice(offset,offset+1);var i=2;while(chr!=stopchr){if((i+offset)>data.length){error('Error','Invalid');} +buf.push(chr);chr=data.slice(offset+(i-1),offset+i);i+=1;} +return[buf.length,buf.join('')];};var read_chrs=function(data,offset,length){var buf;buf=[];for(var i=0;i<length;i++){var chr=data.slice(offset+(i-1),offset+i);buf.push(chr);} +return[buf.length,buf.join('')];};var _unserialize=function(data,offset){var readdata;var readData;var chrs=0;var ccount;var stringlength;var keyandchrs;var keys;if(!offset)offset=0;var dtype=(data.slice(offset,offset+1)).toLowerCase();var dataoffset=offset+2;var typeconvert=new Function('x','return x');switch(dtype){case"i":typeconvert=new Function('x','return parseInt(x)');readData=read_until(data,dataoffset,';');chrs=readData[0];readdata=readData[1];dataoffset+=chrs+1;break;case"b":typeconvert=new Function('x','return (parseInt(x) == 1)');readData=read_until(data,dataoffset,';');chrs=readData[0];readdata=readData[1];dataoffset+=chrs+1;break;case"d":typeconvert=new Function('x','return parseFloat(x)');readData=read_until(data,dataoffset,';');chrs=readData[0];readdata=readData[1];dataoffset+=chrs+1;break;case"n":readdata=null;break;case"s":ccount=read_until(data,dataoffset,':');chrs=ccount[0];stringlength=ccount[1];dataoffset+=chrs+2;readData=read_chrs(data,dataoffset+1,parseInt(stringlength));chrs=readData[0];readdata=readData[1];dataoffset+=chrs+2;if(chrs!=parseInt(stringlength)&&chrs!=readdata.length){error('SyntaxError','String length mismatch');} +break;case"a":readdata={};keyandchrs=read_until(data,dataoffset,':');chrs=keyandchrs[0];keys=keyandchrs[1];dataoffset+=chrs+2;for(var i=0;i<parseInt(keys);i++){var kprops=_unserialize(data,dataoffset);var kchrs=kprops[1];var key=kprops[2];dataoffset+=kchrs;var vprops=_unserialize(data,dataoffset);var vchrs=vprops[1];var value=vprops[2];dataoffset+=vchrs;readdata[key]=value;} +dataoffset+=1;break;default:error('SyntaxError','Unknown / Unhandled data type(s): '+dtype);break;} +return[dtype,dataoffset-offset,typeconvert(readdata)];};return _unserialize(data,0)[2];} +function urldecode(str){var histogram={};var ret=str.toString();var replacer=function(search,replace,str){var tmp_arr=[];tmp_arr=str.split(search);return tmp_arr.join(replace);};histogram["'"]='%27';histogram['(']='%28';histogram[')']='%29';histogram['*']='%2A';histogram['~']='%7E';histogram['!']='%21';histogram['%20']='+';for(replace in histogram){search=histogram[replace];ret=replacer(search,replace,ret)} +ret=decodeURIComponent(ret);return ret;} +function urlencode(str){var histogram={},tmp_arr=[];var ret=str.toString();var replacer=function(search,replace,str){var tmp_arr=[];tmp_arr=str.split(search);return tmp_arr.join(replace);};histogram["'"]='%27';histogram['(']='%28';histogram[')']='%29';histogram['*']='%2A';histogram['~']='%7E';histogram['!']='%21';histogram['%20']='+';ret=encodeURIComponent(ret);for(search in histogram){replace=histogram[search];ret=replacer(search,replace,ret)} +return ret.replace(/(\%([a-z0-9]{2}))/g,function(full,m1,m2){return"%"+m2.toUpperCase();});return ret;} +function usort(inputArr,sorter){var valArr=[],keyArr=[];var k='',i=0;if(typeof sorter==='string'){sorter=this[sorter];}else if(sorter instanceof Array){sorter=this[sorter[0]][sorter[1]];} +for(k in inputArr){valArr.push(inputArr[k]);delete inputArr[k];} +try{valArr.sort(sorter);}catch(e){return false;} +for(i=0;i<valArr.length;i++){inputArr[i]=valArr[i];} +return true;} +function utf8_decode(str_data){var tmp_arr=[],i=0,ac=0,c1=0,c2=0,c3=0;str_data+='';while(i<str_data.length){c1=str_data.charCodeAt(i);if(c1<128){tmp_arr[ac++]=String.fromCharCode(c1);i++;}else if((c1>191)&&(c1<224)){c2=str_data.charCodeAt(i+1);tmp_arr[ac++]=String.fromCharCode(((c1&31)<<6)|(c2&63));i+=2;}else{c2=str_data.charCodeAt(i+1);c3=str_data.charCodeAt(i+2);tmp_arr[ac++]=String.fromCharCode(((c1&15)<<12)|((c2&63)<<6)|(c3&63));i+=3;}} +return tmp_arr.join('');} +function utf8_encode(string){string=(string+'').replace(/\r\n/g,"\n").replace(/\r/g,"\n");var utftext="";var start,end;var stringl=0;start=end=0;stringl=string.length;for(var n=0;n<stringl;n++){var c1=string.charCodeAt(n);var enc=null;if(c1<128){end++;}else if((c1>127)&&(c1<2048)){enc=String.fromCharCode((c1>>6)|192)+String.fromCharCode((c1&63)|128);}else{enc=String.fromCharCode((c1>>12)|224)+String.fromCharCode(((c1>>6)&63)|128)+String.fromCharCode((c1&63)|128);} +if(enc!=null){if(end>start){utftext+=string.substring(start,end);} +utftext+=enc;start=end=n+1;}} +if(end>start){utftext+=string.substring(start,string.length);} +return utftext;} +function var_export(mixed_expression,bool_return){var retstr="";var iret="";var cnt=0;var x=[];var key='',i=0;var __getType=function(inp){var type=typeof inp,match;if(type=='object'&&!inp){return'null';} +if(type=="object"){if(!inp.constructor){return'object';} +var cons=inp.constructor.toString();if(match=cons.match(/(\w+)\(/)){cons=match[1].toLowerCase();} +var types=["boolean","number","string","array"];for(key in types){if(cons==types[key]){type=types[key];break;}}} +return type;};var type=__getType(mixed_expression);if(type===null){retstr="NULL";}else if(type=='array'||type=='object'){for(i in mixed_expression){x[cnt++]=var_export(i,true)+" => "+var_export(mixed_expression[i],true);} +iret=x.join(',\n ');retstr="array (\n "+iret+"\n)";}else{retstr=(!isNaN(mixed_expression))?mixed_expression:"'"+mixed_expression.replace('/(["\'\])/g',"\\$1").replace('/\0/g',"\\0")+"'";} +if(bool_return!=true){echo(retstr);return null;}else{return retstr;}} +function vsprintf(format,args){return sprintf.apply(this,[format].concat(args));} +function wordwrap(str,int_width,str_break,cut){var m=((arguments.length>=2)?arguments[1]:75);var b=((arguments.length>=3)?arguments[2]:"\n");var c=((arguments.length>=4)?arguments[3]:false);var i,j,l,s,r;str+='';if(m<1){return str;} +for(i=-1,l=(r=str.split("\n")).length;++i<l;r[i]+=s){for(s=r[i],r[i]="";s.length>m;r[i]+=s.slice(0,j)+((s=s.slice(j)).length?b:"")){j=c==2||(j=s.slice(0,m+1).match(/\S*(\s)?$/))[1]?m:j.input.length-j[0].length||c==1&&m||j.input.length+(j=s.slice(m).match(/^\S*/)).input.length;}} +return r.join("\n");}+ \ No newline at end of file diff --git a/src/frontend/js/webcam.js b/src/PartKeepr/FrontendBundle/Resources/public/js/webcam.js diff --git a/src/PartKeepr/FrontendBundle/Resources/views/index.html.twig b/src/PartKeepr/FrontendBundle/Resources/views/index.html.twig @@ -6,35 +6,246 @@ <title>PartKeepr</title> - <link href="{% if https %}https{% else %}http{% endif %}://fonts.googleapis.com/css?family=Ubuntu:400,700italic" rel="stylesheet" type="text/css"> + <link href="{% if https %}https{% else %}http{% endif %}://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"/> + {% stylesheets + filter='cssrewrite' + '@PartKeeprFrontendBundle/Resources/public/css/*' + 'js/packages/extjs5/packages/extux/statusbar/css/statusbar.css' + %} + <link rel="stylesheet" href="{{ asset_url }}"/> + {% endstylesheets %} - <link rel="stylesheet" type="text/css" href="js/Ext.ux/statusbar/css/statusbar.css"/> + <link rel="icon" href="favicon.ico"/> - <link rel="stylesheet" type="text/css" href="css/PartKeepr.css"/> + <script type="javascript"> + var Ext = Ext || {}; + Ext.manifest = { // the same content as "app.json" + compatibility: { + ext: '4.2' + } + } + </script> + {% javascripts + output='js/compiled/main.js' + 'js/packages/extjs5/build/ext-all-debug.js' + 'js/packages/extjs5/packages/ext-charts/build/ext-charts.js' + 'js/packages/extjs5/packages/extux/statusbar/StatusBar.js' + 'js/packages/extjs5/packages/extux/statusbar/ValidationStatus.js' + '@PartKeeprFrontendBundle/Resources/public/js/Util/i18n.js' + '@PartKeeprFrontendBundle/Resources/public/js/Util/JsonWithAssociationsWriter.js' + '@PartKeeprFrontendBundle/Resources/public/js/PartKeepr.js' + 'js/packages/extjs5/packages/extux/TabCloseMenu.js' + '@PartKeeprFrontendBundle/Resources/public/js/compat.js' + '@PartKeeprFrontendBundle/Resources/public/js/Ext.ux/NumericField.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Widgets/CurrencyNumberField.js' + '@PartKeeprFrontendBundle/Resources/public/js/Ext.ux/SearchField.js' + '@PartKeeprFrontendBundle/Resources/public/js/Ext.ux/Iframe.js' + '@PartKeeprFrontendBundle/Resources/public/js/Ext.ux/ClearableComboBox.js' + '@PartKeeprFrontendBundle/Resources/public/js/Util/ServiceCall.js' + '@PartKeeprFrontendBundle/Resources/public/js/org.jerrymouse.util.locale/locale.js' + '@PartKeeprFrontendBundle/Resources/public/js/Dialogs/ExceptionWindow.js' + '@PartKeeprFrontendBundle/Resources/public/js/Dialogs/FileUploadDialog.js' + '@PartKeeprFrontendBundle/Resources/public/js/Dialogs/RememberChoiceMessageBox.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Statusbar.js' + '@PartKeeprFrontendBundle/Resources/public/js/ExtJS/Enhancements/Ext.input.CharContextMenu.js' + '@PartKeeprFrontendBundle/Resources/public/js/ExtJS/Enhancements/Ext.data.Connection-sessionInjection.js' + '@PartKeeprFrontendBundle/Resources/public/js/ExtJS/Enhancements/Ext.tree.View-missingMethods.js' + '@PartKeeprFrontendBundle/Resources/public/js/ExtJS/Enhancements/Ext.data.Model-setDataWithAssociations.js' + '@PartKeeprFrontendBundle/Resources/public/js/ExtJS/Enhancements/Ext.grid.Column-injectDefaultRenderer.js' + '@PartKeeprFrontendBundle/Resources/public/js/ExtJS/Enhancements/Ext.form.field.Trigger-themeAdjustment.js' + '@PartKeeprFrontendBundle/Resources/public/js/ExtJS/Enhancements/Ext.grid.feature.Grouping.expandCollapseAll.js' + '@PartKeeprFrontendBundle/Resources/public/js/ExtJS/Enhancements/Ext.data.reader.Json-exceptionHandling.js' + '@PartKeeprFrontendBundle/Resources/public/js/ExtJS/Bugfixes/Ext.selection.RowModel-EXTJSIV-4312.js' + '@PartKeeprFrontendBundle/Resources/public/js/ExtJS/Bugfixes/Ext.panel.Table-scrollDelta.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Auth/LoginDialog.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Printing/PrintingExecutor.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Printing/PrintingWindow.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Printing/PrintStorageLocations.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Part/PartImageDisplay.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Part/PartsManager.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Part/Editor/PartEditorWindow.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Part/PartDisplay.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Part/PartStockWindow.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Part/PartFilterPanel.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/MenuBar.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Grid/BaseGrid.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Part/Editor/PartParameterGrid.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Part/Editor/PartDistributorGrid.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Part/Editor/PartManufacturerGrid.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/StockReport/AbstractStockHistoryGrid.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Part/PartStockHistory.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/StockReport/StockHistoryGrid.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Widgets/UserPreferenceGrid.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Widgets/AttachmentGrid.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Part/Editor/PartAttachmentGrid.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Footprint/FootprintAttachmentGrid.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Project/ProjectAttachmentGrid.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Editor/EditorGrid.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Distributor/DistributorGrid.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Printing/PrintingJobConfigurationGrid.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Printing/PageBasicLayoutGrid.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Part/PartsGrid.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Manufacturer/ManufacturerGrid.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/PartUnit/PartUnitGrid.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Unit/UnitGrid.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/User/UserGrid.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/SystemNotice/SystemNoticeGrid.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/StorageLocation/StorageLocationGrid.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Project/ProjectGrid.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/MessageLog.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Project/ProjectPartGrid.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/SystemInformation/SystemInformationGrid.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Grid/GridMenuPlugin.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/TimeDisplay.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Menu.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Session/SessionManager.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/User/Preferences/DisplayPreferencesPanel.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/User/Preferences/UserPasswordChangePanel.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/User/Preferences/StockPreferences.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/User/Preferences/FormattingPreferences.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/User/Preferences/TipOfTheDayPreferences.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/User/UserPreferences.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Widgets/RemotePartComboBox.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Widgets/FadingButton.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Widgets/SystemNoticeButton.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Widgets/ConnectionButton.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Widgets/SiUnitList.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Widgets/SiUnitField.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Widgets/CategoryComboBox.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Widgets/PartParameterComboBox.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Widgets/RemoteImageField.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Widgets/WebcamPanel.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Widgets/ReloadableComboBox.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Widgets/DistributorComboBox.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Widgets/UserComboBox.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Widgets/FootprintComboBox.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Widgets/ManufacturerComboBox.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Widgets/UnitComboBox.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Widgets/PartUnitComboBox.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Widgets/StorageLocationComboBox.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Widgets/ResistorCalculator.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/ContextMenu/CharPickerMenu.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Editor/Editor.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Distributor/DistributorEditor.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Printing/PageBasicLayoutEditor.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Printing/PrintingJobConfigurationEditor.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Part/Editor/PartEditor.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Manufacturer/ManufacturerEditor.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/PartUnit/PartUnitEditor.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Unit/UnitEditor.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Footprint/FootprintEditor.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/User/UserEditor.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/SystemNotice/SystemNoticeEditor.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/StorageLocation/StorageLocationEditor.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Project/ProjectEditor.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Editor/EditorComponent.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Distributor/DistributorEditorComponent.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Printing/PageBasicLayoutEditorComponent.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Printing/PrintingJobConfigurationEditorComponent.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Manufacturer/ManufacturerEditorComponent.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/PartUnit/PartUnitEditorComponent.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Unit/UnitEditorComponent.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Footprint/FootprintEditorComponent.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/User/UserEditorComponent.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/SystemNotice/SystemNoticeEditorComponent.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/StorageLocation/StorageLocationEditorComponent.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Project/ProjectEditorComponent.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/StorageLocation/StorageLocationMultiAddWindow.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/StorageLocation/StorageLocationMultiAddDialog.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Project/ProjectReport.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Statistics/StatisticsChart.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Statistics/StatisticsChartPanel.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Statistics/CurrentStatisticsPanel.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/CategoryStore.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/TipOfTheDay/TipOfTheDayWindow.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/CategoryTree.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/CategoryEditor/CategoryEditorTree.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Part/PartCategoryTree.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Footprint/FootprintTree.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/CategoryEditor/CategoryEditorWindow.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/CategoryEditor/CategoryEditorForm.js' + '@PartKeeprFrontendBundle/Resources/public/js/Components/Picker/CharPicker.js' + '@PartKeeprFrontendBundle/Resources/public/js/webcam.js' + '@PartKeeprFrontendBundle/Resources/public/js/Models/PartParameter.js' + '@PartKeeprFrontendBundle/Resources/public/js/Models/PartAttachment.js' + '@PartKeeprFrontendBundle/Resources/public/js/Models/StockEntry.js' + '@PartKeeprFrontendBundle/Resources/public/js/Models/SiPrefix.js' + '@PartKeeprFrontendBundle/Resources/public/js/Models/TipOfTheDay.js' + '@PartKeeprFrontendBundle/Resources/public/js/Models/User.js' + '@PartKeeprFrontendBundle/Resources/public/js/Models/PrintingRenderer.js' + '@PartKeeprFrontendBundle/Resources/public/js/Models/UserPreference.js' + '@PartKeeprFrontendBundle/Resources/public/js/Models/FootprintAttachment.js' + '@PartKeeprFrontendBundle/Resources/public/js/Models/Distributor.js' + '@PartKeeprFrontendBundle/Resources/public/js/Models/PrintingPageBasicLayout.js' + '@PartKeeprFrontendBundle/Resources/public/js/Models/PrintingResponse.js' + '@PartKeeprFrontendBundle/Resources/public/js/Models/SystemInformationRecord.js' + '@PartKeeprFrontendBundle/Resources/public/js/Models/Part.js' + '@PartKeeprFrontendBundle/Resources/public/js/Models/Manufacturer.js' + '@PartKeeprFrontendBundle/Resources/public/js/Models/AbstractCategory.js' + '@PartKeeprFrontendBundle/Resources/public/js/Models/PartCategory.js' + '@PartKeeprFrontendBundle/Resources/public/js/Models/FootprintCategory.js' + '@PartKeeprFrontendBundle/Resources/public/js/Models/ProjectReportList.js' + '@PartKeeprFrontendBundle/Resources/public/js/Models/Project.js' + '@PartKeeprFrontendBundle/Resources/public/js/Models/PartUnit.js' + '@PartKeeprFrontendBundle/Resources/public/js/Models/PrintingType.js' + '@PartKeeprFrontendBundle/Resources/public/js/Models/Message.js' + '@PartKeeprFrontendBundle/Resources/public/js/Models/StorageLocation.js' + '@PartKeeprFrontendBundle/Resources/public/js/Models/PrintingPrintingJobConfiguration.js' + '@PartKeeprFrontendBundle/Resources/public/js/Models/ProjectPart.js' + '@PartKeeprFrontendBundle/Resources/public/js/Models/StatisticSample.js' + '@PartKeeprFrontendBundle/Resources/public/js/Models/PartDistributor.js' + '@PartKeeprFrontendBundle/Resources/public/js/Models/PartManufacturer.js'