From 608c8a8a70e9fa25801b648613d8ab38e627bbcb Mon Sep 17 00:00:00 2001 From: Barry O'Donovan Date: Thu, 26 May 2011 15:07:26 +0100 Subject: [PATCH] Initial import of V1.0 of IXP Manager --- CHANGELOG | 4 + LICENSE | 339 + application/Bootstrap.php | 43 + application/configs/application.ini.dist | 248 + application/controllers/AdminController.php | 92 + .../controllers/ApplicationController.php | 49 + application/controllers/AuthController.php | 340 + application/controllers/CabinetController.php | 93 + .../controllers/ChangeLogController.php | 143 + application/controllers/CliController.php | 594 + .../ConsoleServerConnectionController.php | 117 + application/controllers/ContactController.php | 103 + .../controllers/CustAdminController.php | 335 + application/controllers/CustKitController.php | 91 + .../controllers/CustomerController.php | 609 + .../controllers/DashboardController.php | 1009 + application/controllers/ErrorController.php | 85 + application/controllers/IndexController.php | 63 + .../controllers/Ipv4AddressController.php | 97 + .../controllers/Ipv6AddressController.php | 98 + .../controllers/IrrdbConfigController.php | 83 + .../controllers/LocationController.php | 108 + .../controllers/LogicalCircuitController.php | 182 + application/controllers/MeetingController.php | 323 + .../controllers/MeetingItemController.php | 311 + application/controllers/MrtgController.php | 195 + .../controllers/PatchPanelController.php | 343 + .../controllers/PatchPanelPortController.php | 106 + .../controllers/PeeringMatrixController.php | 80 + .../PhysicalInterfaceController.php | 153 + application/controllers/ProfileController.php | 155 + .../controllers/ProvisionController.php | 290 + application/controllers/SecController.php | 389 + .../controllers/SecViewerController.php | 145 + application/controllers/SwitchController.php | 167 + .../controllers/SwitchPortController.php | 86 + application/controllers/UserController.php | 229 + application/controllers/UtilsController.php | 77 + application/controllers/VendorController.php | 70 + .../VirtualInterfaceController.php | 177 + application/controllers/VlanController.php | 87 + .../controllers/VlanInterfaceController.php | 215 + application/models/Bgpsessiondata.php | 40 + application/models/BgpsessiondataTable.php | 36 + application/models/Cabinet.php | 47 + application/models/CabinetTable.php | 36 + application/models/ChangeLog.php | 63 + application/models/ChangeLogTable.php | 95 + .../models/Consoleserverconnection.php | 47 + .../models/ConsoleserverconnectionSeq.php | 40 + .../ConsoleserverconnectionSeqTable.php | 36 + .../models/ConsoleserverconnectionTable.php | 36 + application/models/Contact.php | 47 + application/models/ContactSeq.php | 40 + application/models/ContactSeqTable.php | 36 + application/models/ContactTable.php | 36 + application/models/Cust.php | 199 + application/models/CustSeq.php | 40 + application/models/CustSeqTable.php | 36 + application/models/CustTable.php | 56 + application/models/Custkit.php | 46 + application/models/CustkitTable.php | 36 + application/models/History.php | 47 + application/models/HistoryTable.php | 36 + application/models/Ipv4address.php | 48 + application/models/Ipv4addressTable.php | 36 + application/models/Ipv6address.php | 47 + application/models/Ipv6addressTable.php | 36 + application/models/Irrdbconfig.php | 38 + application/models/IrrdbconfigTable.php | 41 + application/models/Location.php | 40 + application/models/LocationTable.php | 36 + application/models/LogicalCircuit.php | 54 + application/models/LogicalCircuitTable.php | 38 + application/models/Meeting.php | 65 + application/models/MeetingItem.php | 60 + application/models/MeetingItemTable.php | 50 + application/models/MeetingTable.php | 68 + application/models/MyPeeringMatrix.php | 160 + application/models/MyPeeringMatrixNotes.php | 56 + .../models/MyPeeringMatrixNotesTable.php | 50 + application/models/MyPeeringMatrixTable.php | 159 + application/models/Networkinfo.php | 105 + application/models/NetworkinfoTable.php | 36 + application/models/PatchPanel.php | 46 + application/models/PatchPanelPort.php | 109 + application/models/PatchPanelPortTable.php | 36 + application/models/PatchPanelTable.php | 36 + application/models/PeeringMatrix.php | 54 + application/models/PeeringMatrixTable.php | 50 + application/models/PhysicalCircuit.php | 56 + application/models/PhysicalCircuitTable.php | 38 + application/models/Physicalinterface.php | 83 + application/models/PhysicalinterfaceSeq.php | 40 + .../models/PhysicalinterfaceSeqTable.php | 36 + application/models/PhysicalinterfaceTable.php | 36 + application/models/ProvisioningInterface.php | 95 + .../models/ProvisioningInterfaceTable.php | 41 + application/models/SecEvent.php | 82 + application/models/SecEventTable.php | 36 + application/models/Switch.php | 47 + application/models/SwitchSeq.php | 40 + application/models/SwitchSeqTable.php | 36 + application/models/SwitchTable.php | 65 + application/models/Switchport.php | 65 + application/models/SwitchportTable.php | 41 + application/models/Traffic95th.php | 47 + application/models/Traffic95thMonthly.php | 54 + .../models/Traffic95thMonthlyTable.php | 50 + application/models/Traffic95thTable.php | 79 + application/models/TrafficDaily.php | 54 + application/models/TrafficDailyTable.php | 36 + application/models/User.php | 177 + application/models/UserPref.php | 53 + application/models/UserPrefTable.php | 50 + application/models/UserSeq.php | 40 + application/models/UserSeqTable.php | 36 + application/models/UserTable.php | 60 + application/models/Vendor.php | 40 + application/models/VendorTable.php | 36 + application/models/ViewCustCurrentActive.php | 60 + .../models/ViewCustCurrentActiveTable.php | 36 + .../models/ViewSwitchDetailsByCustid.php | 73 + .../models/ViewSwitchDetailsByCustidTable.php | 36 + .../ViewVlaninterfaceDetailsByCustid.php | 51 + .../ViewVlaninterfaceDetailsByCustidTable.php | 83 + application/models/Virtualinterface.php | 59 + application/models/VirtualinterfaceSeq.php | 40 + .../models/VirtualinterfaceSeqTable.php | 36 + application/models/VirtualinterfaceTable.php | 36 + application/models/Vlan.php | 46 + application/models/VlanSeq.php | 40 + application/models/VlanSeqTable.php | 36 + application/models/VlanTable.php | 36 + application/models/Vlaninterface.php | 48 + application/models/VlaninterfaceSeq.php | 40 + application/models/VlaninterfaceSeqTable.php | 36 + application/models/VlaninterfaceTable.php | 36 + .../models/generated/BaseBgpsessiondata.php | 84 + application/models/generated/BaseCabinet.php | 102 + .../models/generated/BaseChangeLog.php | 92 + .../generated/BaseConsoleserverconnection.php | 134 + .../BaseConsoleserverconnectionSeq.php | 35 + application/models/generated/BaseContact.php | 148 + .../models/generated/BaseContactSeq.php | 35 + application/models/generated/BaseCust.php | 338 + application/models/generated/BaseCustSeq.php | 35 + application/models/generated/BaseCustkit.php | 77 + application/models/generated/BaseHistory.php | 132 + .../models/generated/BaseIpv4address.php | 55 + .../models/generated/BaseIpv6address.php | 55 + .../models/generated/BaseIrrdbconfig.php | 74 + application/models/generated/BaseLocation.php | 152 + .../models/generated/BaseLogicalCircuit.php | 82 + application/models/generated/BaseMeeting.php | 148 + .../models/generated/BaseMeetingItem.php | 194 + .../models/generated/BaseMyPeeringMatrix.php | 130 + .../generated/BaseMyPeeringMatrixNotes.php | 73 + .../models/generated/BaseNetworkinfo.php | 105 + .../models/generated/BasePatchPanel.php | 112 + .../models/generated/BasePatchPanelPort.php | 110 + .../models/generated/BasePeeringMatrix.php | 111 + .../models/generated/BasePhysicalCircuit.php | 142 + .../generated/BasePhysicalinterface.php | 104 + .../generated/BasePhysicalinterfaceSeq.php | 35 + .../generated/BaseProvisioningInterface.php | 158 + application/models/generated/BaseSecEvent.php | 111 + application/models/generated/BaseSwitch.php | 151 + .../models/generated/BaseSwitchSeq.php | 35 + .../models/generated/BaseSwitchTable.php | 125 + .../models/generated/BaseSwitchport.php | 68 + .../models/generated/BaseTraffic95th.php | 74 + .../generated/BaseTraffic95thMonthly.php | 64 + .../models/generated/BaseTrafficDaily.php | 311 + application/models/generated/BaseUser.php | 178 + application/models/generated/BaseUserPref.php | 74 + application/models/generated/BaseUserSeq.php | 35 + application/models/generated/BaseVendor.php | 46 + .../generated/BaseViewCustCurrentActive.php | 340 + .../BaseViewSwitchDetailsByCustid.php | 225 + .../BaseViewVlaninterfaceDetailsByCustid.php | 293 + .../models/generated/BaseVirtualinterface.php | 95 + .../generated/BaseVirtualinterfaceSeq.php | 35 + application/models/generated/BaseVlan.php | 76 + application/models/generated/BaseVlanSeq.php | 35 + .../models/generated/BaseVlaninterface.php | 248 + .../models/generated/BaseVlaninterfaceSeq.php | 35 + .../admin/static/instructions-meetings.tpl | 171 + application/views/auth/drupal-login.tpl | 47 + application/views/auth/footer.tpl | 22 + application/views/auth/forgotten-password.tpl | 36 + application/views/auth/header.tpl | 55 + application/views/auth/login.tpl | 33 + .../views/change-log/addEdit-preamble.tpl | 16 + application/views/change-log/entries.tpl | 50 + .../views/cli/nagios/switch-definitions.tpl | 77 + application/views/cli/nagios/switch-hosts.tpl | 12 + .../views/cli/nagios/switch-templates.tpl | 76 + application/views/cust-admin/add-edit.tpl | 45 + application/views/cust-admin/list.tpl | 153 + application/views/cust-admin/mail/welcome.tpl | 131 + application/views/customer/addEdit.tpl | 62 + application/views/customer/leagueTable.tpl | 316 + application/views/customer/list.tpl | 263 + .../views/customer/mail/diff-footer.tpl | 9 + .../views/customer/mail/diff-header.tpl | 12 + .../views/customer/mail/diff-member.tpl | 41 + .../views/customer/mail/util-footer.tpl | 9 + .../views/customer/mail/util-header.tpl | 15 + .../views/customer/mail/util-member.tpl | 22 + application/views/customer/ninety-fifth.tpl | 212 + .../views/customer/sendWelcomeEmail.tpl | 22 + .../views/customer/statistics-by-lan.tpl | 105 + .../views/customer/statistics-list.tpl | 32 + .../views/customer/statistics-overview.tpl | 91 + application/views/customer/welcomeEmail.tpl | 308 + application/views/dashboard/as112.tpl | 123 + .../views/dashboard/email/peering-request.tpl | 61 + .../views/dashboard/index-tab-connections.tpl | 104 + .../views/dashboard/index-tab-details.tpl | 244 + .../views/dashboard/index-tab-overview.tpl | 160 + .../views/dashboard/index-tab-statistics.tpl | 51 + application/views/dashboard/index.tpl | 64 + .../views/dashboard/member-details.tpl | 238 + .../views/dashboard/members-details-list.tpl | 76 + .../views/dashboard/my-peering-matrix.tpl | 528 + .../dashboard/my-peering-matrix/ascii.tpl | 20 + .../views/dashboard/my-peering-matrix/csv.tpl | 4 + .../views/dashboard/my-peering-matrix/php.tpl | 28 + .../views/dashboard/peering-matrix.tpl | 136 + .../views/dashboard/popups/meeting.tpl | 102 + application/views/dashboard/rs-info.tpl | 312 + .../dashboard/sec-event-email-config.tpl | 98 + application/views/dashboard/static/fees.tpl | 153 + .../static/help-my-peering-manager.tpl | 168 + .../views/dashboard/static/housing.tpl | 118 + .../views/dashboard/static/misc-benefits.tpl | 163 + .../views/dashboard/static/port-security.tpl | 131 + .../views/dashboard/static/support.tpl | 73 + .../views/dashboard/static/switches.tpl | 130 + .../dashboard/statistics-drilldown-mini.tpl | 37 + .../views/dashboard/statistics-drilldown.tpl | 65 + .../dashboard/statistics-peering-graphs.tpl | 70 + .../dashboard/statistics-switch-graphs.tpl | 68 + .../dashboard/statistics-trunk-graphs.tpl | 58 + application/views/dashboard/statistics.tpl | 78 + .../views/dashboard/switch-configuration.tpl | 120 + application/views/error/error-404.tpl | 15 + application/views/error/error-debug.tpl | 31 + application/views/error/error.tpl | 23 + application/views/footer-full-width.tpl | 37 + application/views/footer-tiny.tpl | 10 + application/views/footer.tpl | 37 + application/views/form/add-cancel.tpl | 23 + application/views/form/add-edit-cancel.tpl | 23 + application/views/frontend/addEdit.tpl | 23 + application/views/frontend/list.tpl | 308 + application/views/frontend/view.tpl | 90 + application/views/header-full-width.tpl | 46 + application/views/header-tiny.tpl | 21 + application/views/header.tpl | 102 + application/views/index/index.tpl | 27 + application/views/ipv4-address/list.tpl | 41 + application/views/ipv6-address/list.tpl | 41 + application/views/logical-circuit/addEdit.tpl | 19 + .../views/logical-circuit/form/add-edit.tpl | 218 + .../views/meeting-item/addEdit-preamble.tpl | 10 + .../views/meeting-item/list-pretable.tpl | 24 + .../views/meeting/addEdit-preamble.tpl | 17 + application/views/meeting/compose.tpl | 112 + application/views/meeting/core.tpl | 172 + .../views/meeting/customContextMenu.js.tpl | 70 + application/views/meeting/email/meeting.tpl | 216 + application/views/meeting/meetings.tpl | 37 + application/views/meeting/simple.tpl | 134 + application/views/meeting/simple2.tpl | 68 + application/views/menu.tpl | 303 + application/views/message.tpl | 47 + application/views/patch-panel/addEdit.tpl | 37 + application/views/patch-panel/edit-ports.tpl | 25 + .../views/patch-panel/form/autogen.tpl | 89 + .../patch-panel/form/patch-panel-port.tpl | 64 + .../views/patch-panel/form/patch-panel.tpl | 103 + application/views/peering-matrix/index.tpl | 134 + application/views/profile/index.tpl | 35 + .../views/provision/interface/list.tpl | 156 + .../interface/mail/interface-details.tpl | 219 + .../views/provision/interface/overview.tpl | 218 + .../provision/interface/switch-config.tpl | 123 + application/views/sec-viewer/read.tpl | 104 + application/views/sec/cust_bgp_auth.tpl | 30 + application/views/sec/cust_port_updown.tpl | 29 + .../views/sec/cust_security_violation.tpl | 63 + application/views/sec/ops_bgp_auth.tpl | 31 + application/views/sec/ops_port_updown.tpl | 33 + .../views/sec/ops_security_violation.tpl | 25 + .../views/switch/customContextMenu.js.tpl | 60 + application/views/switch/port-report.tpl | 73 + .../views/user/customContextMenu.js.tpl | 198 + application/views/user/last.tpl | 66 + application/views/user/postContent.tpl | 90 + .../views/virtual-interface/addEdit.tpl | 344 + application/views/virtual-interface/list.tpl | 161 + bin/build-phpdoc.sh | 8 + bin/doctrine-cli.php | 61 + bin/ixptool.php | 151 + bin/sec-processor.php | 297 + bin/sec/SEC-README | 4 + bin/sec/cisco-test.log | 2 + bin/sec/cisco-test.log2 | 23 + bin/sec/sec-test.conf | 102 + data/oui-update.sh | 12 + data/oui.txt | 13361 ++++++++++++ doctrine/data/sql/inex-schema.sql | 652 + library/INEX/Auth/DoctrineAdapter.php | 140 + library/INEX/Controller/Action.php | 326 + library/INEX/Controller/FrontEnd.php | 432 + library/INEX/Controller/Request/Simple.php | 55 + library/INEX/Controller/Router/Cli.php | 42 + library/INEX/Debug.php | 112 + library/INEX/Exception.php | 32 + library/INEX/Filter/StripSlashes.php | 41 + library/INEX/Form.php | 152 + library/INEX/Form/Cabinet.php | 134 + library/INEX/Form/ChangeLog.php | 110 + library/INEX/Form/ConsoleServerConnection.php | 210 + library/INEX/Form/Contact.php | 156 + library/INEX/Form/CustKit.php | 134 + library/INEX/Form/Customer.php | 376 + .../INEX/Form/Customer/SendWelcomeEmail.php | 133 + library/INEX/Form/IrrdbConfig.php | 99 + library/INEX/Form/Location.php | 163 + library/INEX/Form/LogicalCircuit.php | 132 + library/INEX/Form/Meeting.php | 127 + library/INEX/Form/MeetingItem.php | 165 + library/INEX/Form/PatchPanel.php | 63 + library/INEX/Form/PatchPanelPorts.php | 55 + library/INEX/Form/PhysicalInterface.php | 148 + library/INEX/Form/Profile.php | 99 + library/INEX/Form/ProfilePassword.php | 99 + .../INEX/Form/Provision/InterfaceEmail.php | 133 + library/INEX/Form/SubForm.php | 75 + library/INEX/Form/SubForm/AddCancel.php | 66 + library/INEX/Form/SubForm/AddEditCancel.php | 65 + library/INEX/Form/SubForm/PatchPanel.php | 151 + .../INEX/Form/SubForm/PatchPanelAutoGen.php | 87 + library/INEX/Form/SubForm/PatchPanelPort.php | 112 + library/INEX/Form/Switch.php | 184 + library/INEX/Form/SwitchPort.php | 72 + library/INEX/Form/User.php | 156 + library/INEX/Form/VLAN.php | 100 + library/INEX/Form/Vendor.php | 69 + library/INEX/Form/VirtualInterface.php | 128 + library/INEX/Form/VlanInterface.php | 293 + library/INEX/Message.php | 110 + library/INEX/Mrtg.php | 458 + library/INEX/Resource/Auth.php | 73 + library/INEX/Resource/Doctrine.php | 110 + library/INEX/Resource/Logger.php | 175 + library/INEX/Resource/Mailer.php | 92 + library/INEX/Resource/Namespace.php | 118 + library/INEX/Resource/View.php | 90 + library/INEX/Resource/Zfdebug.php | 115 + library/INEX/SMS/Clickatell.php | 174 + library/INEX/View/Smarty.php | 275 + .../Plugin/Debug/Plugin/Doctrine.php | 117 + library/apcinfo.php | 1346 ++ .../functions/compiler.include_if_exists.php | 78 + .../function.genDoctrinePagerLinks.php | 117 + .../functions/function.genMrtgGraphBox.php | 91 + .../functions/function.genMrtgImgUrl.php | 35 + .../functions/function.genMrtgImgUrlTag.php | 37 + .../inex-smarty/functions/function.genUrl.php | 62 + .../functions/function.getMrtgStatistics.php | 58 + .../functions/function.mrtgScale.php | 38 + .../functions/modifier.asnumber.php | 38 + .../functions/modifier.underline.php | 47 + public/.htaccess.dist | 8 + public/css/base.css | 131 + public/css/colorbox.css | 50 + public/css/images/border.png | Bin 0 -> 163 bytes public/css/images/controls.png | Bin 0 -> 2033 bytes public/css/images/loading.gif | Bin 0 -> 9427 bytes public/css/images/loading_background.png | Bin 0 -> 166 bytes public/css/ixp-manager-old.css | 187 + public/css/ixp-manager.css | 853 + public/css/joomla-template_css.css | 592 + public/css/joomla-theme.css | 315 + public/css/joomla.css | 462 + .../images/ui-bg_flat_0_aaaaaa_40x100.png | Bin 0 -> 180 bytes .../images/ui-bg_flat_75_ffffff_40x100.png | Bin 0 -> 178 bytes .../images/ui-bg_glass_55_fbf9ee_1x400.png | Bin 0 -> 144 bytes .../images/ui-bg_glass_65_ffffff_1x400.png | Bin 0 -> 105 bytes .../images/ui-bg_glass_75_dadada_1x400.png | Bin 0 -> 111 bytes .../images/ui-bg_glass_75_e6e6e6_1x400.png | Bin 0 -> 151 bytes .../images/ui-bg_glass_95_fef1ec_1x400.png | Bin 0 -> 119 bytes .../ui-bg_highlight-soft_75_cccccc_1x100.png | Bin 0 -> 101 bytes .../images/ui-icons_222222_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_2e83ff_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_454545_256x240.png | Bin 0 -> 5355 bytes .../images/ui-icons_888888_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_cd0a0a_256x240.png | Bin 0 -> 4369 bytes .../css/smoothness/jquery-ui-1.7.2.custom.css | 406 + public/css/yui/assets/YUIexamples.js | 32 + public/css/yui/assets/bg_hd.gif | Bin 0 -> 96 bytes public/css/yui/assets/dpSyntaxHighlighter.css | 190 + public/css/yui/assets/dpSyntaxHighlighter.js | 805 + public/css/yui/assets/example-hd-bg.gif | Bin 0 -> 1487 bytes public/css/yui/assets/title_h_bg.gif | Bin 0 -> 91 bytes public/css/yui/assets/yui-candy.jpg | Bin 0 -> 11389 bytes public/css/yui/assets/yui.css | 322 + public/css/yui/assets/yui.gif | Bin 0 -> 5901 bytes public/css/yui/assets/yuiDistribution.css | 0 public/css/yui/assets/yuilib.jpg | Bin 0 -> 9186 bytes .../yui/build/animation/animation-debug.js | 1394 ++ .../css/yui/build/animation/animation-min.js | 23 + public/css/yui/build/animation/animation.js | 1390 ++ .../build/assets/skins/sam/ajax-loader.gif | Bin 0 -> 3208 bytes public/css/yui/build/assets/skins/sam/asc.gif | Bin 0 -> 177 bytes .../build/assets/skins/sam/autocomplete.css | 7 + .../css/yui/build/assets/skins/sam/bg-h.gif | Bin 0 -> 212 bytes .../css/yui/build/assets/skins/sam/bg-v.gif | Bin 0 -> 481 bytes .../yui/build/assets/skins/sam/blankimage.png | Bin 0 -> 2314 bytes .../css/yui/build/assets/skins/sam/button.css | 7 + .../yui/build/assets/skins/sam/calendar.css | 8 + .../yui/build/assets/skins/sam/carousel.css | 7 + .../build/assets/skins/sam/colorpicker.css | 7 + .../yui/build/assets/skins/sam/container.css | 7 + .../yui/build/assets/skins/sam/datatable.css | 8 + .../css/yui/build/assets/skins/sam/desc.gif | Bin 0 -> 177 bytes .../build/assets/skins/sam/dt-arrow-dn.png | Bin 0 -> 116 bytes .../build/assets/skins/sam/dt-arrow-up.png | Bin 0 -> 116 bytes .../build/assets/skins/sam/editor-knob.gif | Bin 0 -> 138 bytes .../assets/skins/sam/editor-sprite-active.gif | Bin 0 -> 5614 bytes .../build/assets/skins/sam/editor-sprite.gif | Bin 0 -> 5690 bytes .../css/yui/build/assets/skins/sam/editor.css | 10 + .../assets/skins/sam/header_background.png | Bin 0 -> 158 bytes .../css/yui/build/assets/skins/sam/hue_bg.png | Bin 0 -> 1120 bytes .../build/assets/skins/sam/imagecropper.css | 7 + .../css/yui/build/assets/skins/sam/layout.css | 7 + .../build/assets/skins/sam/layout_sprite.png | Bin 0 -> 1409 bytes .../yui/build/assets/skins/sam/loading.gif | Bin 0 -> 2673 bytes .../css/yui/build/assets/skins/sam/logger.css | 7 + .../skins/sam/menu-button-arrow-disabled.png | Bin 0 -> 173 bytes .../assets/skins/sam/menu-button-arrow.png | Bin 0 -> 173 bytes .../css/yui/build/assets/skins/sam/menu.css | 7 + .../sam/menubaritem_submenuindicator.png | Bin 0 -> 3618 bytes .../menubaritem_submenuindicator_disabled.png | Bin 0 -> 3618 bytes .../assets/skins/sam/menuitem_checkbox.png | Bin 0 -> 3625 bytes .../skins/sam/menuitem_checkbox_disabled.png | Bin 0 -> 3625 bytes .../skins/sam/menuitem_submenuindicator.png | Bin 0 -> 3617 bytes .../menuitem_submenuindicator_disabled.png | Bin 0 -> 3617 bytes .../yui/build/assets/skins/sam/paginator.css | 7 + .../build/assets/skins/sam/picker_mask.png | Bin 0 -> 12174 bytes .../build/assets/skins/sam/profilerviewer.css | 7 + .../css/yui/build/assets/skins/sam/resize.css | 7 + .../build/assets/skins/sam/simpleeditor.css | 10 + .../css/yui/build/assets/skins/sam/skin.css | 35 + .../css/yui/build/assets/skins/sam/slider.css | 7 + .../skins/sam/split-button-arrow-active.png | Bin 0 -> 280 bytes .../skins/sam/split-button-arrow-disabled.png | Bin 0 -> 185 bytes .../skins/sam/split-button-arrow-focus.png | Bin 0 -> 185 bytes .../skins/sam/split-button-arrow-hover.png | Bin 0 -> 185 bytes .../assets/skins/sam/split-button-arrow.png | Bin 0 -> 185 bytes .../css/yui/build/assets/skins/sam/sprite.png | Bin 0 -> 3745 bytes .../css/yui/build/assets/skins/sam/sprite.psd | Bin 0 -> 118162 bytes .../yui/build/assets/skins/sam/tabview.css | 8 + .../assets/skins/sam/treeview-loading.gif | Bin 0 -> 2673 bytes .../assets/skins/sam/treeview-sprite.gif | Bin 0 -> 4326 bytes .../yui/build/assets/skins/sam/treeview.css | 7 + .../css/yui/build/assets/skins/sam/wait.gif | Bin 0 -> 1100 bytes .../yui/build/assets/skins/sam/yuitest.css | 7 + .../autocomplete/assets/autocomplete-core.css | 7 + .../assets/skins/sam/autocomplete-skin.css | 57 + .../assets/skins/sam/autocomplete.css | 7 + .../build/autocomplete/autocomplete-debug.js | 2908 +++ .../build/autocomplete/autocomplete-min.js | 12 + .../yui/build/autocomplete/autocomplete.js | 2865 +++ public/css/yui/build/base/base-min.css | 7 + public/css/yui/build/base/base.css | 131 + .../yui/build/button/assets/button-core.css | 44 + .../button/assets/skins/sam/button-skin.css | 238 + .../build/button/assets/skins/sam/button.css | 7 + .../skins/sam/menu-button-arrow-disabled.png | Bin 0 -> 173 bytes .../assets/skins/sam/menu-button-arrow.png | Bin 0 -> 173 bytes .../skins/sam/split-button-arrow-active.png | Bin 0 -> 280 bytes .../skins/sam/split-button-arrow-disabled.png | Bin 0 -> 185 bytes .../skins/sam/split-button-arrow-focus.png | Bin 0 -> 185 bytes .../skins/sam/split-button-arrow-hover.png | Bin 0 -> 185 bytes .../assets/skins/sam/split-button-arrow.png | Bin 0 -> 185 bytes public/css/yui/build/button/button-debug.js | 4810 +++++ public/css/yui/build/button/button-min.js | 11 + public/css/yui/build/button/button.js | 4749 +++++ .../build/calendar/assets/calendar-core.css | 132 + .../yui/build/calendar/assets/calendar.css | 320 + .../css/yui/build/calendar/assets/calgrad.png | Bin 0 -> 497 bytes .../css/yui/build/calendar/assets/callt.gif | Bin 0 -> 93 bytes .../css/yui/build/calendar/assets/calrt.gif | Bin 0 -> 94 bytes public/css/yui/build/calendar/assets/calx.gif | Bin 0 -> 88 bytes .../assets/skins/sam/calendar-skin.css | 361 + .../calendar/assets/skins/sam/calendar.css | 8 + .../css/yui/build/calendar/calendar-debug.js | 7178 +++++++ public/css/yui/build/calendar/calendar-min.js | 18 + public/css/yui/build/calendar/calendar.js | 7148 +++++++ .../yui/build/carousel/assets/ajax-loader.gif | Bin 0 -> 3208 bytes .../build/carousel/assets/carousel-core.css | 88 + .../carousel/assets/skins/sam/ajax-loader.gif | Bin 0 -> 3208 bytes .../assets/skins/sam/carousel-skin.css | 132 + .../carousel/assets/skins/sam/carousel.css | 7 + .../css/yui/build/carousel/carousel-debug.js | 3658 ++++ public/css/yui/build/carousel/carousel-min.js | 11 + public/css/yui/build/carousel/carousel.js | 3616 ++++ public/css/yui/build/charts/assets/charts.swf | Bin 0 -> 71944 bytes public/css/yui/build/charts/charts-debug.js | 2326 +++ public/css/yui/build/charts/charts-min.js | 17 + public/css/yui/build/charts/charts.js | 2322 +++ .../colorpicker/assets/colorpicker-core.css | 6 + .../build/colorpicker/assets/hue_thumb.png | Bin 0 -> 195 bytes .../build/colorpicker/assets/picker_mask.png | Bin 0 -> 12174 bytes .../build/colorpicker/assets/picker_thumb.png | Bin 0 -> 192 bytes .../assets/skins/sam/colorpicker-skin.css | 105 + .../assets/skins/sam/colorpicker.css | 7 + .../colorpicker/assets/skins/sam/hue_bg.png | Bin 0 -> 1120 bytes .../assets/skins/sam/picker_mask.png | Bin 0 -> 12174 bytes .../build/colorpicker/colorpicker-debug.js | 1783 ++ .../yui/build/colorpicker/colorpicker-min.js | 9 + .../css/yui/build/colorpicker/colorpicker.js | 1763 ++ .../yui/build/connection/connection-debug.js | 1406 ++ .../yui/build/connection/connection-min.js | 8 + public/css/yui/build/connection/connection.js | 1376 ++ .../yui/build/container/assets/alrt16_1.gif | Bin 0 -> 971 bytes .../yui/build/container/assets/blck16_1.gif | Bin 0 -> 591 bytes .../yui/build/container/assets/close12_1.gif | Bin 0 -> 85 bytes .../build/container/assets/container-core.css | 176 + .../yui/build/container/assets/container.css | 325 + .../yui/build/container/assets/hlp16_1.gif | Bin 0 -> 928 bytes .../yui/build/container/assets/info16_1.gif | Bin 0 -> 601 bytes .../assets/skins/sam/container-skin.css | 242 + .../container/assets/skins/sam/container.css | 7 + .../yui/build/container/assets/tip16_1.gif | Bin 0 -> 552 bytes .../yui/build/container/assets/warn16_1.gif | Bin 0 -> 580 bytes .../yui/build/container/container-debug.js | 9088 ++++++++ .../css/yui/build/container/container-min.js | 19 + public/css/yui/build/container/container.js | 9064 ++++++++ .../build/container/container_core-debug.js | 5212 +++++ .../yui/build/container/container_core-min.js | 13 + .../css/yui/build/container/container_core.js | 5202 +++++ public/css/yui/build/cookie/cookie-debug.js | 429 + public/css/yui/build/cookie/cookie-min.js | 7 + public/css/yui/build/cookie/cookie.js | 429 + .../yui/build/datasource/datasource-debug.js | 3017 +++ .../yui/build/datasource/datasource-min.js | 12 + public/css/yui/build/datasource/datasource.js | 2946 +++ .../build/datatable/assets/datatable-core.css | 93 + .../yui/build/datatable/assets/datatable.css | 49 + .../assets/skins/sam/datatable-skin.css | 240 + .../datatable/assets/skins/sam/datatable.css | 8 + .../assets/skins/sam/dt-arrow-dn.png | Bin 0 -> 116 bytes .../assets/skins/sam/dt-arrow-up.png | Bin 0 -> 116 bytes .../yui/build/datatable/datatable-debug.js | 17196 ++++++++++++++++ .../css/yui/build/datatable/datatable-min.js | 29 + public/css/yui/build/datatable/datatable.js | 16957 +++++++++++++++ public/css/yui/build/dom/dom-debug.js | 1837 ++ public/css/yui/build/dom/dom-min.js | 9 + public/css/yui/build/dom/dom.js | 1799 ++ .../css/yui/build/dragdrop/dragdrop-debug.js | 3710 ++++ public/css/yui/build/dragdrop/dragdrop-min.js | 10 + public/css/yui/build/dragdrop/dragdrop.js | 3601 ++++ .../yui/build/editor/assets/editor-core.css | 581 + .../build/editor/assets/simpleeditor-core.css | 573 + .../editor/assets/skins/sam/blankimage.png | Bin 0 -> 2314 bytes .../editor/assets/skins/sam/editor-knob.gif | Bin 0 -> 138 bytes .../editor/assets/skins/sam/editor-skin.css | 707 + .../assets/skins/sam/editor-sprite-active.gif | Bin 0 -> 5614 bytes .../editor/assets/skins/sam/editor-sprite.gif | Bin 0 -> 5690 bytes .../build/editor/assets/skins/sam/editor.css | 10 + .../assets/skins/sam/simpleeditor-skin.css | 707 + .../editor/assets/skins/sam/simpleeditor.css | 10 + public/css/yui/build/editor/editor-debug.js | 9297 +++++++++ public/css/yui/build/editor/editor-min.js | 29 + public/css/yui/build/editor/editor.js | 9188 +++++++++ .../yui/build/editor/simpleeditor-debug.js | 7256 +++++++ .../css/yui/build/editor/simpleeditor-min.js | 23 + public/css/yui/build/editor/simpleeditor.js | 7170 +++++++ public/css/yui/build/element/element-debug.js | 1072 + public/css/yui/build/element/element-min.js | 8 + public/css/yui/build/element/element.js | 1057 + public/css/yui/build/event/event-debug.js | 2554 +++ public/css/yui/build/event/event-min.js | 11 + public/css/yui/build/event/event.js | 2529 +++ public/css/yui/build/fonts/fonts-min.css | 7 + public/css/yui/build/fonts/fonts.css | 56 + public/css/yui/build/get/get-debug.js | 742 + public/css/yui/build/get/get-min.js | 7 + public/css/yui/build/get/get.js | 724 + public/css/yui/build/grids/grids-min.css | 7 + public/css/yui/build/grids/grids.css | 467 + .../css/yui/build/history/assets/blank.html | 1 + public/css/yui/build/history/history-debug.js | 803 + public/css/yui/build/history/history-min.js | 7 + public/css/yui/build/history/history.js | 803 + .../imagecropper/assets/imagecropper-core.css | 33 + .../assets/skins/sam/imagecropper-skin.css | 16 + .../assets/skins/sam/imagecropper.css | 7 + .../build/imagecropper/imagecropper-debug.js | 907 + .../build/imagecropper/imagecropper-min.js | 8 + .../yui/build/imagecropper/imagecropper.js | 889 + .../build/imageloader/imageloader-debug.js | 487 + .../yui/build/imageloader/imageloader-min.js | 7 + .../css/yui/build/imageloader/imageloader.js | 481 + public/css/yui/build/json/json-debug.js | 396 + public/css/yui/build/json/json-min.js | 7 + public/css/yui/build/json/json.js | 396 + .../yui/build/layout/assets/layout-core.css | 158 + .../layout/assets/skins/sam/layout-skin.css | 198 + .../build/layout/assets/skins/sam/layout.css | 7 + .../layout/assets/skins/sam/layout_sprite.png | Bin 0 -> 1409 bytes public/css/yui/build/layout/layout-debug.js | 2257 ++ public/css/yui/build/layout/layout-min.js | 11 + public/css/yui/build/layout/layout.js | 2242 ++ .../yui/build/logger/assets/logger-core.css | 7 + public/css/yui/build/logger/assets/logger.css | 57 + .../logger/assets/skins/sam/logger-skin.css | 55 + .../build/logger/assets/skins/sam/logger.css | 7 + public/css/yui/build/logger/logger-debug.js | 2044 ++ public/css/yui/build/logger/logger-min.js | 9 + public/css/yui/build/logger/logger.js | 2044 ++ .../css/yui/build/menu/assets/menu-core.css | 242 + public/css/yui/build/menu/assets/menu.css | 497 + .../yui/build/menu/assets/menu_down_arrow.png | Bin 0 -> 3624 bytes .../menu/assets/menu_down_arrow_disabled.png | Bin 0 -> 3621 bytes .../yui/build/menu/assets/menu_up_arrow.png | Bin 0 -> 936 bytes .../menu/assets/menu_up_arrow_disabled.png | Bin 0 -> 936 bytes .../assets/menubaritem_submenuindicator.png | Bin 0 -> 3623 bytes .../menubaritem_submenuindicator_disabled.png | Bin 0 -> 3623 bytes .../menubaritem_submenuindicator_selected.png | Bin 0 -> 3623 bytes .../build/menu/assets/menuitem_checkbox.png | Bin 0 -> 956 bytes .../assets/menuitem_checkbox_disabled.png | Bin 0 -> 956 bytes .../assets/menuitem_checkbox_selected.png | Bin 0 -> 956 bytes .../menu/assets/menuitem_submenuindicator.png | Bin 0 -> 942 bytes .../menuitem_submenuindicator_disabled.png | Bin 0 -> 942 bytes .../menuitem_submenuindicator_selected.png | Bin 0 -> 942 bytes .../build/menu/assets/skins/sam/menu-skin.css | 325 + .../yui/build/menu/assets/skins/sam/menu.css | 7 + .../sam/menubaritem_submenuindicator.png | Bin 0 -> 3618 bytes .../menubaritem_submenuindicator_disabled.png | Bin 0 -> 3618 bytes .../assets/skins/sam/menuitem_checkbox.png | Bin 0 -> 3625 bytes .../skins/sam/menuitem_checkbox_disabled.png | Bin 0 -> 3625 bytes .../skins/sam/menuitem_submenuindicator.png | Bin 0 -> 3617 bytes .../menuitem_submenuindicator_disabled.png | Bin 0 -> 3617 bytes public/css/yui/build/menu/menu-debug.js | 9855 +++++++++ public/css/yui/build/menu/menu-min.js | 16 + public/css/yui/build/menu/menu.js | 9808 +++++++++ .../build/paginator/assets/paginator-core.css | 6 + .../assets/skins/sam/paginator-skin.css | 78 + .../paginator/assets/skins/sam/paginator.css | 7 + .../yui/build/paginator/paginator-debug.js | 2359 +++ .../css/yui/build/paginator/paginator-min.js | 10 + public/css/yui/build/paginator/paginator.js | 2359 +++ .../css/yui/build/profiler/profiler-debug.js | 380 + public/css/yui/build/profiler/profiler-min.js | 7 + public/css/yui/build/profiler/profiler.js | 380 + .../assets/profilerviewer-core.css | 6 + .../profilerviewer/assets/skins/sam/asc.gif | Bin 0 -> 177 bytes .../profilerviewer/assets/skins/sam/desc.gif | Bin 0 -> 177 bytes .../assets/skins/sam/header_background.png | Bin 0 -> 158 bytes .../assets/skins/sam/profilerviewer-skin.css | 167 + .../assets/skins/sam/profilerviewer.css | 7 + .../profilerviewer/assets/skins/sam/wait.gif | Bin 0 -> 1100 bytes .../profilerviewer/profilerviewer-debug.js | 1229 ++ .../profilerviewer/profilerviewer-min.js | 9 + .../build/profilerviewer/profilerviewer.js | 1192 ++ .../reset-fonts-grids/reset-fonts-grids.css | 7 + .../css/yui/build/reset-fonts/reset-fonts.css | 7 + public/css/yui/build/reset/reset-min.css | 7 + public/css/yui/build/reset/reset.css | 142 + .../yui/build/resize/assets/resize-core.css | 173 + .../resize/assets/skins/sam/layout_sprite.png | Bin 0 -> 1409 bytes .../resize/assets/skins/sam/resize-skin.css | 142 + .../build/resize/assets/skins/sam/resize.css | 7 + public/css/yui/build/resize/resize-debug.js | 1749 ++ public/css/yui/build/resize/resize-min.js | 10 + public/css/yui/build/resize/resize.js | 1689 ++ .../css/yui/build/selector/selector-debug.js | 655 + public/css/yui/build/selector/selector-min.js | 8 + public/css/yui/build/selector/selector.js | 648 + .../css/yui/build/slider/assets/bg-fader.gif | Bin 0 -> 433 bytes public/css/yui/build/slider/assets/bg-h.gif | Bin 0 -> 212 bytes public/css/yui/build/slider/assets/bg-v-e.gif | Bin 0 -> 476 bytes public/css/yui/build/slider/assets/bg-v.gif | Bin 0 -> 481 bytes .../yui/build/slider/assets/left-thumb.png | Bin 0 -> 348 bytes .../yui/build/slider/assets/right-thumb.png | Bin 0 -> 356 bytes .../build/slider/assets/skins/sam/bg-h.gif | Bin 0 -> 212 bytes .../build/slider/assets/skins/sam/bg-v.gif | Bin 0 -> 481 bytes .../slider/assets/skins/sam/slider-skin.css | 20 + .../build/slider/assets/skins/sam/slider.css | 7 + .../yui/build/slider/assets/slider-core.css | 15 + .../yui/build/slider/assets/slider-skin.css | 20 + .../css/yui/build/slider/assets/thumb-bar.gif | Bin 0 -> 580 bytes .../css/yui/build/slider/assets/thumb-e.gif | Bin 0 -> 340 bytes .../yui/build/slider/assets/thumb-fader.gif | Bin 0 -> 645 bytes .../css/yui/build/slider/assets/thumb-n.gif | Bin 0 -> 612 bytes .../css/yui/build/slider/assets/thumb-s.gif | Bin 0 -> 615 bytes .../css/yui/build/slider/assets/thumb-w.gif | Bin 0 -> 340 bytes public/css/yui/build/slider/slider-debug.js | 2114 ++ public/css/yui/build/slider/slider-min.js | 9 + public/css/yui/build/slider/slider.js | 2068 ++ .../yui/build/stylesheet/stylesheet-debug.js | 643 + .../yui/build/stylesheet/stylesheet-min.js | 7 + public/css/yui/build/stylesheet/stylesheet.js | 639 + .../yui/build/tabview/assets/border_tabs.css | 54 + .../css/yui/build/tabview/assets/loading.gif | Bin 0 -> 729 bytes .../css/yui/build/tabview/assets/skin-sam.css | 77 + .../tabview/assets/skins/sam/tabview-skin.css | 186 + .../tabview/assets/skins/sam/tabview.css | 8 + .../yui/build/tabview/assets/tabview-core.css | 125 + .../css/yui/build/tabview/assets/tabview.css | 77 + public/css/yui/build/tabview/tabview-debug.js | 988 + public/css/yui/build/tabview/tabview-min.js | 8 + public/css/yui/build/tabview/tabview.js | 980 + .../css/yui/build/treeview/assets/check0.gif | Bin 0 -> 608 bytes .../css/yui/build/treeview/assets/check1.gif | Bin 0 -> 622 bytes .../css/yui/build/treeview/assets/check2.gif | Bin 0 -> 609 bytes .../css/yui/build/treeview/assets/loading.gif | Bin 0 -> 2673 bytes .../treeview/assets/skins/sam/loading.gif | Bin 0 -> 2673 bytes .../assets/skins/sam/treeview-loading.gif | Bin 0 -> 2673 bytes .../assets/skins/sam/treeview-skin.css | 198 + .../assets/skins/sam/treeview-sprite.gif | Bin 0 -> 4326 bytes .../treeview/assets/skins/sam/treeview.css | 7 + .../build/treeview/assets/treeview-core.css | 6 + .../treeview/assets/treeview-loading.gif | Bin 0 -> 2673 bytes .../build/treeview/assets/treeview-skin.css | 248 + .../build/treeview/assets/treeview-sprite.gif | Bin 0 -> 4326 bytes .../css/yui/build/treeview/treeview-debug.js | 3734 ++++ public/css/yui/build/treeview/treeview-min.js | 12 + public/css/yui/build/treeview/treeview.js | 3666 ++++ .../yui/build/uploader/assets/uploader.swf | Bin 0 -> 6920 bytes .../css/yui/build/uploader/uploader-debug.js | 1057 + .../uploader/uploader-experimental-debug.js | 1057 + public/css/yui/build/uploader/uploader-min.js | 15 + public/css/yui/build/uploader/uploader.js | 1054 + public/css/yui/build/utilities/utilities.js | 38 + .../build/yahoo-dom-event/yahoo-dom-event.js | 13 + public/css/yui/build/yahoo/yahoo-debug.js | 1028 + public/css/yui/build/yahoo/yahoo-min.js | 7 + public/css/yui/build/yahoo/yahoo.js | 1028 + .../yuiloader-dom-event.js | 17 + .../yui/build/yuiloader/yuiloader-debug.js | 3724 ++++ .../css/yui/build/yuiloader/yuiloader-min.js | 10 + public/css/yui/build/yuiloader/yuiloader.js | 3724 ++++ .../yuitest/assets/skins/sam/yuitest-skin.css | 7 + .../yuitest/assets/skins/sam/yuitest.css | 7 + .../yui/build/yuitest/assets/testlogger.css | 7 + .../yui/build/yuitest/assets/yuitest-core.css | 7 + public/css/yui/build/yuitest/yuitest-debug.js | 3370 +++ public/css/yui/build/yuitest/yuitest-min.js | 11 + public/css/yui/build/yuitest/yuitest.js | 3370 +++ .../yui/build/yuitest/yuitest_core-debug.js | 1991 ++ .../css/yui/build/yuitest/yuitest_core-min.js | 9 + public/css/yui/build/yuitest/yuitest_core.js | 1991 ++ public/css/yui/index.html | 175 + public/images/22x22/apply.png | Bin 0 -> 686 bytes public/images/22x22/face-crying.png | Bin 0 -> 1369 bytes public/images/22x22/face-smile-big.png | Bin 0 -> 1328 bytes public/images/22x22/help.png | Bin 0 -> 1222 bytes public/images/22x22/im-user-offline.png | Bin 0 -> 1034 bytes public/images/22x22/im-user.png | Bin 0 -> 1109 bytes public/images/22x22/never.png | Bin 0 -> 1344 bytes public/images/22x22/no-note.png | Bin 0 -> 879 bytes public/images/22x22/no.png | Bin 0 -> 1251 bytes public/images/22x22/note.png | Bin 0 -> 1369 bytes public/images/22x22/player_stop.png | Bin 0 -> 1122 bytes public/images/22x22/presentation.png | Bin 0 -> 1035 bytes public/images/22x22/video.png | Bin 0 -> 795 bytes public/images/22x22/waiting.png | Bin 0 -> 3608 bytes public/images/22x22/yes.png | Bin 0 -> 794 bytes public/images/32x32/check.png | Bin 0 -> 2641 bytes public/images/32x32/cross.png | Bin 0 -> 1996 bytes public/images/Joomla_big.png | Bin 0 -> 32884 bytes public/images/arrow-left-double.png | Bin 0 -> 653 bytes public/images/arrow-left.png | Bin 0 -> 512 bytes public/images/arrow-right-double.png | Bin 0 -> 666 bytes public/images/arrow-right.png | Bin 0 -> 527 bytes public/images/arrow_down.gif | Bin 0 -> 107 bytes public/images/arrow_up.gif | Bin 0 -> 108 bytes public/images/background.jpg | Bin 0 -> 1213 bytes public/images/colorbox/border.png | Bin 0 -> 163 bytes public/images/colorbox/controls.png | Bin 0 -> 2033 bytes public/images/colorbox/loading.gif | Bin 0 -> 9427 bytes public/images/colorbox/loading_background.png | Bin 0 -> 166 bytes public/images/icon_no.png | Bin 0 -> 907 bytes public/images/icon_password.png | Bin 0 -> 750 bytes public/images/icon_refresh.png | Bin 0 -> 1135 bytes public/images/icon_unknown.png | Bin 0 -> 746 bytes public/images/icon_yes.png | Bin 0 -> 883 bytes public/images/image-missing.png | Bin 0 -> 10568 bytes public/images/inconsistent1.gif | Bin 0 -> 192 bytes public/images/inconsistent2.gif | Bin 0 -> 192 bytes public/images/inex-green-corner-153x168.gif | Bin 0 -> 1873 bytes public/images/inex-logo-150x73.jpg | Bin 0 -> 3100 bytes public/images/ixpmanager-dot-i.gif | Bin 0 -> 589 bytes public/images/joomla-admin/acroread.png | Bin 0 -> 2916 bytes public/images/joomla-admin/addedit.png | Bin 0 -> 1859 bytes public/images/joomla-admin/background.jpg | Bin 0 -> 1269 bytes public/images/joomla-admin/backup.png | Bin 0 -> 1774 bytes public/images/joomla-admin/browser.png | Bin 0 -> 2049 bytes public/images/joomla-admin/cabinets.png | Bin 0 -> 3145 bytes public/images/joomla-admin/categories.png | Bin 0 -> 1787 bytes public/images/joomla-admin/change-log.png | Bin 0 -> 845 bytes public/images/joomla-admin/checkin.png | Bin 0 -> 1876 bytes public/images/joomla-admin/config.png | Bin 0 -> 1966 bytes public/images/joomla-admin/console.png | Bin 0 -> 2130 bytes public/images/joomla-admin/cpanel.png | Bin 0 -> 1736 bytes public/images/joomla-admin/dbrestore.png | Bin 0 -> 2028 bytes public/images/joomla-admin/drive-optical.png | Bin 0 -> 2442 bytes public/images/joomla-admin/drupalicon.png | Bin 0 -> 3154 bytes public/images/joomla-admin/email.png | Bin 0 -> 4142 bytes public/images/joomla-admin/frontpage.png | Bin 0 -> 1678 bytes public/images/joomla-admin/gaim.png | Bin 0 -> 3671 bytes public/images/joomla-admin/generic.png | Bin 0 -> 2283 bytes public/images/joomla-admin/header_bg.png | Bin 0 -> 278 bytes public/images/joomla-admin/header_text.png | Bin 0 -> 6994 bytes public/images/joomla-admin/help_index.png | Bin 0 -> 3812 bytes public/images/joomla-admin/impressions.png | Bin 0 -> 1984 bytes public/images/joomla-admin/inbox.png | Bin 0 -> 1886 bytes public/images/joomla-admin/insert-link.png | Bin 0 -> 3616 bytes public/images/joomla-admin/install.png | Bin 0 -> 33826 bytes public/images/joomla-admin/interface.png | Bin 0 -> 3153 bytes .../images/joomla-admin/jabber_protocol.png | Bin 0 -> 3899 bytes public/images/joomla-admin/joomla.png | Bin 0 -> 4281 bytes public/images/joomla-admin/kcmdrkonqi.png | Bin 0 -> 2647 bytes public/images/joomla-admin/kdmconfig.png | Bin 0 -> 4151 bytes public/images/joomla-admin/keditbookmarks.png | Bin 0 -> 2663 bytes public/images/joomla-admin/kfm_home.png | Bin 0 -> 3719 bytes .../images/joomla-admin/knetworkmanager.png | Bin 0 -> 7282 bytes public/images/joomla-admin/kontact.png | Bin 0 -> 4114 bytes public/images/joomla-admin/kpf.png | Bin 0 -> 6364 bytes public/images/joomla-admin/krdc.png | Bin 0 -> 4335 bytes public/images/joomla-admin/krfb.png | Bin 0 -> 5508 bytes public/images/joomla-admin/ksysguard.png | Bin 0 -> 4804 bytes public/images/joomla-admin/langmanager.png | Bin 0 -> 1705 bytes public/images/joomla-admin/login.gif | Bin 0 -> 207 bytes public/images/joomla-admin/massemail.png | Bin 0 -> 1974 bytes public/images/joomla-admin/mediamanager.png | Bin 0 -> 1985 bytes public/images/joomla-admin/menu.png | Bin 0 -> 2063 bytes public/images/joomla-admin/menu/acroread.png | Bin 0 -> 944 bytes .../images/joomla-admin/menu/add_section.png | Bin 0 -> 916 bytes public/images/joomla-admin/menu/arrow.png | Bin 0 -> 174 bytes public/images/joomla-admin/menu/backup.png | Bin 0 -> 784 bytes public/images/joomla-admin/menu/blank.png | Bin 0 -> 151 bytes public/images/joomla-admin/menu/cabinets.png | Bin 0 -> 566 bytes .../images/joomla-admin/menu/categories.png | Bin 0 -> 914 bytes public/images/joomla-admin/menu/checkin.png | Bin 0 -> 871 bytes public/images/joomla-admin/menu/checkinbw.png | Bin 0 -> 448 bytes public/images/joomla-admin/menu/component.png | Bin 0 -> 900 bytes public/images/joomla-admin/menu/config.png | Bin 0 -> 716 bytes .../images/joomla-admin/menu/connection.png | Bin 0 -> 1003 bytes public/images/joomla-admin/menu/console.png | Bin 0 -> 696 bytes public/images/joomla-admin/menu/content.png | Bin 0 -> 907 bytes public/images/joomla-admin/menu/contents.png | Bin 0 -> 1111 bytes .../images/joomla-admin/menu/controlpanel.png | Bin 0 -> 911 bytes public/images/joomla-admin/menu/credits.png | Bin 0 -> 888 bytes public/images/joomla-admin/menu/cust-kit.png | Bin 0 -> 725 bytes public/images/joomla-admin/menu/db.png | Bin 0 -> 902 bytes public/images/joomla-admin/menu/document.png | Bin 0 -> 779 bytes .../joomla-admin/menu/drive-optical.png | Bin 0 -> 556 bytes public/images/joomla-admin/menu/edit.png | Bin 0 -> 935 bytes public/images/joomla-admin/menu/globe1.png | Bin 0 -> 919 bytes public/images/joomla-admin/menu/globe2.png | Bin 0 -> 885 bytes public/images/joomla-admin/menu/globe3.png | Bin 0 -> 940 bytes public/images/joomla-admin/menu/globe4.png | Bin 0 -> 28913 bytes public/images/joomla-admin/menu/gpg.png | Bin 0 -> 750 bytes public/images/joomla-admin/menu/help.png | Bin 0 -> 868 bytes public/images/joomla-admin/menu/home.png | Bin 0 -> 894 bytes public/images/joomla-admin/menu/icon_film.png | Bin 0 -> 553 bytes public/images/joomla-admin/menu/icon_reel.png | Bin 0 -> 768 bytes public/images/joomla-admin/menu/index.html | 4 + .../images/joomla-admin/menu/insert-link.png | Bin 0 -> 857 bytes public/images/joomla-admin/menu/install.png | Bin 0 -> 915 bytes public/images/joomla-admin/menu/interface.png | Bin 0 -> 697 bytes .../images/joomla-admin/menu/joomla_16x16.png | Bin 0 -> 1038 bytes public/images/joomla-admin/menu/kontact.png | Bin 0 -> 921 bytes public/images/joomla-admin/menu/language.png | Bin 0 -> 895 bytes public/images/joomla-admin/menu/license.png | Bin 0 -> 860 bytes public/images/joomla-admin/menu/mail.png | Bin 0 -> 566 bytes public/images/joomla-admin/menu/mainmenu.png | Bin 0 -> 602 bytes .../images/joomla-admin/menu/mass_email.png | Bin 0 -> 922 bytes public/images/joomla-admin/menu/media.png | Bin 0 -> 909 bytes public/images/joomla-admin/menu/meetings.png | Bin 0 -> 1096 bytes public/images/joomla-admin/menu/menus.png | Bin 0 -> 908 bytes public/images/joomla-admin/menu/messaging.png | Bin 0 -> 901 bytes .../joomla-admin/menu/messaging_config.png | Bin 0 -> 933 bytes .../joomla-admin/menu/messaging_inbox.png | Bin 0 -> 920 bytes public/images/joomla-admin/menu/module.png | Bin 0 -> 867 bytes public/images/joomla-admin/menu/network.png | Bin 0 -> 894 bytes public/images/joomla-admin/menu/php.png | Bin 0 -> 745 bytes public/images/joomla-admin/menu/preview.png | Bin 0 -> 941 bytes public/images/joomla-admin/menu/query.png | Bin 0 -> 912 bytes public/images/joomla-admin/menu/rack.png | Bin 0 -> 327 bytes public/images/joomla-admin/menu/remote.png | Bin 0 -> 957 bytes public/images/joomla-admin/menu/restore.png | Bin 0 -> 891 bytes .../images/joomla-admin/menu/search_text.png | Bin 0 -> 935 bytes public/images/joomla-admin/menu/sections.png | Bin 0 -> 385 bytes public/images/joomla-admin/menu/spacer.png | Bin 0 -> 58 bytes .../images/joomla-admin/menu/statistics.png | Bin 0 -> 891 bytes public/images/joomla-admin/menu/switch.png | Bin 0 -> 776 bytes public/images/joomla-admin/menu/sysinfo.png | Bin 0 -> 882 bytes .../images/joomla-admin/menu/system-users.png | Bin 0 -> 2092 bytes public/images/joomla-admin/menu/template.png | Bin 0 -> 926 bytes public/images/joomla-admin/menu/tooltip.png | Bin 0 -> 748 bytes public/images/joomla-admin/menu/trash.png | Bin 0 -> 936 bytes public/images/joomla-admin/menu/tux.png | Bin 0 -> 598 bytes public/images/joomla-admin/menu/user.png | Bin 0 -> 818 bytes public/images/joomla-admin/menu/users.png | Bin 0 -> 878 bytes public/images/joomla-admin/menu/users_add.png | Bin 0 -> 934 bytes public/images/joomla-admin/menu/vendors.png | Bin 0 -> 971 bytes public/images/joomla-admin/menu/vlan.png | Bin 0 -> 939 bytes public/images/joomla-admin/menu/warning.png | Bin 0 -> 1083 bytes public/images/joomla-admin/message_config.png | Bin 0 -> 1784 bytes public/images/joomla-admin/module.png | Bin 0 -> 1674 bytes public/images/joomla-admin/multimedia.png | Bin 0 -> 3703 bytes public/images/joomla-admin/package.png | Bin 0 -> 4253 bytes .../joomla-admin/package_multimedia.png | Bin 0 -> 4183 bytes .../images/joomla-admin/package_network.png | Bin 0 -> 4737 bytes .../images/joomla-admin/package_settings.png | Bin 0 -> 3570 bytes public/images/joomla-admin/package_system.png | Bin 0 -> 4135 bytes .../images/joomla-admin/package_utilities.png | Bin 0 -> 3982 bytes .../joomla-admin/package_wordprocessing.png | Bin 0 -> 5563 bytes public/images/joomla-admin/personal.png | Bin 0 -> 3404 bytes public/images/joomla-admin/query.png | Bin 0 -> 2022 bytes public/images/joomla-admin/remote.png | Bin 0 -> 1921 bytes public/images/joomla-admin/samba.png | Bin 0 -> 2401 bytes public/images/joomla-admin/searchtext.png | Bin 0 -> 2012 bytes public/images/joomla-admin/sections.png | Bin 0 -> 1706 bytes public/images/joomla-admin/security.png | Bin 0 -> 2525 bytes public/images/joomla-admin/stop.png | Bin 0 -> 3507 bytes public/images/joomla-admin/switch.png | Bin 0 -> 3293 bytes public/images/joomla-admin/system-users.png | Bin 0 -> 3208 bytes public/images/joomla-admin/systeminfo.png | Bin 0 -> 1962 bytes .../images/joomla-admin/templatemanager.png | Bin 0 -> 1722 bytes public/images/joomla-admin/trash.png | Bin 0 -> 2094 bytes public/images/joomla-admin/tux.png | Bin 0 -> 3076 bytes public/images/joomla-admin/user.png | Bin 0 -> 1699 bytes public/images/joomla-admin/vendor.png | Bin 0 -> 4740 bytes public/images/joomla-admin/vlan.png | Bin 0 -> 5158 bytes public/images/joomla-admin/xfmail.png | Bin 0 -> 5244 bytes public/images/no.gif | Bin 0 -> 372 bytes .../images/route-server-peering-fullmesh.png | Bin 0 -> 45177 bytes public/images/route-server-peering-rsonly.png | Bin 0 -> 39318 bytes public/images/throbber-small.gif | Bin 0 -> 825 bytes public/images/yes.gif | Bin 0 -> 194 bytes public/index.php | 60 + public/js/JSCookMenu_mini.js | 292 + public/js/jquery-ui.js | 298 + public/js/jquery/jquery-1.3.2.min.js | 19 + public/js/jquery/jquery.colorbox-min.js | 2 + public/js/jwysiwyg/jquery.wysiwyg.css | 57 + public/js/jwysiwyg/jquery.wysiwyg.gif | Bin 0 -> 4478 bytes public/js/jwysiwyg/jquery.wysiwyg.jpg | Bin 0 -> 67241 bytes public/js/jwysiwyg/jquery.wysiwyg.js | 745 + public/js/oss_tooltip.js | 246 + public/js/php.js | 963 + public/js/theme.js | 45 + public/js/virtual-interface-list.js | 182 + 964 files changed, 329023 insertions(+) create mode 100644 CHANGELOG create mode 100644 LICENSE create mode 100644 application/Bootstrap.php create mode 100644 application/configs/application.ini.dist create mode 100644 application/controllers/AdminController.php create mode 100644 application/controllers/ApplicationController.php create mode 100644 application/controllers/AuthController.php create mode 100644 application/controllers/CabinetController.php create mode 100644 application/controllers/ChangeLogController.php create mode 100644 application/controllers/CliController.php create mode 100644 application/controllers/ConsoleServerConnectionController.php create mode 100644 application/controllers/ContactController.php create mode 100644 application/controllers/CustAdminController.php create mode 100644 application/controllers/CustKitController.php create mode 100644 application/controllers/CustomerController.php create mode 100644 application/controllers/DashboardController.php create mode 100644 application/controllers/ErrorController.php create mode 100644 application/controllers/IndexController.php create mode 100644 application/controllers/Ipv4AddressController.php create mode 100644 application/controllers/Ipv6AddressController.php create mode 100644 application/controllers/IrrdbConfigController.php create mode 100644 application/controllers/LocationController.php create mode 100644 application/controllers/LogicalCircuitController.php create mode 100644 application/controllers/MeetingController.php create mode 100644 application/controllers/MeetingItemController.php create mode 100644 application/controllers/MrtgController.php create mode 100644 application/controllers/PatchPanelController.php create mode 100644 application/controllers/PatchPanelPortController.php create mode 100644 application/controllers/PeeringMatrixController.php create mode 100644 application/controllers/PhysicalInterfaceController.php create mode 100644 application/controllers/ProfileController.php create mode 100644 application/controllers/ProvisionController.php create mode 100644 application/controllers/SecController.php create mode 100644 application/controllers/SecViewerController.php create mode 100644 application/controllers/SwitchController.php create mode 100644 application/controllers/SwitchPortController.php create mode 100644 application/controllers/UserController.php create mode 100644 application/controllers/UtilsController.php create mode 100644 application/controllers/VendorController.php create mode 100644 application/controllers/VirtualInterfaceController.php create mode 100644 application/controllers/VlanController.php create mode 100644 application/controllers/VlanInterfaceController.php create mode 100644 application/models/Bgpsessiondata.php create mode 100644 application/models/BgpsessiondataTable.php create mode 100644 application/models/Cabinet.php create mode 100644 application/models/CabinetTable.php create mode 100644 application/models/ChangeLog.php create mode 100644 application/models/ChangeLogTable.php create mode 100644 application/models/Consoleserverconnection.php create mode 100644 application/models/ConsoleserverconnectionSeq.php create mode 100644 application/models/ConsoleserverconnectionSeqTable.php create mode 100644 application/models/ConsoleserverconnectionTable.php create mode 100644 application/models/Contact.php create mode 100644 application/models/ContactSeq.php create mode 100644 application/models/ContactSeqTable.php create mode 100644 application/models/ContactTable.php create mode 100644 application/models/Cust.php create mode 100644 application/models/CustSeq.php create mode 100644 application/models/CustSeqTable.php create mode 100644 application/models/CustTable.php create mode 100644 application/models/Custkit.php create mode 100644 application/models/CustkitTable.php create mode 100644 application/models/History.php create mode 100644 application/models/HistoryTable.php create mode 100644 application/models/Ipv4address.php create mode 100644 application/models/Ipv4addressTable.php create mode 100644 application/models/Ipv6address.php create mode 100644 application/models/Ipv6addressTable.php create mode 100644 application/models/Irrdbconfig.php create mode 100644 application/models/IrrdbconfigTable.php create mode 100644 application/models/Location.php create mode 100644 application/models/LocationTable.php create mode 100644 application/models/LogicalCircuit.php create mode 100644 application/models/LogicalCircuitTable.php create mode 100644 application/models/Meeting.php create mode 100644 application/models/MeetingItem.php create mode 100644 application/models/MeetingItemTable.php create mode 100644 application/models/MeetingTable.php create mode 100644 application/models/MyPeeringMatrix.php create mode 100644 application/models/MyPeeringMatrixNotes.php create mode 100644 application/models/MyPeeringMatrixNotesTable.php create mode 100644 application/models/MyPeeringMatrixTable.php create mode 100644 application/models/Networkinfo.php create mode 100644 application/models/NetworkinfoTable.php create mode 100644 application/models/PatchPanel.php create mode 100644 application/models/PatchPanelPort.php create mode 100644 application/models/PatchPanelPortTable.php create mode 100644 application/models/PatchPanelTable.php create mode 100644 application/models/PeeringMatrix.php create mode 100644 application/models/PeeringMatrixTable.php create mode 100644 application/models/PhysicalCircuit.php create mode 100644 application/models/PhysicalCircuitTable.php create mode 100644 application/models/Physicalinterface.php create mode 100644 application/models/PhysicalinterfaceSeq.php create mode 100644 application/models/PhysicalinterfaceSeqTable.php create mode 100644 application/models/PhysicalinterfaceTable.php create mode 100644 application/models/ProvisioningInterface.php create mode 100644 application/models/ProvisioningInterfaceTable.php create mode 100644 application/models/SecEvent.php create mode 100644 application/models/SecEventTable.php create mode 100644 application/models/Switch.php create mode 100644 application/models/SwitchSeq.php create mode 100644 application/models/SwitchSeqTable.php create mode 100644 application/models/SwitchTable.php create mode 100644 application/models/Switchport.php create mode 100644 application/models/SwitchportTable.php create mode 100644 application/models/Traffic95th.php create mode 100644 application/models/Traffic95thMonthly.php create mode 100644 application/models/Traffic95thMonthlyTable.php create mode 100644 application/models/Traffic95thTable.php create mode 100644 application/models/TrafficDaily.php create mode 100644 application/models/TrafficDailyTable.php create mode 100644 application/models/User.php create mode 100644 application/models/UserPref.php create mode 100644 application/models/UserPrefTable.php create mode 100644 application/models/UserSeq.php create mode 100644 application/models/UserSeqTable.php create mode 100644 application/models/UserTable.php create mode 100644 application/models/Vendor.php create mode 100644 application/models/VendorTable.php create mode 100644 application/models/ViewCustCurrentActive.php create mode 100644 application/models/ViewCustCurrentActiveTable.php create mode 100644 application/models/ViewSwitchDetailsByCustid.php create mode 100644 application/models/ViewSwitchDetailsByCustidTable.php create mode 100644 application/models/ViewVlaninterfaceDetailsByCustid.php create mode 100644 application/models/ViewVlaninterfaceDetailsByCustidTable.php create mode 100644 application/models/Virtualinterface.php create mode 100644 application/models/VirtualinterfaceSeq.php create mode 100644 application/models/VirtualinterfaceSeqTable.php create mode 100644 application/models/VirtualinterfaceTable.php create mode 100644 application/models/Vlan.php create mode 100644 application/models/VlanSeq.php create mode 100644 application/models/VlanSeqTable.php create mode 100644 application/models/VlanTable.php create mode 100644 application/models/Vlaninterface.php create mode 100644 application/models/VlaninterfaceSeq.php create mode 100644 application/models/VlaninterfaceSeqTable.php create mode 100644 application/models/VlaninterfaceTable.php create mode 100644 application/models/generated/BaseBgpsessiondata.php create mode 100644 application/models/generated/BaseCabinet.php create mode 100644 application/models/generated/BaseChangeLog.php create mode 100644 application/models/generated/BaseConsoleserverconnection.php create mode 100644 application/models/generated/BaseConsoleserverconnectionSeq.php create mode 100644 application/models/generated/BaseContact.php create mode 100644 application/models/generated/BaseContactSeq.php create mode 100644 application/models/generated/BaseCust.php create mode 100644 application/models/generated/BaseCustSeq.php create mode 100644 application/models/generated/BaseCustkit.php create mode 100644 application/models/generated/BaseHistory.php create mode 100644 application/models/generated/BaseIpv4address.php create mode 100644 application/models/generated/BaseIpv6address.php create mode 100644 application/models/generated/BaseIrrdbconfig.php create mode 100644 application/models/generated/BaseLocation.php create mode 100644 application/models/generated/BaseLogicalCircuit.php create mode 100644 application/models/generated/BaseMeeting.php create mode 100644 application/models/generated/BaseMeetingItem.php create mode 100644 application/models/generated/BaseMyPeeringMatrix.php create mode 100644 application/models/generated/BaseMyPeeringMatrixNotes.php create mode 100644 application/models/generated/BaseNetworkinfo.php create mode 100644 application/models/generated/BasePatchPanel.php create mode 100644 application/models/generated/BasePatchPanelPort.php create mode 100644 application/models/generated/BasePeeringMatrix.php create mode 100644 application/models/generated/BasePhysicalCircuit.php create mode 100644 application/models/generated/BasePhysicalinterface.php create mode 100644 application/models/generated/BasePhysicalinterfaceSeq.php create mode 100644 application/models/generated/BaseProvisioningInterface.php create mode 100644 application/models/generated/BaseSecEvent.php create mode 100644 application/models/generated/BaseSwitch.php create mode 100644 application/models/generated/BaseSwitchSeq.php create mode 100644 application/models/generated/BaseSwitchTable.php create mode 100644 application/models/generated/BaseSwitchport.php create mode 100644 application/models/generated/BaseTraffic95th.php create mode 100644 application/models/generated/BaseTraffic95thMonthly.php create mode 100644 application/models/generated/BaseTrafficDaily.php create mode 100644 application/models/generated/BaseUser.php create mode 100644 application/models/generated/BaseUserPref.php create mode 100644 application/models/generated/BaseUserSeq.php create mode 100644 application/models/generated/BaseVendor.php create mode 100644 application/models/generated/BaseViewCustCurrentActive.php create mode 100644 application/models/generated/BaseViewSwitchDetailsByCustid.php create mode 100644 application/models/generated/BaseViewVlaninterfaceDetailsByCustid.php create mode 100644 application/models/generated/BaseVirtualinterface.php create mode 100644 application/models/generated/BaseVirtualinterfaceSeq.php create mode 100644 application/models/generated/BaseVlan.php create mode 100644 application/models/generated/BaseVlanSeq.php create mode 100644 application/models/generated/BaseVlaninterface.php create mode 100644 application/models/generated/BaseVlaninterfaceSeq.php create mode 100644 application/views/admin/static/instructions-meetings.tpl create mode 100644 application/views/auth/drupal-login.tpl create mode 100644 application/views/auth/footer.tpl create mode 100644 application/views/auth/forgotten-password.tpl create mode 100644 application/views/auth/header.tpl create mode 100644 application/views/auth/login.tpl create mode 100644 application/views/change-log/addEdit-preamble.tpl create mode 100644 application/views/change-log/entries.tpl create mode 100644 application/views/cli/nagios/switch-definitions.tpl create mode 100644 application/views/cli/nagios/switch-hosts.tpl create mode 100644 application/views/cli/nagios/switch-templates.tpl create mode 100644 application/views/cust-admin/add-edit.tpl create mode 100644 application/views/cust-admin/list.tpl create mode 100644 application/views/cust-admin/mail/welcome.tpl create mode 100644 application/views/customer/addEdit.tpl create mode 100644 application/views/customer/leagueTable.tpl create mode 100644 application/views/customer/list.tpl create mode 100644 application/views/customer/mail/diff-footer.tpl create mode 100644 application/views/customer/mail/diff-header.tpl create mode 100644 application/views/customer/mail/diff-member.tpl create mode 100644 application/views/customer/mail/util-footer.tpl create mode 100644 application/views/customer/mail/util-header.tpl create mode 100644 application/views/customer/mail/util-member.tpl create mode 100644 application/views/customer/ninety-fifth.tpl create mode 100644 application/views/customer/sendWelcomeEmail.tpl create mode 100644 application/views/customer/statistics-by-lan.tpl create mode 100644 application/views/customer/statistics-list.tpl create mode 100644 application/views/customer/statistics-overview.tpl create mode 100644 application/views/customer/welcomeEmail.tpl create mode 100644 application/views/dashboard/as112.tpl create mode 100644 application/views/dashboard/email/peering-request.tpl create mode 100644 application/views/dashboard/index-tab-connections.tpl create mode 100644 application/views/dashboard/index-tab-details.tpl create mode 100644 application/views/dashboard/index-tab-overview.tpl create mode 100644 application/views/dashboard/index-tab-statistics.tpl create mode 100644 application/views/dashboard/index.tpl create mode 100644 application/views/dashboard/member-details.tpl create mode 100644 application/views/dashboard/members-details-list.tpl create mode 100644 application/views/dashboard/my-peering-matrix.tpl create mode 100644 application/views/dashboard/my-peering-matrix/ascii.tpl create mode 100644 application/views/dashboard/my-peering-matrix/csv.tpl create mode 100644 application/views/dashboard/my-peering-matrix/php.tpl create mode 100644 application/views/dashboard/peering-matrix.tpl create mode 100644 application/views/dashboard/popups/meeting.tpl create mode 100644 application/views/dashboard/rs-info.tpl create mode 100644 application/views/dashboard/sec-event-email-config.tpl create mode 100644 application/views/dashboard/static/fees.tpl create mode 100644 application/views/dashboard/static/help-my-peering-manager.tpl create mode 100644 application/views/dashboard/static/housing.tpl create mode 100644 application/views/dashboard/static/misc-benefits.tpl create mode 100644 application/views/dashboard/static/port-security.tpl create mode 100644 application/views/dashboard/static/support.tpl create mode 100644 application/views/dashboard/static/switches.tpl create mode 100644 application/views/dashboard/statistics-drilldown-mini.tpl create mode 100644 application/views/dashboard/statistics-drilldown.tpl create mode 100644 application/views/dashboard/statistics-peering-graphs.tpl create mode 100644 application/views/dashboard/statistics-switch-graphs.tpl create mode 100644 application/views/dashboard/statistics-trunk-graphs.tpl create mode 100644 application/views/dashboard/statistics.tpl create mode 100644 application/views/dashboard/switch-configuration.tpl create mode 100644 application/views/error/error-404.tpl create mode 100644 application/views/error/error-debug.tpl create mode 100644 application/views/error/error.tpl create mode 100644 application/views/footer-full-width.tpl create mode 100644 application/views/footer-tiny.tpl create mode 100644 application/views/footer.tpl create mode 100644 application/views/form/add-cancel.tpl create mode 100644 application/views/form/add-edit-cancel.tpl create mode 100644 application/views/frontend/addEdit.tpl create mode 100644 application/views/frontend/list.tpl create mode 100644 application/views/frontend/view.tpl create mode 100644 application/views/header-full-width.tpl create mode 100644 application/views/header-tiny.tpl create mode 100644 application/views/header.tpl create mode 100644 application/views/index/index.tpl create mode 100644 application/views/ipv4-address/list.tpl create mode 100644 application/views/ipv6-address/list.tpl create mode 100644 application/views/logical-circuit/addEdit.tpl create mode 100644 application/views/logical-circuit/form/add-edit.tpl create mode 100644 application/views/meeting-item/addEdit-preamble.tpl create mode 100644 application/views/meeting-item/list-pretable.tpl create mode 100644 application/views/meeting/addEdit-preamble.tpl create mode 100644 application/views/meeting/compose.tpl create mode 100644 application/views/meeting/core.tpl create mode 100644 application/views/meeting/customContextMenu.js.tpl create mode 100644 application/views/meeting/email/meeting.tpl create mode 100644 application/views/meeting/meetings.tpl create mode 100644 application/views/meeting/simple.tpl create mode 100644 application/views/meeting/simple2.tpl create mode 100644 application/views/menu.tpl create mode 100644 application/views/message.tpl create mode 100644 application/views/patch-panel/addEdit.tpl create mode 100644 application/views/patch-panel/edit-ports.tpl create mode 100644 application/views/patch-panel/form/autogen.tpl create mode 100644 application/views/patch-panel/form/patch-panel-port.tpl create mode 100644 application/views/patch-panel/form/patch-panel.tpl create mode 100644 application/views/peering-matrix/index.tpl create mode 100644 application/views/profile/index.tpl create mode 100644 application/views/provision/interface/list.tpl create mode 100644 application/views/provision/interface/mail/interface-details.tpl create mode 100644 application/views/provision/interface/overview.tpl create mode 100644 application/views/provision/interface/switch-config.tpl create mode 100644 application/views/sec-viewer/read.tpl create mode 100644 application/views/sec/cust_bgp_auth.tpl create mode 100644 application/views/sec/cust_port_updown.tpl create mode 100644 application/views/sec/cust_security_violation.tpl create mode 100644 application/views/sec/ops_bgp_auth.tpl create mode 100644 application/views/sec/ops_port_updown.tpl create mode 100644 application/views/sec/ops_security_violation.tpl create mode 100644 application/views/switch/customContextMenu.js.tpl create mode 100644 application/views/switch/port-report.tpl create mode 100644 application/views/user/customContextMenu.js.tpl create mode 100644 application/views/user/last.tpl create mode 100644 application/views/user/postContent.tpl create mode 100644 application/views/virtual-interface/addEdit.tpl create mode 100644 application/views/virtual-interface/list.tpl create mode 100755 bin/build-phpdoc.sh create mode 100755 bin/doctrine-cli.php create mode 100755 bin/ixptool.php create mode 100755 bin/sec-processor.php create mode 100644 bin/sec/SEC-README create mode 100644 bin/sec/cisco-test.log create mode 100644 bin/sec/cisco-test.log2 create mode 100644 bin/sec/sec-test.conf create mode 100755 data/oui-update.sh create mode 100644 data/oui.txt create mode 100644 doctrine/data/sql/inex-schema.sql create mode 100644 library/INEX/Auth/DoctrineAdapter.php create mode 100644 library/INEX/Controller/Action.php create mode 100644 library/INEX/Controller/FrontEnd.php create mode 100644 library/INEX/Controller/Request/Simple.php create mode 100644 library/INEX/Controller/Router/Cli.php create mode 100644 library/INEX/Debug.php create mode 100644 library/INEX/Exception.php create mode 100644 library/INEX/Filter/StripSlashes.php create mode 100644 library/INEX/Form.php create mode 100644 library/INEX/Form/Cabinet.php create mode 100644 library/INEX/Form/ChangeLog.php create mode 100644 library/INEX/Form/ConsoleServerConnection.php create mode 100644 library/INEX/Form/Contact.php create mode 100644 library/INEX/Form/CustKit.php create mode 100644 library/INEX/Form/Customer.php create mode 100644 library/INEX/Form/Customer/SendWelcomeEmail.php create mode 100644 library/INEX/Form/IrrdbConfig.php create mode 100644 library/INEX/Form/Location.php create mode 100644 library/INEX/Form/LogicalCircuit.php create mode 100644 library/INEX/Form/Meeting.php create mode 100644 library/INEX/Form/MeetingItem.php create mode 100644 library/INEX/Form/PatchPanel.php create mode 100644 library/INEX/Form/PatchPanelPorts.php create mode 100644 library/INEX/Form/PhysicalInterface.php create mode 100644 library/INEX/Form/Profile.php create mode 100644 library/INEX/Form/ProfilePassword.php create mode 100644 library/INEX/Form/Provision/InterfaceEmail.php create mode 100644 library/INEX/Form/SubForm.php create mode 100644 library/INEX/Form/SubForm/AddCancel.php create mode 100644 library/INEX/Form/SubForm/AddEditCancel.php create mode 100644 library/INEX/Form/SubForm/PatchPanel.php create mode 100644 library/INEX/Form/SubForm/PatchPanelAutoGen.php create mode 100644 library/INEX/Form/SubForm/PatchPanelPort.php create mode 100644 library/INEX/Form/Switch.php create mode 100644 library/INEX/Form/SwitchPort.php create mode 100644 library/INEX/Form/User.php create mode 100644 library/INEX/Form/VLAN.php create mode 100644 library/INEX/Form/Vendor.php create mode 100644 library/INEX/Form/VirtualInterface.php create mode 100644 library/INEX/Form/VlanInterface.php create mode 100644 library/INEX/Message.php create mode 100644 library/INEX/Mrtg.php create mode 100644 library/INEX/Resource/Auth.php create mode 100644 library/INEX/Resource/Doctrine.php create mode 100644 library/INEX/Resource/Logger.php create mode 100644 library/INEX/Resource/Mailer.php create mode 100644 library/INEX/Resource/Namespace.php create mode 100644 library/INEX/Resource/View.php create mode 100644 library/INEX/Resource/Zfdebug.php create mode 100644 library/INEX/SMS/Clickatell.php create mode 100644 library/INEX/View/Smarty.php create mode 100644 library/INEX/ZFDebug/Controller/Plugin/Debug/Plugin/Doctrine.php create mode 100644 library/apcinfo.php create mode 100644 library/inex-smarty/functions/compiler.include_if_exists.php create mode 100644 library/inex-smarty/functions/function.genDoctrinePagerLinks.php create mode 100644 library/inex-smarty/functions/function.genMrtgGraphBox.php create mode 100644 library/inex-smarty/functions/function.genMrtgImgUrl.php create mode 100644 library/inex-smarty/functions/function.genMrtgImgUrlTag.php create mode 100644 library/inex-smarty/functions/function.genUrl.php create mode 100644 library/inex-smarty/functions/function.getMrtgStatistics.php create mode 100644 library/inex-smarty/functions/function.mrtgScale.php create mode 100644 library/inex-smarty/functions/modifier.asnumber.php create mode 100644 library/inex-smarty/functions/modifier.underline.php create mode 100644 public/.htaccess.dist create mode 100644 public/css/base.css create mode 100644 public/css/colorbox.css create mode 100644 public/css/images/border.png create mode 100644 public/css/images/controls.png create mode 100644 public/css/images/loading.gif create mode 100644 public/css/images/loading_background.png create mode 100644 public/css/ixp-manager-old.css create mode 100644 public/css/ixp-manager.css create mode 100644 public/css/joomla-template_css.css create mode 100644 public/css/joomla-theme.css create mode 100644 public/css/joomla.css create mode 100644 public/css/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png create mode 100644 public/css/smoothness/images/ui-bg_flat_75_ffffff_40x100.png create mode 100644 public/css/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png create mode 100644 public/css/smoothness/images/ui-bg_glass_65_ffffff_1x400.png create mode 100644 public/css/smoothness/images/ui-bg_glass_75_dadada_1x400.png create mode 100644 public/css/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png create mode 100644 public/css/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png create mode 100644 public/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png create mode 100644 public/css/smoothness/images/ui-icons_222222_256x240.png create mode 100644 public/css/smoothness/images/ui-icons_2e83ff_256x240.png create mode 100644 public/css/smoothness/images/ui-icons_454545_256x240.png create mode 100644 public/css/smoothness/images/ui-icons_888888_256x240.png create mode 100644 public/css/smoothness/images/ui-icons_cd0a0a_256x240.png create mode 100644 public/css/smoothness/jquery-ui-1.7.2.custom.css create mode 100644 public/css/yui/assets/YUIexamples.js create mode 100644 public/css/yui/assets/bg_hd.gif create mode 100644 public/css/yui/assets/dpSyntaxHighlighter.css create mode 100644 public/css/yui/assets/dpSyntaxHighlighter.js create mode 100644 public/css/yui/assets/example-hd-bg.gif create mode 100644 public/css/yui/assets/title_h_bg.gif create mode 100644 public/css/yui/assets/yui-candy.jpg create mode 100644 public/css/yui/assets/yui.css create mode 100644 public/css/yui/assets/yui.gif create mode 100644 public/css/yui/assets/yuiDistribution.css create mode 100644 public/css/yui/assets/yuilib.jpg create mode 100644 public/css/yui/build/animation/animation-debug.js create mode 100644 public/css/yui/build/animation/animation-min.js create mode 100644 public/css/yui/build/animation/animation.js create mode 100644 public/css/yui/build/assets/skins/sam/ajax-loader.gif create mode 100644 public/css/yui/build/assets/skins/sam/asc.gif create mode 100644 public/css/yui/build/assets/skins/sam/autocomplete.css create mode 100644 public/css/yui/build/assets/skins/sam/bg-h.gif create mode 100644 public/css/yui/build/assets/skins/sam/bg-v.gif create mode 100644 public/css/yui/build/assets/skins/sam/blankimage.png create mode 100644 public/css/yui/build/assets/skins/sam/button.css create mode 100644 public/css/yui/build/assets/skins/sam/calendar.css create mode 100644 public/css/yui/build/assets/skins/sam/carousel.css create mode 100644 public/css/yui/build/assets/skins/sam/colorpicker.css create mode 100644 public/css/yui/build/assets/skins/sam/container.css create mode 100644 public/css/yui/build/assets/skins/sam/datatable.css create mode 100644 public/css/yui/build/assets/skins/sam/desc.gif create mode 100644 public/css/yui/build/assets/skins/sam/dt-arrow-dn.png create mode 100644 public/css/yui/build/assets/skins/sam/dt-arrow-up.png create mode 100644 public/css/yui/build/assets/skins/sam/editor-knob.gif create mode 100644 public/css/yui/build/assets/skins/sam/editor-sprite-active.gif create mode 100644 public/css/yui/build/assets/skins/sam/editor-sprite.gif create mode 100644 public/css/yui/build/assets/skins/sam/editor.css create mode 100644 public/css/yui/build/assets/skins/sam/header_background.png create mode 100644 public/css/yui/build/assets/skins/sam/hue_bg.png create mode 100644 public/css/yui/build/assets/skins/sam/imagecropper.css create mode 100644 public/css/yui/build/assets/skins/sam/layout.css create mode 100644 public/css/yui/build/assets/skins/sam/layout_sprite.png create mode 100644 public/css/yui/build/assets/skins/sam/loading.gif create mode 100644 public/css/yui/build/assets/skins/sam/logger.css create mode 100644 public/css/yui/build/assets/skins/sam/menu-button-arrow-disabled.png create mode 100644 public/css/yui/build/assets/skins/sam/menu-button-arrow.png create mode 100644 public/css/yui/build/assets/skins/sam/menu.css create mode 100644 public/css/yui/build/assets/skins/sam/menubaritem_submenuindicator.png create mode 100644 public/css/yui/build/assets/skins/sam/menubaritem_submenuindicator_disabled.png create mode 100644 public/css/yui/build/assets/skins/sam/menuitem_checkbox.png create mode 100644 public/css/yui/build/assets/skins/sam/menuitem_checkbox_disabled.png create mode 100644 public/css/yui/build/assets/skins/sam/menuitem_submenuindicator.png create mode 100644 public/css/yui/build/assets/skins/sam/menuitem_submenuindicator_disabled.png create mode 100644 public/css/yui/build/assets/skins/sam/paginator.css create mode 100644 public/css/yui/build/assets/skins/sam/picker_mask.png create mode 100644 public/css/yui/build/assets/skins/sam/profilerviewer.css create mode 100644 public/css/yui/build/assets/skins/sam/resize.css create mode 100644 public/css/yui/build/assets/skins/sam/simpleeditor.css create mode 100644 public/css/yui/build/assets/skins/sam/skin.css create mode 100644 public/css/yui/build/assets/skins/sam/slider.css create mode 100644 public/css/yui/build/assets/skins/sam/split-button-arrow-active.png create mode 100644 public/css/yui/build/assets/skins/sam/split-button-arrow-disabled.png create mode 100644 public/css/yui/build/assets/skins/sam/split-button-arrow-focus.png create mode 100644 public/css/yui/build/assets/skins/sam/split-button-arrow-hover.png create mode 100644 public/css/yui/build/assets/skins/sam/split-button-arrow.png create mode 100644 public/css/yui/build/assets/skins/sam/sprite.png create mode 100644 public/css/yui/build/assets/skins/sam/sprite.psd create mode 100644 public/css/yui/build/assets/skins/sam/tabview.css create mode 100644 public/css/yui/build/assets/skins/sam/treeview-loading.gif create mode 100644 public/css/yui/build/assets/skins/sam/treeview-sprite.gif create mode 100644 public/css/yui/build/assets/skins/sam/treeview.css create mode 100644 public/css/yui/build/assets/skins/sam/wait.gif create mode 100644 public/css/yui/build/assets/skins/sam/yuitest.css create mode 100644 public/css/yui/build/autocomplete/assets/autocomplete-core.css create mode 100644 public/css/yui/build/autocomplete/assets/skins/sam/autocomplete-skin.css create mode 100644 public/css/yui/build/autocomplete/assets/skins/sam/autocomplete.css create mode 100644 public/css/yui/build/autocomplete/autocomplete-debug.js create mode 100644 public/css/yui/build/autocomplete/autocomplete-min.js create mode 100644 public/css/yui/build/autocomplete/autocomplete.js create mode 100644 public/css/yui/build/base/base-min.css create mode 100644 public/css/yui/build/base/base.css create mode 100644 public/css/yui/build/button/assets/button-core.css create mode 100644 public/css/yui/build/button/assets/skins/sam/button-skin.css create mode 100644 public/css/yui/build/button/assets/skins/sam/button.css create mode 100644 public/css/yui/build/button/assets/skins/sam/menu-button-arrow-disabled.png create mode 100644 public/css/yui/build/button/assets/skins/sam/menu-button-arrow.png create mode 100644 public/css/yui/build/button/assets/skins/sam/split-button-arrow-active.png create mode 100644 public/css/yui/build/button/assets/skins/sam/split-button-arrow-disabled.png create mode 100644 public/css/yui/build/button/assets/skins/sam/split-button-arrow-focus.png create mode 100644 public/css/yui/build/button/assets/skins/sam/split-button-arrow-hover.png create mode 100644 public/css/yui/build/button/assets/skins/sam/split-button-arrow.png create mode 100644 public/css/yui/build/button/button-debug.js create mode 100644 public/css/yui/build/button/button-min.js create mode 100644 public/css/yui/build/button/button.js create mode 100644 public/css/yui/build/calendar/assets/calendar-core.css create mode 100644 public/css/yui/build/calendar/assets/calendar.css create mode 100644 public/css/yui/build/calendar/assets/calgrad.png create mode 100644 public/css/yui/build/calendar/assets/callt.gif create mode 100644 public/css/yui/build/calendar/assets/calrt.gif create mode 100644 public/css/yui/build/calendar/assets/calx.gif create mode 100644 public/css/yui/build/calendar/assets/skins/sam/calendar-skin.css create mode 100644 public/css/yui/build/calendar/assets/skins/sam/calendar.css create mode 100644 public/css/yui/build/calendar/calendar-debug.js create mode 100644 public/css/yui/build/calendar/calendar-min.js create mode 100644 public/css/yui/build/calendar/calendar.js create mode 100644 public/css/yui/build/carousel/assets/ajax-loader.gif create mode 100644 public/css/yui/build/carousel/assets/carousel-core.css create mode 100644 public/css/yui/build/carousel/assets/skins/sam/ajax-loader.gif create mode 100644 public/css/yui/build/carousel/assets/skins/sam/carousel-skin.css create mode 100644 public/css/yui/build/carousel/assets/skins/sam/carousel.css create mode 100644 public/css/yui/build/carousel/carousel-debug.js create mode 100644 public/css/yui/build/carousel/carousel-min.js create mode 100644 public/css/yui/build/carousel/carousel.js create mode 100644 public/css/yui/build/charts/assets/charts.swf create mode 100644 public/css/yui/build/charts/charts-debug.js create mode 100644 public/css/yui/build/charts/charts-min.js create mode 100644 public/css/yui/build/charts/charts.js create mode 100644 public/css/yui/build/colorpicker/assets/colorpicker-core.css create mode 100644 public/css/yui/build/colorpicker/assets/hue_thumb.png create mode 100644 public/css/yui/build/colorpicker/assets/picker_mask.png create mode 100644 public/css/yui/build/colorpicker/assets/picker_thumb.png create mode 100644 public/css/yui/build/colorpicker/assets/skins/sam/colorpicker-skin.css create mode 100644 public/css/yui/build/colorpicker/assets/skins/sam/colorpicker.css create mode 100644 public/css/yui/build/colorpicker/assets/skins/sam/hue_bg.png create mode 100644 public/css/yui/build/colorpicker/assets/skins/sam/picker_mask.png create mode 100644 public/css/yui/build/colorpicker/colorpicker-debug.js create mode 100644 public/css/yui/build/colorpicker/colorpicker-min.js create mode 100644 public/css/yui/build/colorpicker/colorpicker.js create mode 100644 public/css/yui/build/connection/connection-debug.js create mode 100644 public/css/yui/build/connection/connection-min.js create mode 100644 public/css/yui/build/connection/connection.js create mode 100644 public/css/yui/build/container/assets/alrt16_1.gif create mode 100644 public/css/yui/build/container/assets/blck16_1.gif create mode 100644 public/css/yui/build/container/assets/close12_1.gif create mode 100644 public/css/yui/build/container/assets/container-core.css create mode 100644 public/css/yui/build/container/assets/container.css create mode 100644 public/css/yui/build/container/assets/hlp16_1.gif create mode 100644 public/css/yui/build/container/assets/info16_1.gif create mode 100644 public/css/yui/build/container/assets/skins/sam/container-skin.css create mode 100644 public/css/yui/build/container/assets/skins/sam/container.css create mode 100644 public/css/yui/build/container/assets/tip16_1.gif create mode 100644 public/css/yui/build/container/assets/warn16_1.gif create mode 100644 public/css/yui/build/container/container-debug.js create mode 100644 public/css/yui/build/container/container-min.js create mode 100644 public/css/yui/build/container/container.js create mode 100644 public/css/yui/build/container/container_core-debug.js create mode 100644 public/css/yui/build/container/container_core-min.js create mode 100644 public/css/yui/build/container/container_core.js create mode 100644 public/css/yui/build/cookie/cookie-debug.js create mode 100644 public/css/yui/build/cookie/cookie-min.js create mode 100644 public/css/yui/build/cookie/cookie.js create mode 100644 public/css/yui/build/datasource/datasource-debug.js create mode 100644 public/css/yui/build/datasource/datasource-min.js create mode 100644 public/css/yui/build/datasource/datasource.js create mode 100644 public/css/yui/build/datatable/assets/datatable-core.css create mode 100644 public/css/yui/build/datatable/assets/datatable.css create mode 100644 public/css/yui/build/datatable/assets/skins/sam/datatable-skin.css create mode 100644 public/css/yui/build/datatable/assets/skins/sam/datatable.css create mode 100644 public/css/yui/build/datatable/assets/skins/sam/dt-arrow-dn.png create mode 100644 public/css/yui/build/datatable/assets/skins/sam/dt-arrow-up.png create mode 100644 public/css/yui/build/datatable/datatable-debug.js create mode 100644 public/css/yui/build/datatable/datatable-min.js create mode 100644 public/css/yui/build/datatable/datatable.js create mode 100644 public/css/yui/build/dom/dom-debug.js create mode 100644 public/css/yui/build/dom/dom-min.js create mode 100644 public/css/yui/build/dom/dom.js create mode 100644 public/css/yui/build/dragdrop/dragdrop-debug.js create mode 100644 public/css/yui/build/dragdrop/dragdrop-min.js create mode 100644 public/css/yui/build/dragdrop/dragdrop.js create mode 100644 public/css/yui/build/editor/assets/editor-core.css create mode 100644 public/css/yui/build/editor/assets/simpleeditor-core.css create mode 100644 public/css/yui/build/editor/assets/skins/sam/blankimage.png create mode 100644 public/css/yui/build/editor/assets/skins/sam/editor-knob.gif create mode 100644 public/css/yui/build/editor/assets/skins/sam/editor-skin.css create mode 100644 public/css/yui/build/editor/assets/skins/sam/editor-sprite-active.gif create mode 100644 public/css/yui/build/editor/assets/skins/sam/editor-sprite.gif create mode 100644 public/css/yui/build/editor/assets/skins/sam/editor.css create mode 100644 public/css/yui/build/editor/assets/skins/sam/simpleeditor-skin.css create mode 100644 public/css/yui/build/editor/assets/skins/sam/simpleeditor.css create mode 100644 public/css/yui/build/editor/editor-debug.js create mode 100644 public/css/yui/build/editor/editor-min.js create mode 100644 public/css/yui/build/editor/editor.js create mode 100644 public/css/yui/build/editor/simpleeditor-debug.js create mode 100644 public/css/yui/build/editor/simpleeditor-min.js create mode 100644 public/css/yui/build/editor/simpleeditor.js create mode 100644 public/css/yui/build/element/element-debug.js create mode 100644 public/css/yui/build/element/element-min.js create mode 100644 public/css/yui/build/element/element.js create mode 100644 public/css/yui/build/event/event-debug.js create mode 100644 public/css/yui/build/event/event-min.js create mode 100644 public/css/yui/build/event/event.js create mode 100644 public/css/yui/build/fonts/fonts-min.css create mode 100644 public/css/yui/build/fonts/fonts.css create mode 100644 public/css/yui/build/get/get-debug.js create mode 100644 public/css/yui/build/get/get-min.js create mode 100644 public/css/yui/build/get/get.js create mode 100644 public/css/yui/build/grids/grids-min.css create mode 100644 public/css/yui/build/grids/grids.css create mode 100644 public/css/yui/build/history/assets/blank.html create mode 100644 public/css/yui/build/history/history-debug.js create mode 100644 public/css/yui/build/history/history-min.js create mode 100644 public/css/yui/build/history/history.js create mode 100644 public/css/yui/build/imagecropper/assets/imagecropper-core.css create mode 100644 public/css/yui/build/imagecropper/assets/skins/sam/imagecropper-skin.css create mode 100644 public/css/yui/build/imagecropper/assets/skins/sam/imagecropper.css create mode 100644 public/css/yui/build/imagecropper/imagecropper-debug.js create mode 100644 public/css/yui/build/imagecropper/imagecropper-min.js create mode 100644 public/css/yui/build/imagecropper/imagecropper.js create mode 100644 public/css/yui/build/imageloader/imageloader-debug.js create mode 100644 public/css/yui/build/imageloader/imageloader-min.js create mode 100644 public/css/yui/build/imageloader/imageloader.js create mode 100644 public/css/yui/build/json/json-debug.js create mode 100644 public/css/yui/build/json/json-min.js create mode 100644 public/css/yui/build/json/json.js create mode 100644 public/css/yui/build/layout/assets/layout-core.css create mode 100644 public/css/yui/build/layout/assets/skins/sam/layout-skin.css create mode 100644 public/css/yui/build/layout/assets/skins/sam/layout.css create mode 100644 public/css/yui/build/layout/assets/skins/sam/layout_sprite.png create mode 100644 public/css/yui/build/layout/layout-debug.js create mode 100644 public/css/yui/build/layout/layout-min.js create mode 100644 public/css/yui/build/layout/layout.js create mode 100644 public/css/yui/build/logger/assets/logger-core.css create mode 100644 public/css/yui/build/logger/assets/logger.css create mode 100644 public/css/yui/build/logger/assets/skins/sam/logger-skin.css create mode 100644 public/css/yui/build/logger/assets/skins/sam/logger.css create mode 100644 public/css/yui/build/logger/logger-debug.js create mode 100644 public/css/yui/build/logger/logger-min.js create mode 100644 public/css/yui/build/logger/logger.js create mode 100644 public/css/yui/build/menu/assets/menu-core.css create mode 100644 public/css/yui/build/menu/assets/menu.css create mode 100644 public/css/yui/build/menu/assets/menu_down_arrow.png create mode 100644 public/css/yui/build/menu/assets/menu_down_arrow_disabled.png create mode 100644 public/css/yui/build/menu/assets/menu_up_arrow.png create mode 100644 public/css/yui/build/menu/assets/menu_up_arrow_disabled.png create mode 100644 public/css/yui/build/menu/assets/menubaritem_submenuindicator.png create mode 100644 public/css/yui/build/menu/assets/menubaritem_submenuindicator_disabled.png create mode 100644 public/css/yui/build/menu/assets/menubaritem_submenuindicator_selected.png create mode 100644 public/css/yui/build/menu/assets/menuitem_checkbox.png create mode 100644 public/css/yui/build/menu/assets/menuitem_checkbox_disabled.png create mode 100644 public/css/yui/build/menu/assets/menuitem_checkbox_selected.png create mode 100644 public/css/yui/build/menu/assets/menuitem_submenuindicator.png create mode 100644 public/css/yui/build/menu/assets/menuitem_submenuindicator_disabled.png create mode 100644 public/css/yui/build/menu/assets/menuitem_submenuindicator_selected.png create mode 100644 public/css/yui/build/menu/assets/skins/sam/menu-skin.css create mode 100644 public/css/yui/build/menu/assets/skins/sam/menu.css create mode 100644 public/css/yui/build/menu/assets/skins/sam/menubaritem_submenuindicator.png create mode 100644 public/css/yui/build/menu/assets/skins/sam/menubaritem_submenuindicator_disabled.png create mode 100644 public/css/yui/build/menu/assets/skins/sam/menuitem_checkbox.png create mode 100644 public/css/yui/build/menu/assets/skins/sam/menuitem_checkbox_disabled.png create mode 100644 public/css/yui/build/menu/assets/skins/sam/menuitem_submenuindicator.png create mode 100644 public/css/yui/build/menu/assets/skins/sam/menuitem_submenuindicator_disabled.png create mode 100644 public/css/yui/build/menu/menu-debug.js create mode 100644 public/css/yui/build/menu/menu-min.js create mode 100644 public/css/yui/build/menu/menu.js create mode 100644 public/css/yui/build/paginator/assets/paginator-core.css create mode 100644 public/css/yui/build/paginator/assets/skins/sam/paginator-skin.css create mode 100644 public/css/yui/build/paginator/assets/skins/sam/paginator.css create mode 100644 public/css/yui/build/paginator/paginator-debug.js create mode 100644 public/css/yui/build/paginator/paginator-min.js create mode 100644 public/css/yui/build/paginator/paginator.js create mode 100644 public/css/yui/build/profiler/profiler-debug.js create mode 100644 public/css/yui/build/profiler/profiler-min.js create mode 100644 public/css/yui/build/profiler/profiler.js create mode 100644 public/css/yui/build/profilerviewer/assets/profilerviewer-core.css create mode 100644 public/css/yui/build/profilerviewer/assets/skins/sam/asc.gif create mode 100644 public/css/yui/build/profilerviewer/assets/skins/sam/desc.gif create mode 100644 public/css/yui/build/profilerviewer/assets/skins/sam/header_background.png create mode 100644 public/css/yui/build/profilerviewer/assets/skins/sam/profilerviewer-skin.css create mode 100644 public/css/yui/build/profilerviewer/assets/skins/sam/profilerviewer.css create mode 100644 public/css/yui/build/profilerviewer/assets/skins/sam/wait.gif create mode 100644 public/css/yui/build/profilerviewer/profilerviewer-debug.js create mode 100644 public/css/yui/build/profilerviewer/profilerviewer-min.js create mode 100644 public/css/yui/build/profilerviewer/profilerviewer.js create mode 100644 public/css/yui/build/reset-fonts-grids/reset-fonts-grids.css create mode 100644 public/css/yui/build/reset-fonts/reset-fonts.css create mode 100644 public/css/yui/build/reset/reset-min.css create mode 100644 public/css/yui/build/reset/reset.css create mode 100644 public/css/yui/build/resize/assets/resize-core.css create mode 100644 public/css/yui/build/resize/assets/skins/sam/layout_sprite.png create mode 100644 public/css/yui/build/resize/assets/skins/sam/resize-skin.css create mode 100644 public/css/yui/build/resize/assets/skins/sam/resize.css create mode 100644 public/css/yui/build/resize/resize-debug.js create mode 100644 public/css/yui/build/resize/resize-min.js create mode 100644 public/css/yui/build/resize/resize.js create mode 100644 public/css/yui/build/selector/selector-debug.js create mode 100644 public/css/yui/build/selector/selector-min.js create mode 100644 public/css/yui/build/selector/selector.js create mode 100644 public/css/yui/build/slider/assets/bg-fader.gif create mode 100644 public/css/yui/build/slider/assets/bg-h.gif create mode 100644 public/css/yui/build/slider/assets/bg-v-e.gif create mode 100644 public/css/yui/build/slider/assets/bg-v.gif create mode 100644 public/css/yui/build/slider/assets/left-thumb.png create mode 100644 public/css/yui/build/slider/assets/right-thumb.png create mode 100644 public/css/yui/build/slider/assets/skins/sam/bg-h.gif create mode 100644 public/css/yui/build/slider/assets/skins/sam/bg-v.gif create mode 100644 public/css/yui/build/slider/assets/skins/sam/slider-skin.css create mode 100644 public/css/yui/build/slider/assets/skins/sam/slider.css create mode 100644 public/css/yui/build/slider/assets/slider-core.css create mode 100644 public/css/yui/build/slider/assets/slider-skin.css create mode 100644 public/css/yui/build/slider/assets/thumb-bar.gif create mode 100644 public/css/yui/build/slider/assets/thumb-e.gif create mode 100644 public/css/yui/build/slider/assets/thumb-fader.gif create mode 100644 public/css/yui/build/slider/assets/thumb-n.gif create mode 100644 public/css/yui/build/slider/assets/thumb-s.gif create mode 100644 public/css/yui/build/slider/assets/thumb-w.gif create mode 100644 public/css/yui/build/slider/slider-debug.js create mode 100644 public/css/yui/build/slider/slider-min.js create mode 100644 public/css/yui/build/slider/slider.js create mode 100644 public/css/yui/build/stylesheet/stylesheet-debug.js create mode 100644 public/css/yui/build/stylesheet/stylesheet-min.js create mode 100644 public/css/yui/build/stylesheet/stylesheet.js create mode 100644 public/css/yui/build/tabview/assets/border_tabs.css create mode 100644 public/css/yui/build/tabview/assets/loading.gif create mode 100644 public/css/yui/build/tabview/assets/skin-sam.css create mode 100644 public/css/yui/build/tabview/assets/skins/sam/tabview-skin.css create mode 100644 public/css/yui/build/tabview/assets/skins/sam/tabview.css create mode 100644 public/css/yui/build/tabview/assets/tabview-core.css create mode 100644 public/css/yui/build/tabview/assets/tabview.css create mode 100644 public/css/yui/build/tabview/tabview-debug.js create mode 100644 public/css/yui/build/tabview/tabview-min.js create mode 100644 public/css/yui/build/tabview/tabview.js create mode 100644 public/css/yui/build/treeview/assets/check0.gif create mode 100644 public/css/yui/build/treeview/assets/check1.gif create mode 100644 public/css/yui/build/treeview/assets/check2.gif create mode 100644 public/css/yui/build/treeview/assets/loading.gif create mode 100644 public/css/yui/build/treeview/assets/skins/sam/loading.gif create mode 100644 public/css/yui/build/treeview/assets/skins/sam/treeview-loading.gif create mode 100644 public/css/yui/build/treeview/assets/skins/sam/treeview-skin.css create mode 100644 public/css/yui/build/treeview/assets/skins/sam/treeview-sprite.gif create mode 100644 public/css/yui/build/treeview/assets/skins/sam/treeview.css create mode 100644 public/css/yui/build/treeview/assets/treeview-core.css create mode 100644 public/css/yui/build/treeview/assets/treeview-loading.gif create mode 100644 public/css/yui/build/treeview/assets/treeview-skin.css create mode 100644 public/css/yui/build/treeview/assets/treeview-sprite.gif create mode 100644 public/css/yui/build/treeview/treeview-debug.js create mode 100644 public/css/yui/build/treeview/treeview-min.js create mode 100644 public/css/yui/build/treeview/treeview.js create mode 100644 public/css/yui/build/uploader/assets/uploader.swf create mode 100644 public/css/yui/build/uploader/uploader-debug.js create mode 100644 public/css/yui/build/uploader/uploader-experimental-debug.js create mode 100644 public/css/yui/build/uploader/uploader-min.js create mode 100644 public/css/yui/build/uploader/uploader.js create mode 100644 public/css/yui/build/utilities/utilities.js create mode 100644 public/css/yui/build/yahoo-dom-event/yahoo-dom-event.js create mode 100644 public/css/yui/build/yahoo/yahoo-debug.js create mode 100644 public/css/yui/build/yahoo/yahoo-min.js create mode 100644 public/css/yui/build/yahoo/yahoo.js create mode 100644 public/css/yui/build/yuiloader-dom-event/yuiloader-dom-event.js create mode 100644 public/css/yui/build/yuiloader/yuiloader-debug.js create mode 100644 public/css/yui/build/yuiloader/yuiloader-min.js create mode 100644 public/css/yui/build/yuiloader/yuiloader.js create mode 100644 public/css/yui/build/yuitest/assets/skins/sam/yuitest-skin.css create mode 100644 public/css/yui/build/yuitest/assets/skins/sam/yuitest.css create mode 100644 public/css/yui/build/yuitest/assets/testlogger.css create mode 100644 public/css/yui/build/yuitest/assets/yuitest-core.css create mode 100644 public/css/yui/build/yuitest/yuitest-debug.js create mode 100644 public/css/yui/build/yuitest/yuitest-min.js create mode 100644 public/css/yui/build/yuitest/yuitest.js create mode 100644 public/css/yui/build/yuitest/yuitest_core-debug.js create mode 100644 public/css/yui/build/yuitest/yuitest_core-min.js create mode 100644 public/css/yui/build/yuitest/yuitest_core.js create mode 100644 public/css/yui/index.html create mode 100644 public/images/22x22/apply.png create mode 100644 public/images/22x22/face-crying.png create mode 100644 public/images/22x22/face-smile-big.png create mode 100644 public/images/22x22/help.png create mode 100644 public/images/22x22/im-user-offline.png create mode 100644 public/images/22x22/im-user.png create mode 100644 public/images/22x22/never.png create mode 100644 public/images/22x22/no-note.png create mode 100644 public/images/22x22/no.png create mode 100644 public/images/22x22/note.png create mode 100644 public/images/22x22/player_stop.png create mode 100644 public/images/22x22/presentation.png create mode 100644 public/images/22x22/video.png create mode 100644 public/images/22x22/waiting.png create mode 100644 public/images/22x22/yes.png create mode 100644 public/images/32x32/check.png create mode 100644 public/images/32x32/cross.png create mode 100644 public/images/Joomla_big.png create mode 100644 public/images/arrow-left-double.png create mode 100644 public/images/arrow-left.png create mode 100644 public/images/arrow-right-double.png create mode 100644 public/images/arrow-right.png create mode 100644 public/images/arrow_down.gif create mode 100644 public/images/arrow_up.gif create mode 100644 public/images/background.jpg create mode 100644 public/images/colorbox/border.png create mode 100644 public/images/colorbox/controls.png create mode 100644 public/images/colorbox/loading.gif create mode 100644 public/images/colorbox/loading_background.png create mode 100644 public/images/icon_no.png create mode 100644 public/images/icon_password.png create mode 100644 public/images/icon_refresh.png create mode 100644 public/images/icon_unknown.png create mode 100644 public/images/icon_yes.png create mode 100644 public/images/image-missing.png create mode 100644 public/images/inconsistent1.gif create mode 100644 public/images/inconsistent2.gif create mode 100644 public/images/inex-green-corner-153x168.gif create mode 100644 public/images/inex-logo-150x73.jpg create mode 100644 public/images/ixpmanager-dot-i.gif create mode 100644 public/images/joomla-admin/acroread.png create mode 100644 public/images/joomla-admin/addedit.png create mode 100644 public/images/joomla-admin/background.jpg create mode 100644 public/images/joomla-admin/backup.png create mode 100644 public/images/joomla-admin/browser.png create mode 100644 public/images/joomla-admin/cabinets.png create mode 100644 public/images/joomla-admin/categories.png create mode 100644 public/images/joomla-admin/change-log.png create mode 100644 public/images/joomla-admin/checkin.png create mode 100644 public/images/joomla-admin/config.png create mode 100644 public/images/joomla-admin/console.png create mode 100644 public/images/joomla-admin/cpanel.png create mode 100644 public/images/joomla-admin/dbrestore.png create mode 100644 public/images/joomla-admin/drive-optical.png create mode 100644 public/images/joomla-admin/drupalicon.png create mode 100644 public/images/joomla-admin/email.png create mode 100644 public/images/joomla-admin/frontpage.png create mode 100644 public/images/joomla-admin/gaim.png create mode 100644 public/images/joomla-admin/generic.png create mode 100644 public/images/joomla-admin/header_bg.png create mode 100644 public/images/joomla-admin/header_text.png create mode 100644 public/images/joomla-admin/help_index.png create mode 100644 public/images/joomla-admin/impressions.png create mode 100644 public/images/joomla-admin/inbox.png create mode 100644 public/images/joomla-admin/insert-link.png create mode 100644 public/images/joomla-admin/install.png create mode 100644 public/images/joomla-admin/interface.png create mode 100644 public/images/joomla-admin/jabber_protocol.png create mode 100644 public/images/joomla-admin/joomla.png create mode 100644 public/images/joomla-admin/kcmdrkonqi.png create mode 100644 public/images/joomla-admin/kdmconfig.png create mode 100644 public/images/joomla-admin/keditbookmarks.png create mode 100644 public/images/joomla-admin/kfm_home.png create mode 100644 public/images/joomla-admin/knetworkmanager.png create mode 100644 public/images/joomla-admin/kontact.png create mode 100644 public/images/joomla-admin/kpf.png create mode 100644 public/images/joomla-admin/krdc.png create mode 100644 public/images/joomla-admin/krfb.png create mode 100644 public/images/joomla-admin/ksysguard.png create mode 100644 public/images/joomla-admin/langmanager.png create mode 100644 public/images/joomla-admin/login.gif create mode 100644 public/images/joomla-admin/massemail.png create mode 100644 public/images/joomla-admin/mediamanager.png create mode 100644 public/images/joomla-admin/menu.png create mode 100644 public/images/joomla-admin/menu/acroread.png create mode 100644 public/images/joomla-admin/menu/add_section.png create mode 100644 public/images/joomla-admin/menu/arrow.png create mode 100644 public/images/joomla-admin/menu/backup.png create mode 100644 public/images/joomla-admin/menu/blank.png create mode 100644 public/images/joomla-admin/menu/cabinets.png create mode 100644 public/images/joomla-admin/menu/categories.png create mode 100644 public/images/joomla-admin/menu/checkin.png create mode 100644 public/images/joomla-admin/menu/checkinbw.png create mode 100644 public/images/joomla-admin/menu/component.png create mode 100644 public/images/joomla-admin/menu/config.png create mode 100644 public/images/joomla-admin/menu/connection.png create mode 100644 public/images/joomla-admin/menu/console.png create mode 100644 public/images/joomla-admin/menu/content.png create mode 100644 public/images/joomla-admin/menu/contents.png create mode 100644 public/images/joomla-admin/menu/controlpanel.png create mode 100644 public/images/joomla-admin/menu/credits.png create mode 100644 public/images/joomla-admin/menu/cust-kit.png create mode 100644 public/images/joomla-admin/menu/db.png create mode 100644 public/images/joomla-admin/menu/document.png create mode 100644 public/images/joomla-admin/menu/drive-optical.png create mode 100644 public/images/joomla-admin/menu/edit.png create mode 100644 public/images/joomla-admin/menu/globe1.png create mode 100644 public/images/joomla-admin/menu/globe2.png create mode 100644 public/images/joomla-admin/menu/globe3.png create mode 100644 public/images/joomla-admin/menu/globe4.png create mode 100644 public/images/joomla-admin/menu/gpg.png create mode 100644 public/images/joomla-admin/menu/help.png create mode 100644 public/images/joomla-admin/menu/home.png create mode 100644 public/images/joomla-admin/menu/icon_film.png create mode 100644 public/images/joomla-admin/menu/icon_reel.png create mode 100644 public/images/joomla-admin/menu/index.html create mode 100644 public/images/joomla-admin/menu/insert-link.png create mode 100644 public/images/joomla-admin/menu/install.png create mode 100644 public/images/joomla-admin/menu/interface.png create mode 100644 public/images/joomla-admin/menu/joomla_16x16.png create mode 100644 public/images/joomla-admin/menu/kontact.png create mode 100644 public/images/joomla-admin/menu/language.png create mode 100644 public/images/joomla-admin/menu/license.png create mode 100644 public/images/joomla-admin/menu/mail.png create mode 100644 public/images/joomla-admin/menu/mainmenu.png create mode 100644 public/images/joomla-admin/menu/mass_email.png create mode 100644 public/images/joomla-admin/menu/media.png create mode 100644 public/images/joomla-admin/menu/meetings.png create mode 100644 public/images/joomla-admin/menu/menus.png create mode 100644 public/images/joomla-admin/menu/messaging.png create mode 100644 public/images/joomla-admin/menu/messaging_config.png create mode 100644 public/images/joomla-admin/menu/messaging_inbox.png create mode 100644 public/images/joomla-admin/menu/module.png create mode 100644 public/images/joomla-admin/menu/network.png create mode 100644 public/images/joomla-admin/menu/php.png create mode 100644 public/images/joomla-admin/menu/preview.png create mode 100644 public/images/joomla-admin/menu/query.png create mode 100644 public/images/joomla-admin/menu/rack.png create mode 100644 public/images/joomla-admin/menu/remote.png create mode 100644 public/images/joomla-admin/menu/restore.png create mode 100644 public/images/joomla-admin/menu/search_text.png create mode 100644 public/images/joomla-admin/menu/sections.png create mode 100644 public/images/joomla-admin/menu/spacer.png create mode 100644 public/images/joomla-admin/menu/statistics.png create mode 100644 public/images/joomla-admin/menu/switch.png create mode 100644 public/images/joomla-admin/menu/sysinfo.png create mode 100644 public/images/joomla-admin/menu/system-users.png create mode 100644 public/images/joomla-admin/menu/template.png create mode 100644 public/images/joomla-admin/menu/tooltip.png create mode 100644 public/images/joomla-admin/menu/trash.png create mode 100644 public/images/joomla-admin/menu/tux.png create mode 100644 public/images/joomla-admin/menu/user.png create mode 100644 public/images/joomla-admin/menu/users.png create mode 100644 public/images/joomla-admin/menu/users_add.png create mode 100644 public/images/joomla-admin/menu/vendors.png create mode 100644 public/images/joomla-admin/menu/vlan.png create mode 100644 public/images/joomla-admin/menu/warning.png create mode 100644 public/images/joomla-admin/message_config.png create mode 100644 public/images/joomla-admin/module.png create mode 100644 public/images/joomla-admin/multimedia.png create mode 100644 public/images/joomla-admin/package.png create mode 100644 public/images/joomla-admin/package_multimedia.png create mode 100644 public/images/joomla-admin/package_network.png create mode 100644 public/images/joomla-admin/package_settings.png create mode 100644 public/images/joomla-admin/package_system.png create mode 100644 public/images/joomla-admin/package_utilities.png create mode 100644 public/images/joomla-admin/package_wordprocessing.png create mode 100644 public/images/joomla-admin/personal.png create mode 100644 public/images/joomla-admin/query.png create mode 100644 public/images/joomla-admin/remote.png create mode 100644 public/images/joomla-admin/samba.png create mode 100644 public/images/joomla-admin/searchtext.png create mode 100644 public/images/joomla-admin/sections.png create mode 100644 public/images/joomla-admin/security.png create mode 100644 public/images/joomla-admin/stop.png create mode 100644 public/images/joomla-admin/switch.png create mode 100644 public/images/joomla-admin/system-users.png create mode 100644 public/images/joomla-admin/systeminfo.png create mode 100644 public/images/joomla-admin/templatemanager.png create mode 100644 public/images/joomla-admin/trash.png create mode 100644 public/images/joomla-admin/tux.png create mode 100644 public/images/joomla-admin/user.png create mode 100644 public/images/joomla-admin/vendor.png create mode 100644 public/images/joomla-admin/vlan.png create mode 100644 public/images/joomla-admin/xfmail.png create mode 100644 public/images/no.gif create mode 100644 public/images/route-server-peering-fullmesh.png create mode 100644 public/images/route-server-peering-rsonly.png create mode 100644 public/images/throbber-small.gif create mode 100644 public/images/yes.gif create mode 100644 public/index.php create mode 100644 public/js/JSCookMenu_mini.js create mode 100644 public/js/jquery-ui.js create mode 100644 public/js/jquery/jquery-1.3.2.min.js create mode 100644 public/js/jquery/jquery.colorbox-min.js create mode 100644 public/js/jwysiwyg/jquery.wysiwyg.css create mode 100644 public/js/jwysiwyg/jquery.wysiwyg.gif create mode 100644 public/js/jwysiwyg/jquery.wysiwyg.jpg create mode 100644 public/js/jwysiwyg/jquery.wysiwyg.js create mode 100644 public/js/oss_tooltip.js create mode 100644 public/js/php.js create mode 100644 public/js/theme.js create mode 100644 public/js/virtual-interface-list.js diff --git a/CHANGELOG b/CHANGELOG new file mode 100644 index 000000000..59874fbb2 --- /dev/null +++ b/CHANGELOG @@ -0,0 +1,4 @@ + +1.0 2011-05-26 + - initial release + diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..d159169d1 --- /dev/null +++ b/LICENSE @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/application/Bootstrap.php b/application/Bootstrap.php new file mode 100644 index 000000000..9f4c9a9f9 --- /dev/null +++ b/application/Bootstrap.php @@ -0,0 +1,43 @@ +registerNamespace( 'INEX' ); + } + +} + diff --git a/application/configs/application.ini.dist b/application/configs/application.ini.dist new file mode 100644 index 000000000..36422f86c --- /dev/null +++ b/application/configs/application.ini.dist @@ -0,0 +1,248 @@ +; +; Copyright (C) 2009-2011 Internet Neutral Exchange Association Limited. +; All Rights Reserved. +; +; This file is part of IXP Manager. +; +; IXP Manager is free software: you can redistribute it and/or modify it +; under the terms of the GNU General Public License as published by the Free +; Software Foundation, version v2.0 of the License. +; +; IXP Manager is distributed in the hope that it will be useful, but WITHOUT +; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +; more details. +; +; You should have received a copy of the GNU General Public License v2.0 +; along with IXP Manager. If not, see: +; +; http://www.gnu.org/licenses/gpl-2.0.html + +[production] + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Bootstrap Options +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +phpSettings.display_startup_errors = 0 +phpSettings.display_errors = 0 + +includePaths.library = APPLICATION_PATH "/../library" + +; SETME! +includePaths.doctrine = /path/to/Doctrine/lib + +pluginPaths.INEX_Resource = APPLICATION_PATH "/../library/INEX/Resource" + +bootstrap.path = APPLICATION_PATH "/Bootstrap.php" +bootstrap.class = "Bootstrap" + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Resources +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers" +resources.frontController.params.noViewRenderer = 1 + +resources.auth = 1 + +resources.doctrine.connection_string = "mysql://user:pass@host/database" +resources.doctrine.data_fixtures_path = APPLICATION_PATH "/../doctrine/data/fixtures" +resources.doctrine.models_path = APPLICATION_PATH "/models" +resources.doctrine.migrations_path = APPLICATION_PATH "/../doctrine/migrations" +resources.doctrine.sql_path = APPLICATION_PATH "/../doctrine/data/sql" +resources.doctrine.yaml_schema_path = APPLICATION_PATH "/../doctrine/schema" +resources.doctrine.generate_models_options.generateTableClasses = true + +resources.logger.enabled = 1 +resources.logger.writers.email.from = ops-auto@example.com +resources.logger.writers.email.to = ops-auto@example.com +resources.logger.writers.email.prefix = IXP_ERROR +resources.logger.writers.email.level = 3 +resources.logger.writers.stream.level = 7 +resources.logger.writers.stream.path = APPLICATION_PATH "/../var/log" +resources.logger.writers.stream.owner = www +resources.logger.writers.stream.group = www + +resources.namespace.checkip = 1 +resources.namespace.timeout = 3600 + +resources.session.save_path = APPLICATION_PATH "/../var/session" +resources.session.use_only_cookies = true +resources.session.remember_me_seconds = 3600 +resources.session.name = INEX_IXP + +resources.mailer.smtphost = mail.example.com +; resources.mailer.username = +; resources.mailer.password = +; resources.mailer.auth = login | plain | cram-md5 + +; We use Smarty as the templating engine for IXP +resources.view.templates = APPLICATION_PATH "/views" +resources.view.compiled = APPLICATION_PATH "/../var/templates_c" +resources.view.cache = APPLICATION_PATH "/../var/cache" +resources.view.config = APPLICATION_PATH "/configs/smarty" +resources.view.plugins[] = APPLICATION_PATH "/../library/inex-smarty/functions" +resources.view.plugins[] = "plugins" +resources.view.debugging = 0 + + +; enable zfdebug plugin +resources.zfdebug.enabled = false +resources.zfdebug.plugins[] = "Variables" +resources.zfdebug.plugins.File.base_path = APPLICATION_PATH "/../" +resources.zfdebug.plugins[] = "Database" +resources.zfdebug.plugins[] = "Memory" +resources.zfdebug.plugins[] = "Time" +resources.zfdebug.plugins[] = "Registry" +resources.zfdebug.plugins[] = "Exception" +resources.zfdebug.users[] = "user1" +resources.zfdebug.users[] = "user2" + + +identity.orgname = "An IXP" +identity.name = "Another IXP Operations" +identity.email = "operations@example.com" +identity.testemail = "x@example.com" +identity.autobot.name = "IXP Ops Autobot" +identity.autobot.email = "ops-auto@example.com" +identity.ixp.fullname = "Another IXP's Manager" +identity.ixp.url = "https://www.example.com/ixp/" +identity.ixp.logo = APPLICATION_PATH "/../public/images/mylogo.jpg + + +sms.clickatell.username = "user" +sms.clickatell.password = "pass" +sms.clickatell.api_id = "appid" +sms.clickatell.sender_id = "IXP_NAME" + + +; MRTG Parameters +mrtg.path = http://www.example.com/mrtg/members + +mrtg.traffic_graphs[] = "aggregate::Aggregate Graphs" +mrtg.traffic_graphs[] = "network1::IXP Infrastructure #1" +mrtg.traffic_graphs[] = "network2::IXP Infrastructure #2" + +mrtg.trunk_graphs[] = "core-pop1-pop2-lan1::PoP 1 to PoP 2 (LAN1)" + +; LANs for public and 'my' peering matric. +peering_matrix.public.0.name = "Public Peering LAN #1" +peering_matrix.public.0.number = 10 +peering_matrix.public.0.table = "/path/to/peering-matrix/public-vlan10-ipv4.html" +peering_matrix.public.1.name = "Public Peering LAN #2" +peering_matrix.public.1.number = 12 +peering_matrix.public.1.table = "/path/to/peering-matrix/public-vlan12-ipv4.html" + +; details for the primary / only / main peering LAN +primary_peering_lan.vlan_tag = 10 + +; Change Log Facility +change_log.enabled = 1 + + +;; IXP Tool / CLI Settings + +cli.traffic_differentials.stddev_calc_length = 60 +cli.traffic_differentials.from_email = "ops@example.com" +cli.traffic_differentials.from_name = "Another IXP Operations" +cli.traffic_differentials.subject = "Another IXP Traffic Differentials" +cli.traffic_differentials.recipients[] = "user1@example.com" +cli.traffic_differentials.recipients[] = "user2@example.com" + +cli.port_utilisation.threshold = 0.8 +cli.port_utilisation.from_email = "ops@example.com" +cli.port_utilisation.from_name = "Another IXP Operations" +cli.port_utilisation.subject = "IXP Port Utilisation Report" +cli.port_utilisation.recipients[] = "user1@example.com" +cli.port_utilisation.recipients[] = "user2@example.com" + +;; Meeting RSVP Handler +meeting.rsvp_to_email = "rsvp@example.com" +meeting.rsvp_to_name = "Meeting Administrator" + + + +;; SEC (Simple Event Correlator) Handler Settings + +sec.pagers[] = "353861234567" +sec.pagers[] = "353871234567" + + +; alert_customers must be true for cc_opsauto to have an effect +sec.bgp_auth.alert_customers = true +sec.bgp_auth.cc_opsauto = false +sec.bgp_auth.alert_operations = false + +; alert_customers must be true for cc_opsauto to have an effect +sec.port_updown.alert_customers = true +sec.port_updown.cc_opsauto = false +sec.port_updown.alert_operations = false + +; alert_customers must be true for cc_opsauto to have an effect +sec.security_violation.alert_customers = true +sec.security_violation.cc_opsauto = false +sec.security_violation.alert_operations = false + + + +menu.staff_links.cacti.name = "Cacti" +menu.staff_links.cacti.link = "https://www.example.com/cacti/" + +menu.staff_links.ipplan.name = "IP Plan" +menu.staff_links.ipplan.link = "https://www.example.com/ipplan/" + + +[staging : production] + + +[testing : production] + +phpSettings.display_startup_errors = 1 +phpSettings.display_errors = 1 + +resources.logger.writers.firebug.enabled = 1 +resources.logger.writers.firebug.level = 7 + + + + + + + +[development : production] + +phpSettings.display_startup_errors = 1 +phpSettings.display_errors = 1 + +includePaths.doctrine = APPLICATION_PATH "/../library/Doctrine" + + +resources.doctrine.connection_string = "mysql://user:pass@host/database" + + +resources.logger.writers.firebug.enabled = 1 +resources.logger.writers.firebug.level = 7 +resources.logger.writers.stream.owner = www-data +resources.logger.writers.stream.group = www-data + +resources.mailer.smtphost = "mail.example.com" + +resources.view.debugging = 0 + +resources.namespace.timeout = 3000 +resources.session.remember_me_seconds = 3000 + +identity.ixp.url = "http://127.0.0.1/ixp/" + +[clidev : development] + +resources.zfdebug.enabled = false + +[productioncli : production] + +resources.zfdebug.enabled = false + +phpSettings.display_startup_errors = 1 +phpSettings.display_errors = 1 + diff --git a/application/controllers/AdminController.php b/application/controllers/AdminController.php new file mode 100644 index 000000000..aedd9ddf7 --- /dev/null +++ b/application/controllers/AdminController.php @@ -0,0 +1,92 @@ +identity ) + $this->_redirect( 'auth/login' ); + else if( $this->user->privs != User::AUTH_SUPERUSER ) + { + $this->view->message = new INEX_Message( + "You must be an administrator to access this page. This attempt to access private and " + . "secure sections of the site has been recorded and our administrators alerted.", + INEX_Message::MESSAGE_TYPE_ERROR + ); + + $this->logger->alert( $this->user->username . " tried to access the admin controller without sufficient permissions" ); + + Zend_Session::destroy( true, true ); + + $this->_forward( 'login', 'auth' ); + return false; + } + + } + + + /** + * The default action - show the home page + */ + public function indexAction() + { + $this->_forward( 'index' ); + } + + + public function staticAction() + { + $page = $this->_request->getParam( 'page', null ); + + if( $page == null ) + return( $this->_redirect( 'index' ) ); + + // does the requested static page exist? And if so, display it + if( preg_match( '/^[a-zA-Z0-9\-]+$/', $page ) > 0 + && file_exists( APPLICATION_PATH . "/views/admin/static/{$page}.tpl" ) ) + { + $this->view->display( "admin/static/{$page}.tpl" ); + } + else + { + $this->session->message = new INEX_Message( + "The requested page was not found.", + INEX_Message::MESSAGE_TYPE_ERROR + ); + $this->_redirect( 'index' ); + } + } +} + diff --git a/application/controllers/ApplicationController.php b/application/controllers/ApplicationController.php new file mode 100644 index 000000000..4171a071f --- /dev/null +++ b/application/controllers/ApplicationController.php @@ -0,0 +1,49 @@ +_forward( 'new' ); + } + + public function newAction() + { + + } + +} + diff --git a/application/controllers/AuthController.php b/application/controllers/AuthController.php new file mode 100644 index 000000000..b1b3a409e --- /dev/null +++ b/application/controllers/AuthController.php @@ -0,0 +1,340 @@ +_forward( 'login' ); + } + + public function loginAction() + { + $this->view->display( 'auth/login.tpl' ); + } + + public function logoutAction() + { + $this->view->clear_all_assign(); + + $auth = Zend_Auth::getInstance(); + + if( $auth->hasIdentity() ) + { + $auth->clearIdentity(); + $this->view->message = new INEX_Message( 'You have been logged out', INEX_Message::MESSAGE_TYPE_INFO ); + } + + if( $this->_request->getParam( 'auto', 0 ) == 1 ) + $this->view->message = new INEX_Message( 'To protect your account and its information, ' + . 'you have been logged out automatically.', INEX_Message::MESSAGE_TYPE_ALERT ); + + + Zend_Session::destroy( true, true ); + $this->view->display( 'auth/login.tpl' ); + } + + public function processAction() + { + $auth = Zend_Auth::getInstance(); + + try + { + $authAdapter = new INEX_Auth_DoctrineAdapter( + mb_strtolower( $this->getRequest()->getParam( 'loginusername' ) ), + $this->getRequest()->getParam( 'loginpassword' ) + ); + } + catch( Zend_Auth_Adapter_Exception $e ) + { + $this->view->message = new INEX_Message( $e->getMessage(), 'error' ); + $this->view->display( 'auth/login.tpl' ); + return false; + } + + $result = $auth->authenticate( $authAdapter ); + + switch( $result->getCode() ) + { + case Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND: + case Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID: + $this->view->message = new INEX_Message( implode( "
\n", $result->getMessages() ), 'error' ); + $this->view->display( 'auth/login.tpl' ); + return false; + break; + + case Zend_Auth_Result::SUCCESS: + $identity = $auth->getIdentity(); + $user = Doctrine::getTable( 'User' )->find( $identity['user']['id'] ); + + // record the last login IP address + if( $ip = $user->hasPreference( 'auth.last_login_from' ) ) + { + $this->session->last_login_from = $ip; + $this->session->last_login_at = $user->getPreference( 'auth.last_login_at' ); + } + else + $this->session->last_login_from = ''; + + $user->setPreference( 'auth.last_login_from', $_SERVER['REMOTE_ADDR'] ); + $user->setPreference( 'auth.last_login_at', mktime() ); + + // set the timeout + $this->session->timeOfLastAction = mktime(); + + if( isset( $this->session->postAuthRedirect ) ) + $this->_redirect( $this->session->postAuthRedirect ); + else + $this->_redirect( '' ); + break; + + default: + break; + } + } + + public function forgottenPasswordAction() + { + if( $this->getRequest()->getParam( 'fpsubmitted', false ) ) + { + // does the username exist? + if( $user = Doctrine_Core::getTable( 'User' )->findOneByUsername( $this->getRequest()->getParam( 'loginusername' ) ) ) + { + // sanity checks + if( is_numeric( $user->authorisedMobile ) && strlen( $user->authorisedMobile ) > 10 ) + { + $sms = new INEX_SMS_Clickatell( + $this->config['sms']['clickatell']['username'], + $this->config['sms']['clickatell']['password'], + $this->config['sms']['clickatell']['api_id'], + $this->config['sms']['clickatell']['sender_id'] + ); + + if( $sms->send( $user->authorisedMobile, "Your " . $this->_config['identity']['orgname'] + . " Members' area password is:\n\n" . $user->password . "\n" ) ) + { + $this->view->message = new INEX_Message( + 'Your password has been sent to the authorised mobile (' + . substr( $user->authorisedMobile, 0, 6 ) + . str_repeat( 'x', strlen( $user->authorisedMobile ) - 8 ) + . substr( $user->authorisedMobile, -2 ), + 'success' + ); + + $this->view->display( 'auth/login.tpl' ); + return true; + } + else + { + $this->view->message = new INEX_Message( + 'We could not send the password by SMS due to an issue with our SMS provider. ' + . 'Please contact us on ' . $this->_config['identity']['email'] . '.', 'error' ); + } + } + else + { + $this->view->message = new INEX_Message( + 'We could not send the password by SMS as we do not have an authorised mobile number on file. ' + . 'Please contact us on ' . $this->_config['identity']['email'] . ' from an official ' + . 'company email address to provide a mobile number.', 'alert' + ); + } + } + else + { + $this->view->message = new INEX_Message( 'That username does not exist', 'error' ); + } + } + + $this->view->display( 'auth/forgotten-password.tpl' ); + } + + /** + * Create a Drupal login button for admin users + */ + protected function drupalLoginAction() + { + // let's be clear - you have to be an INEX member to access this! + if( $this->identity['user']['privs'] == User::AUTH_SUPERUSER ) + $this->view->display( 'auth/drupal-login.tpl' ); + else + $this->_forward( 'index', 'dashboard' ); + } + + /** + * Switch the logged in user to another. + * + * Allows administrators to switch to another user and operate as them temporarily. + */ + public function switchAction() + { + // only super admins can switch user! + if( $this->user['privs'] != User::AUTH_SUPERUSER ) + { + $this->logger->notice( 'User ' . $this->user['username'] . ' tried to switch to user with ID ' + . $this->_request->getParam( 'id', '[unknown]' ) ); + $this->session->message = new INEX_Message( + 'You are not allowed to switch users! This attempt has been logged and the administrators notified.', + INEX_Message::MESSAGE_TYPE_ERROR + ); + + if( $this->user['privs'] == User::AUTH_CUSTADMIN ) + { + $this->_redirect( 'cust-admin/users' ); + } + else + { + $this->_redirect( 'dashboard' ); + } + } + + // store the fact that we're switching in the session + $this->session->switched_user_from = $this->user['id']; + + // does the requested user exist + $nu = Doctrine_Core::getTable( 'User' )->find( $this->_request->getParam( 'id', false ) ); + + if( !$nu ) + { + $this->session->message = new INEX_Message( + 'The requested user does not exist', + INEX_Message::MESSAGE_TYPE_ERROR + ); + + $this->_redirect( 'user' ); + } + + // easiest way to switch users is to just re-autenticate as the new one + // This maintains consistancy with Zend_Auth and future changes + $result = $this->_reauthenticate( $nu ); + + if( $result->getCode() == Zend_Auth_Result::SUCCESS ) + { + $this->logger->notice( 'User ' . $this->user['username'] . ' has switched to user ' + . $nu['username'] ); + + $this->session->message = new INEX_Message( + "You are now logged in as {$nu['username']}.", INEX_Message::MESSAGE_TYPE_SUCCESS + ); + } + else + { + $this->logger->notice( 'User ' . $this->user['username'] . ' has failed to switch to user ' + . $nu['username'] ); + + $this->session->message = new INEX_Message( + "Error: Could not switch user.", INEX_Message::MESSAGE_TYPE_ERROR + ); + + $this->_redirect( 'user' ); + } + + if( $nu['privs'] == User::AUTH_CUSTADMIN ) + $this->_redirect( 'cust-admin/users' ); + else + $this->_redirect( 'dashboard' ); + } + + /** + * Switch back to the original user when switched to another. + * + * Allows administrators to switch back from another user who they operated as them temporarily. + */ + public function switchBackAction() + { + // are we really operating as another? + if( !isset( $this->session->switched_user_from ) or !$this->session->switched_user_from ) + { + $this->session->message = new INEX_Message( + 'You are not currently logged in as another user. You are: ' . $this->user['username'], + INEX_Message::MESSAGE_TYPE_ERROR + ); + + if( $this->user['privs'] == User::AUTH_SUPERUSER ) + { + $this->_redirect( 'user' ); + } + else if( $this->user['privs'] == User::AUTH_CUSTADMIN ) + { + $this->_redirect( 'cust-admin/users' ); + } + else + { + $this->_redirect( 'dashboard' ); + } + } + + // does the original user exist + $ou = Doctrine_Core::getTable( 'User' )->find( $this->session->switched_user_from ); + + if( !$ou ) + die( 'The user you are trying to switch back to no longer exists!!' ); + + // easiest way to switch users is to just re-autenticate as the new one + // This maintains consistancy with Zend_Auth and future changes + $result = $this->_reauthenticate( $ou ); + + if( $result->getCode() == Zend_Auth_Result::SUCCESS ) + { + $this->logger->notice( 'User ' . $ou['username'] . ' has switched back to user ' + . $this->user['username'] ); + + $this->session->message = new INEX_Message( + "You are now logged in as {$ou['username']}.", INEX_Message::MESSAGE_TYPE_SUCCESS + ); + } + else + die( 'Could not switch back!!' ); + + unset( $this->session->switched_user_from ); + $this->_redirect( 'user' ); + } + + /** + * A simple private function to reauthenticate to a given user. + * + * @param User $user A Doctrine user object + */ + private function _reauthenticate( $user ) + { + $auth = Zend_Auth::getInstance(); + + $authAdapter = new INEX_Auth_DoctrineAdapter( + $user['username'], $user['password'] + ); + + return $auth->authenticate( $authAdapter ); + } + +} + +?> \ No newline at end of file diff --git a/application/controllers/CabinetController.php b/application/controllers/CabinetController.php new file mode 100644 index 000000000..396f124d2 --- /dev/null +++ b/application/controllers/CabinetController.php @@ -0,0 +1,93 @@ +frontend['defaultOrdering'] = 'name'; + $this->frontend['model'] = 'Cabinet'; + $this->frontend['name'] = 'Cabinet'; + $this->frontend['pageTitle'] = 'Cabinets'; + + $this->frontend['columns'] = array( + + 'displayColumns' => array( 'id', 'name', 'cololocation', 'height', 'type', 'location' ), + + 'viewPanelRows' => array( 'name', 'cololocation', 'height', 'type', 'location' ), + 'viewPanelTitle' => 'name', + + 'sortDefaults' => array( + 'column' => 'name', + 'order' => 'desc' + ), + + 'id' => array( + 'label' => 'ID', + 'hidden' => true + ), + + 'name' => array( + 'label' => 'Name', + 'sortable' => 'true', + ), + + 'cololocation' => array( + 'label' => 'Colo Location', + 'sortable' => true + ), + + 'height' => array( + 'label' => 'Height', + 'sortable' => true + ), + + 'type' => array( + 'label' => 'Type', + 'sortable' => true + ), + + 'location' => array( + 'type' => 'hasOne', + 'model' => 'Location', + 'controller' => 'location', + 'field' => 'name', + 'label' => 'Location', + 'sortable' => true + ) + ); + + parent::feInit(); + } + +} + +?> \ No newline at end of file diff --git a/application/controllers/ChangeLogController.php b/application/controllers/ChangeLogController.php new file mode 100644 index 000000000..1aca6fe81 --- /dev/null +++ b/application/controllers/ChangeLogController.php @@ -0,0 +1,143 @@ +frontend['defaultOrdering'] = 'livedate'; + $this->frontend['model'] = 'ChangeLog'; + $this->frontend['name'] = 'ChangeLog'; + $this->frontend['pageTitle'] = 'Change Log'; + + $this->frontend['columns'] = array( + + 'displayColumns' => array( + 'id', 'title', 'visibility', 'livedate', 'created_by', 'created_at' + ), + + 'viewPanelRows' => array( 'title', 'visibility', 'details', 'livedate', 'created_by', 'created_at' ), + + 'viewPanelTitle' => 'title', + + 'sortDefaults' => array( + 'column' => 'livedate', 'order' => 'desc' + ), + + 'id' => array( + 'label' => 'ID', + 'hidden' => true + ), + + 'title' => array( + 'label' => 'Summary', + 'sortable' => false + ), + + 'details' => array( + 'label' => 'Details' + ), + + 'visibility' => array( + 'label' => 'Visibility', + 'sortable' => true, + 'type' => 'xlate', + 'xlator' => User::$PRIVILEGES_TEXT + ), + + 'livedate' => array( + 'label' => 'Live Date' + ), + + 'created_by' => array( + 'type' => 'hasOne', + 'model' => 'User', + 'controller' => 'user', + 'field' => 'username', + 'label' => 'Created By', + 'sortable' => true + ), + + 'created_at' => array( + 'label' => 'Created At' + ) + + + ); + + // Override global auth level requirement for specific actions + $this->frontend['authLevels'] = array( + 'read' => User::AUTH_CUSTUSER + ); + + parent::feInit(); + + } + + + /** + * Before we save, set the created by field. + * + * @param unknown_type $log The Change Log object + * @param unknown_type $isEdit True if the log is being edited, flase if it's being added + * @param unknown_type $form The submitted form object + */ + protected function addEditPreSave( $log, $isEdit, $form ) + { + $log['created_by'] = $this->user; + } + + + + protected function readAction() + { + if( $this->_request->getParam( 'items', false ) == 'new' ) + $dateFrom = $this->user->getPreference( 'change_log.last_seen' ); + else + $dateFrom = false; + + // get change log records for this user + $entries = ChangeLogTable::getUpdates( $this->user['privs'], + $dateFrom, Doctrine_Core::HYDRATE_ARRAY + ); + + // update last read preference + $this->user->setPreference( 'change_log.last_seen', date( 'Y-m-d H:i:s' ) ); + $this->session->change_log_has_updates = 0; + $this->view->change_log_has_updates = 0; + + $this->view->newOnly = $dateFrom; // dateFrom is false if we are displaying all + $this->view->entries = $entries; + $this->view->display( 'change-log/entries.tpl' ); + } +} + +?> \ No newline at end of file diff --git a/application/controllers/CliController.php b/application/controllers/CliController.php new file mode 100644 index 000000000..fd4a018e2 --- /dev/null +++ b/application/controllers/CliController.php @@ -0,0 +1,594 @@ +_verbose = $this->getFrontController()->getParam( 'verbose' ); + } + + + public function postDispatch() + { + print "\n"; + } + + + /** + * Demo action to demonstrate CLI action + * + */ + public function testAction() + { + print "This is a demo action.\n"; + } + + + + public function uploadTrafficStatsToDbAction() + { + // This should only be done once a day and if values already exist for 'today', + // just delete them. + $day = date( 'Y-m-d' ); + Doctrine_Query::create() + ->delete( 'TrafficDaily' ) + ->where( 'day = ?', $day ) + ->execute(); + + $custs = Doctrine_Query::create() + ->select( 'c.shortname' ) + ->addSelect( 'c.name' ) + ->from( 'Cust c' ) + ->whereIn( 'c.type', array( Cust::TYPE_FULL, Cust::TYPE_INTERNAL, Cust::TYPE_PROBONO ) ) + ->andWhere( 'c.status = ?', array( Cust::STATUS_NORMAL ) ) + ->andWhere( 'c.dateleave = 0 or c.dateleave IS NULL' ) + ->andWhereIn( 'c.shortname', array( 'inex', 'routeservers' ), true ) + ->fetchArray(); + + foreach( $custs as $cust ) + { + $stats = array(); + + foreach( INEX_Mrtg::$CATEGORIES as $category ) + { + $mrtg = new INEX_Mrtg( + INEX_Mrtg::getMrtgFilePath( $this->config['mrtg']['path'], + 'LOG', 'aggregate', $category, + $cust['shortname'] + ) + ); + + $td = new TrafficDaily(); + $td['day'] = $day; + $td['category'] = $category; + $td['cust_id'] = $cust['id']; + + foreach( INEX_Mrtg::$PERIODS as $period ) + { + $stats = $mrtg->getValues( $period, $category, false ); + + $td["{$period}_avg_in"] = $stats['averagein']; + $td["{$period}_avg_out"] = $stats['averageout']; + $td["{$period}_max_in"] = $stats['maxin']; + $td["{$period}_max_out"] = $stats['maxout']; + $td["{$period}_tot_in"] = $stats['totalin']; + $td["{$period}_tot_out"] = $stats['totalout']; + + } + + $td->save(); + } + } + } + + public function updateTraffic95thPercentileDbAction() + { + $tstart = mktime( 0, 0, 0, date('m'), date('j')-1, date('Y') ); + $tend = mktime( 23, 59, 59, date('m'), date('j')-1, date('Y') ); + + if( $this->_verbose ) + { + echo "\n\nupdateTraffic95thPercentileDbAction()\n\n"; + echo "Updating traffic statistics and 95th percentiles...\n\n"; + echo "START: $tstart " . date( 'Y-m-d H:i:s', $tstart ) . "\n"; + echo "END: $tend " . date( 'Y-m-d H:i:s', $tend ) . "\n"; + echo "Deleting pre-existing records for the period of they exist...\n\n"; + } + + // This should only be done once a day and if values already exist for 'today', + // just delete them. + Doctrine_Query::create() + ->delete( 'Traffic95th' ) + ->where( 'datetime >= ?', date( 'Y-m-d H:i:s', $tstart ) ) + ->andWhere( 'datetime <= ?', date( 'Y-m-d H:i:s', $tend ) ) + ->execute(); + + $custs = Doctrine_Query::create() + ->select( 'c.shortname' ) + ->addSelect( 'c.name' ) + ->from( 'Cust c' ) + ->whereIn( 'c.type', array( Cust::TYPE_FULL, Cust::TYPE_INTERNAL, Cust::TYPE_PROBONO ) ) + ->andWhere( 'c.status = ?', array( Cust::STATUS_NORMAL ) ) + ->andWhere( 'c.dateleave = 0 or c.dateleave IS NULL' ) + ->andWhereIn( 'c.shortname', array( 'inex', 'routeservers' ), true ) + ->fetchArray(); + + + $percentiles = array(); + foreach( $custs as $cust ) + { + if( $this->_verbose ) + { + echo "\n${cust['name']} (${cust['shortname']} - #${cust['id']})\n"; + echo "\tGathering statistics from MRTG files...\n"; + } + + $stats = array(); + + $mrtg = new INEX_Mrtg( + INEX_Mrtg::getMrtgFilePath( $this->config['mrtg']['path'], + 'LOG', 'aggregate', 'bits', + $cust['shortname'] + ) + ); + + $dataPoints = $mrtg->getArray(); + + unset( $mrtg ); + + $qualifyingDataPointCount = 0; + + foreach( $dataPoints as $dp ) + { + if( $dp[0] >= $tstart && $dp[0] <= $tend ) + { + $t95th = new Traffic95th(); + $t95th['cust_id'] = $cust['id']; + $t95th['datetime'] = date( 'Y-m-d H:i:s', $dp[0] ); + + list( $intTime, $avgratein, $avgrateout, $peakratein, $peakrateout ) = $dp; + + if( $avgratein > $avgrateout ) + $t95th['average'] = $avgratein; + else + $t95th['average'] = $avgrateout; + + if( $peakratein > $peakrateout ) + $t95th['max'] = $peakratein; + else + $t95th['max'] = $peakrateout; + + $t95th->save(); + $t95th->free( true ); // memory management + + ++$qualifyingDataPointCount; + } + } + + unset( $dataPoints ); + + if( $this->_verbose ) + echo "\tInserted " . $qualifyingDataPointCount . " qualifying data points into database...\n"; + + + // calculate the 95th for the current month or the overall for the last month + if( date( 'j') == '1' ) + { + if( $this->_verbose ) + echo "\tCalculating 95th percentile for last month...\n"; + + $tend2 = date( 'Y-m-d H:i:s', mktime( 23, 59, 59, date( 'm' ), date('j')-1, date( 'Y' ) ) ); + $tstart2 = mktime( 0, 0, 0, date( 'm', $tend2 ), 1, date( 'Y', $tend2 ) ); + $month2 = date( 'Y-m-d', $tstart2 ); + $tstart2 = date( 'Y-m-d H:i:s', $tstart2 ); + } + else + { + if( $this->_verbose ) + echo "\tCalculating 95th percentile for this month to date...\n"; + + $tend2 = date( 'Y-m-d H:i:s', mktime( 23, 59, 59, date( 'm' ), date('j')-1, date( 'Y' ) ) ); + $tstart2 = mktime( 0, 0, 0, date( 'm' ), 1, date( 'Y' ) ); + $month2 = date( 'Y-m-d', $tstart2 ); + $tstart2 = date( 'Y-m-d H:i:s', $tstart2 ); + } + + if( $percentiles[$cust['shortname']] = Traffic95thTable::get95thPercentile( $cust['id'], $tstart2, $tend2 ) ) + { + if( $this->_verbose ) + echo "\tFound 95th percentile: ${percentiles[$cust['shortname']]}\n"; + + if( count( $entry = Doctrine_Core::getTable( 'Traffic95thMonthly' ) + ->findByDql( 'cust_id = ? AND month = ?', array( $cust['id'], $month2 ) ) ) ) + { + if( $this->_verbose ) + echo "\tUpdating value for this month to 95th traffic table...\n"; + + // there should only be one of these (unique index on cust_id and month)! + $entry[0]['max_95th'] = $percentiles[$cust['shortname']] * 8; + $entry[0]->save(); + $entry->free(); + } + else + { + if( $this->_verbose ) + echo "\tAdding first value for this month to 95th traffic table...\n"; + + $entry = new Traffic95thMonthly(); + $entry['cust_id'] = $cust['id']; + $entry['month'] = $month2; + $entry['max_95th'] = $percentiles[$cust['shortname']] * 8; + $entry->save(); + $entry->free(); + } + + } + + } + + } + + + + + /** + * This function looks for members who have changed their traffic patterns significantly + * when comparing 'yesterday' to the last month. + */ + public function examineTrafficDeltasAction() + { + + $custs = Doctrine_Query::create() + ->select( 'c.shortname' ) + ->addSelect( 'c.name' ) + ->from( 'Cust c' ) + ->whereIn( 'c.type', array( Cust::TYPE_FULL, Cust::TYPE_INTERNAL, Cust::TYPE_PROBONO ) ) + ->andWhere( 'c.status = ?', array( Cust::STATUS_NORMAL ) ) + ->andWhere( 'c.dateleave = 0 or c.dateleave IS NULL' ) + ->andWhereIn( 'c.shortname', array( 'inex', 'routeservers' ), true ) + ->fetchArray(); + + $mail = new Zend_Mail(); + $mail->setFrom( $this->config['cli']['traffic_differentials']['from_email'], $this->config['cli']['traffic_differentials']['from_name'] ) + ->setSubject( $this->config['cli']['traffic_differentials']['subject'] ) + ->setType( Zend_Mime::MULTIPART_RELATED ); + + foreach( $this->config['cli']['traffic_differentials']['recipients'] as $r ) + $mail->addTo( $r ); + + $mailHtml = $this->view->render( 'customer/mail/diff-header.tpl' ); + + $numWithExceededThreshold = 0; + + foreach( $custs as $c ) + { + $tds = Doctrine_Query::create() + ->from( 'TrafficDaily td' ) + ->where( 'td.category = ?', 'bits' ) + ->andWhere( 'td.cust_id = ?', $c['id'] ) + ->orderBy( 'td.day DESC' ) + ->limit( $this->config['cli']['traffic_differentials']['stddev_calc_length'] + 1 ) + ->fetchArray(); + + $firstDone = false; + $meanIn = 0.0; $stddevIn = 0.0; + $meanOut = 0.0; $stddevOut = 0.0; + $count = 0.0; + + foreach( $tds as $t ) + { + if( !$firstDone ) + { + $todayAvgIn = $t['day_avg_in']; + $todayAvgOut = $t['day_avg_out']; + $firstDone = true; + continue; + } + + $count += 1.0; + $meanIn += $t['day_avg_in']; + $meanOut += $t['day_avg_out']; + } + + if( $count > 1 ) + { + $meanIn /= $count; + $meanOut /= $count; + + foreach( $tds as $t ) + { + $stddevIn += ( $t['day_avg_in'] - $meanIn ) * ( $t['day_avg_in'] - $meanIn ); + $stddevOut += ( $t['day_avg_out'] - $meanOut ) * ( $t['day_avg_out'] - $meanOut ); + } + + $stddevIn = sqrt( $stddevIn / ( $count - 1 ) ); + $stddevOut = sqrt( $stddevOut / ( $count - 1 ) ); + } + + // so, is yesterday's traffic outside of the standard deviation? And is it an increase or decrease? + $sIn = ( $todayAvgIn - $meanIn ) > 0 ? 'increase' : 'decrease'; + $sOut = ( $todayAvgOut - $meanOut ) > 0 ? 'increase' : 'decrease'; + $dIn = abs( $todayAvgIn - $meanIn ); + $dOut = abs( $todayAvgOut - $meanOut ); + + $thresholdIn = 1.5*$stddevIn; + $thresholdOut = 1.5*$stddevOut; + + if( $this->_verbose ) + { + echo $c['name'] . "\n"; + printf( "\tIN M: %d\tSD: %d\tDiff: %d\tT: %d\tR: %s\n", + intval( $meanIn ), intval( $stddevIn ), intval( $dIn ), $thresholdIn, ( $dIn > $thresholdIn ? 'OUT' : 'IN' ) + ); + printf( "\tOUT M: %d\tSD: %d\tDiff: %d\tT: %d\tR: %s\n\n", + intval( $meanOut ), intval( $stddevOut ), intval( $dOut ), $thresholdOut, ( $dOut > $thresholdOut ? 'OUT' : 'IN' ) + ); + } + + if( $dIn > $thresholdIn || $dOut > $thresholdOut ) + { + $this->view->cust = $c; + $this->view->in = $todayAvgIn; + $this->view->out = $todayAvgOut; + $this->view->stddevIn = $stddevIn; + $this->view->stddevOut = $stddevOut; + $this->view->meanIn = $meanIn; + $this->view->meanOut = $meanOut; + $this->view->dIn = $dIn; + $this->view->dOut = $dOut; + $this->view->sIn = $sIn; + $this->view->sOut = $sOut; + $this->view->threasholdIn = $thresholdIn; + $this->view->threasholdOut = $thresholdOut; + $this->view->percentIn = $meanIn ? intval( ( $dIn / $meanIn ) * 100 ) : 'NONE'; + $this->view->percentOut = $meanOut ? intval( ( $dOut / $meanOut ) * 100 ) : 'NONE'; + $this->view->days = $this->config['cli']['traffic_differentials']['stddev_calc_length']; + + $mrtg = $mail->createAttachment( + @file_get_contents( + INEX_Mrtg::getMrtgFilePath( + $this->config['mrtg']['path'], + 'PNG', + 'aggregate', + 'bits', + $c['shortname'], + 'month' + ) + ), + "image/png", + Zend_Mime::DISPOSITION_INLINE, + Zend_Mime::ENCODING_BASE64, + $c['shortname'] . ".png" + ); + $mrtg->id = $c['shortname']; + + $mailHtml .= $this->view->render( 'customer/mail/diff-member.tpl' ); + + $numWithExceededThreshold++; + } + + } + + $this->view->numWithExceededThreshold = $numWithExceededThreshold; + + $mailHtml .= $this->view->render( 'customer/mail/diff-footer.tpl' ); + + $mail->setBodyHtml( $mailHtml ); + $mail->send(); + } + + /** + * This function looks for members who are reaching or exceeding 80% port utilisation + */ + public function examinePortUtilisationAction() + { + + $custs = Doctrine_Query::create() + ->select( 'c.shortname' ) + ->addSelect( 'c.name' ) + ->from( 'Cust c' ) + ->whereIn( 'c.type', array( Cust::TYPE_FULL, Cust::TYPE_INTERNAL, Cust::TYPE_PROBONO ) ) + ->andWhere( 'c.status = ?', array( Cust::STATUS_NORMAL ) ) + ->andWhere( 'c.dateleave = 0 or c.dateleave IS NULL' ) + ->andWhereIn( 'c.shortname', array( 'inex', 'routeservers' ), true ) + ->fetchArray(); + + $mail = new Zend_Mail(); + $mail->setFrom( $this->config['cli']['port_utilisation']['from_email'], $this->config['cli']['traffic_differentials']['from_name'] ) + ->setSubject( $this->config['cli']['port_utilisation']['subject'] ) + ->setType( Zend_Mime::MULTIPART_RELATED ); + + foreach( $this->config['cli']['port_utilisation']['recipients'] as $r ) + $mail->addTo( $r ); + + $this->view->threshold = $this->config['cli']['port_utilisation']['threshold']; + $mailHtml = $this->view->render( 'customer/mail/util-header.tpl' ); + + $numIntsWithExcessUtil = 0; + + foreach( $custs as $c ) + { + $interfaces = Doctrine_Query::create() + ->from( 'Virtualinterface vi' ) + ->leftJoin( 'vi.Physicalinterface pi' ) + ->leftJoin( 'pi.Switchport sp' ) + ->leftJoin( 'sp.SwitchTable s' ) + ->where( 'vi.custid = ?', $c['id'] ) + ->orderBy( 'pi.monitorindex' ) + ->fetchArray(); + + + foreach( $interfaces as $i ) + { + foreach( $i['Physicalinterface'] as $pi ) + { + $speed = $pi['speed'] * 1024 * 1024; + + $mrtg = new INEX_Mrtg( + INEX_Mrtg::getMrtgFilePath( $this->config['mrtg']['path'], + 'LOG', $pi['monitorindex'], INEX_Mrtg::CATEGORY_BITS, + $c['shortname'] + ) + ); + + $stats = $mrtg->getValues( INEX_Mrtg::PERIOD_WEEK, INEX_Mrtg::CATEGORY_BITS, false ); + + $maxIn = $stats['maxin'] * 8.0; + $maxOut = $stats['maxout'] * 8.0; + + $switch_port = $pi['Switchport']['SwitchTable']['name'] . ' :: ' . $pi['Switchport']['name']; + + $utilIn = $maxIn / $speed; + $utilOut = $maxOut / $speed; + + if( $utilIn > $this->config['cli']['port_utilisation']['threshold'] || $utilOut > $this->config['cli']['port_utilisation']['threshold'] ) + { + $this->view->cust = $c; + $this->view->utilIn = $utilIn; + $this->view->utilOut = $utilOut; + $this->view->switchport = $switch_port; + + $mrtg = $mail->createAttachment( + file_get_contents( + INEX_Mrtg::getMrtgFilePath( + $this->config['mrtg']['path'], + 'PNG', + $pi['monitorindex'], + INEX_Mrtg::CATEGORY_BITS, + $c['shortname'], + INEX_Mrtg::PERIOD_WEEK + ) + ), + "image/png", + Zend_Mime::DISPOSITION_INLINE, + Zend_Mime::ENCODING_BASE64, + $c['shortname'] . ".png" + ); + + $mrtg->id = $c['shortname']; + + $mailHtml .= $this->view->render( 'customer/mail/util-member.tpl' ); + + $numIntsWithExcessUtil++; + } + } + } + } + + $this->view->numWithExcessUtil = $numIntsWithExcessUtil; + + $mailHtml .= $this->view->render( 'customer/mail/util-footer.tpl' ); + + $mail->setBodyHtml( $mailHtml ); + $mail->send(); + } + + + /** + * Generates a Nagios configuration for supported switches in the database + */ + public function generateNagiosConfigAction() + { + + $switches = Doctrine_Query::create() + ->from( 'SwitchTable s' ) + ->leftJoin( 's.Vendor v' ) + ->leftJoin( 's.Cabinet c' ) + ->leftJoin( 'c.Location l' ) + ->where( 's.active = 1' ) + ->fetchArray(); + + #print_r( $switches ); + #exit; + + echo $this->view->render( 'cli/nagios/switch-definitions.tpl' ); + + $all = array(); + $brocade = array(); + $cisco = array(); + $mrv = array(); + + $locations = array(); + + foreach( $switches as $s ) + { + $this->view->sw = $s; + echo $this->view->render( 'cli/nagios/switch-hosts.tpl' ); + + switch( $s['Vendor']['name'] ) + { + case 'Foundry Networks': + $brocade[] = $s['name']; + break; + + case 'Cisco Systems': + $cisco[] = $s['name']; + break; + + case 'MRV': + $mrv[] = $s['name']; + break; + } + + $all[] = $s['name']; + + $locations[$s['Cabinet']['Location']['shortname']][] = $s['name']; + } + + $this->view->all = $all; + + $this->view->locations = $locations; + + $this->view->vendor_brocade = $brocade; + $this->view->vendor_cisco = $cisco; + $this->view->vendor_mrv = $mrv; + + echo $this->view->render( 'cli/nagios/switch-templates.tpl' ); + } + +} + + diff --git a/application/controllers/ConsoleServerConnectionController.php b/application/controllers/ConsoleServerConnectionController.php new file mode 100644 index 000000000..981357249 --- /dev/null +++ b/application/controllers/ConsoleServerConnectionController.php @@ -0,0 +1,117 @@ +frontend['defaultOrdering'] = 'name'; + $this->frontend['model'] = 'Consoleserverconnection'; + $this->frontend['name'] = 'ConsoleServerConnection'; + $this->frontend['pageTitle'] = 'Console Server Connections'; + + $this->frontend['columns'] = array( + + 'displayColumns' => array( 'id', 'custid', 'description', 'switchid', 'port' ), + + 'viewPanelRows' => array( 'custid', 'description', 'switchid', 'port', 'speed', 'parity', 'stopbits', 'flowcontrol', 'autobaud', 'notes' ), + + 'sortDefaults' => array( + 'column' => 'port', + 'order' => 'asc' + ), + + 'id' => array( + 'label' => 'ID', + 'hidden' => true + ), + + + 'custid' => array( + 'type' => 'hasOne', + 'model' => 'Cust', + 'controller' => 'customer', + 'field' => 'name', + 'label' => 'Customer', + 'sortable' => true + ), + + 'description' => array( + 'label' => 'Description', + 'sortable' => 'true', + ), + + 'switchid' => array( + 'type' => 'hasOne', + 'model' => 'SwitchTable', + 'controller' => 'switch', + 'field' => 'name', + 'label' => 'Console Server', + 'sortable' => true + ), + + 'port' => array( + 'label' => 'Port', + 'sortable' => 'true', + ), + + 'speed' => array( + 'label' => 'Speed' + ), + + 'parity' => array( + 'label' => 'Parity' + ), + + 'stopbits' => array( + 'label' => 'Stopbits' + ), + + 'flowcontrol' => array( + 'label' => 'Flow Control' + ), + + 'autobaud' => array( + 'label' => 'Autobaud' + ), + + 'notes' => array( + 'label' => 'Notes' + ) + + ); + + parent::feInit(); + } + +} + +?> \ No newline at end of file diff --git a/application/controllers/ContactController.php b/application/controllers/ContactController.php new file mode 100644 index 000000000..db38473da --- /dev/null +++ b/application/controllers/ContactController.php @@ -0,0 +1,103 @@ +frontend['defaultOrdering'] = 'name'; + $this->frontend['model'] = 'Contact'; + $this->frontend['name'] = 'Contact'; + $this->frontend['pageTitle'] = 'Contacts'; + + $this->frontend['columns'] = array( + + 'displayColumns' => array( 'id', 'name', 'custid', 'email', 'phone', 'mobile' ), + + 'viewPanelRows' => array( 'name', 'custid', 'email', 'phone', 'mobile', + 'facilityaccess', 'mayauthorize' + ), + + 'viewPanelTitle' => 'name', + + 'sortDefaults' => array( + 'column' => 'name', + 'order' => 'desc' + ), + + 'id' => array( + 'label' => 'ID', + 'hidden' => true + ), + + + 'name' => array( + 'label' => 'Name', + 'sortable' => 'true', + ), + + 'custid' => array( + 'type' => 'hasOne', + 'model' => 'Cust', + 'controller' => 'customer', + 'field' => 'name', + 'label' => 'Customer', + 'sortable' => true + ), + + 'email' => array( + 'label' => 'E-mail', + 'sortable' => true + ), + + 'phone' => array( + 'label' => 'Phone', + ), + + 'mobile' => array( + 'label' => 'Mobile', + ), + + 'facilityaccess' => array( + 'label' => 'Facility Access', + ), + + 'mayauthorize' => array( + 'label' => 'May Authorise', + ) + ); + + parent::feInit(); + } + +} + +?> \ No newline at end of file diff --git a/application/controllers/CustAdminController.php b/application/controllers/CustAdminController.php new file mode 100644 index 000000000..0c1cefbd8 --- /dev/null +++ b/application/controllers/CustAdminController.php @@ -0,0 +1,335 @@ +identity ) + $this->_redirect( 'auth/login' ); + else if( $this->user->privs != User::AUTH_CUSTADMIN ) + { + $this->view->message = new INEX_Message( + "You must be a customer administrator to access this page. This attempt to access private and " + . "secure sections of the site has been recorded and our administrators alerted.", + INEX_Message::MESSAGE_TYPE_ERROR + ); + + $this->logger->alert( $this->user->username . " tried to access dashboard/users without sufficient permissions" ); + + Zend_Session::destroy( true, true ); + + $this->_forward( 'login', 'auth' ); + return false; + } + + } + + + /** + * The default action - show the home page + */ + public function indexAction() + { + $this->_forward( 'users' ); + } + + /** + * Allow a CUSTADMIN to manage their users + */ + public function usersAction() + { + if( isset( $this->session->custadminInstructions ) ) + $this->view->skipInstructions = true; + else + { + $this->session->custadminInstructions = true; + $this->view->skipInstructions = false; + } + + // find the user's users + $this->view->users = Doctrine_Query::create() + ->from( 'user' ) + ->where( 'custid = ?', $this->user->custid ) + ->andWhere( 'privs = ?', User::AUTH_CUSTUSER ) + ->orderBy( 'username ASC' ) + ->execute(); + + $this->view->display( 'cust-admin/list.tpl' ); + } + + public function editUserAction() + { + $this->_forward( 'add-user' ); + } + + public function addUserAction() + { + $u = new User(); + + // is this an attempt to edit? + if( $this->getRequest()->getParam( 'id' ) !== NULL && is_numeric( $this->getRequest()->getParam( 'id' ) ) ) + { + $isEdit = true; + + // load the user and see if it exists + if( !( $u = Doctrine::getTable( 'User' )->find( $this->getRequest()->getParam( 'id' ) ) ) ) + { + $this->view->message = new INEX_Message( 'There is no such user in our database', INEX_Message::MESSAGE_TYPE_ERROR ); + return( $this->_forward( 'users' ) ); + } + + // now is the current CUSTADMIN user entitled to edit the specified user? + if( $u->custid != $this->user->custid ) + { + $this->logger->alert( "In cust-admin/toggle-enabled, user ($this->user->username} tried to illegally edit {$u->username}!" ); + $this->view->message = new INEX_Message( 'You have tried to edit a user that is not yours. Our administrators have been alerted and will act accordingly.', INEX_Message::MESSAGE_TYPE_ALERT ); + return( $this->_forward( 'users' ) ); + } + + $form = new INEX_Form_User( null, $isEdit, + Zend_Controller_Front::getInstance()->getBaseUrl() . "/cust-admin" + ); + + if( $this->_request->getParam( 'commit', null ) != 1 ) + { + $form->getElement( 'username' )->setValue( $u->username ); + $form->getElement( 'email' )->setValue( $u->email ); + $form->getElement( 'authorisedMobile' )->setValue( $u->authorisedMobile ); + if( $u->disabled ) + $form->getElement( 'disabled' )->setChecked( true ); + } + + $form->getElement( 'username' )->setAttrib( 'readonly', '1' ); + + $form->setAction( Zend_Controller_Front::getInstance()->getBaseUrl() . "/cust-admin/edit-user/id/" . $u->id ); + $form->getElement( 'submit' )->setLabel( 'Save Changes' ); + } + else + { + $isEdit = false; + + $form = new INEX_Form_User( null, $isEdit, + Zend_Controller_Front::getInstance()->getBaseUrl() . "/cust-admin" + ); + $form->setAction( Zend_Controller_Front::getInstance()->getBaseUrl() . "/cust-admin/add-user" ); + + // let's capture the user's name and add them to the contact table also + $name = $form->createElement( 'text', 'name' ); + $name->addValidator( 'stringLength', false, array( 2, 64 ) ) + ->setRequired( true ) + ->setAttrib( 'size', 50 ) + ->setLabel( 'Name' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $elements = $form->getElements(); + $form->clearElements(); + $form->addElement( $name ); + $form->addElements( $elements ); + } + + $form->removeElement( 'privs' ); + $form->removeElement( 'custid' ); + $form->removeElement( 'password' ); + + $this->view->isEdit = $isEdit; + + if( $this->_request->getParam( 'commit', null ) == 1 && $form->isValid( $_POST ) ) + { + do + { + try + { + // is the username unique? + if( !$isEdit && Doctrine::getTable( 'User' )->findOneByUsername( $form->getValue( 'username' ) ) ) + { + $form->getElement( 'username' )->addError( 'This username is not available' ); + break; + } + + if( !$isEdit ) + { + // hard code some values to prevent injection from malicious users + $u->custid = $this->user['custid']; + $u->privs = User::AUTH_CUSTUSER; + $u->creator = $this->user['username']; + $u->id = null; + $u->created = date( 'Y-m-d H:i:s' ); + $u->Parent = $this->user; + + $u->username = $form->getValue( 'username' ); + $u->password = UserTable::createRandomPassword( 8 ); + + $c = new Contact(); + $c->custid = $this->user['custid']; + $c->name = $form->getValue( 'name' ); + $c->email = $form->getValue( 'email' ); + $c->mobile = $form->getValue( 'authorisedMobile' ); + $c->creator = $this->user['username']; + $c->created = date( 'Y-m-d H:i:s' ); + $c->save(); + } + + $u->email = $form->getValue( 'email' ); + $u->authorisedMobile = $form->getValue( 'authorisedMobile' ); + $u->disabled = $form->getElement( 'disabled' )->isChecked() ? 1 : 0; + $u->save(); + + if( !$isEdit ) + { + $sms_sent = $this->getSMS()->send( + $u->authorisedMobile, + "Your " . $this->_config['identity']['orgname'] + . " IXP Manager (" + . $this->_config['identity']['ixp']['url'] + . ") password is:\n\n" + . $u->password . "\n" + ); + + $mail = new Zend_Mail(); + $mail->setFrom( $this->config['identity']['email'], $this->config['identity']['name'] ) + ->setSubject( 'Access details for ' . $this->config['identity']['ixp']['fullname'] ) + ->setType( Zend_Mime::MULTIPART_RELATED ) + ->addTo( $u->email ); + + $ixp_logo = $mail->createAttachment( + file_get_contents( $this->config['identity']['ixp']['logo'] ), + "image/jpg", + Zend_Mime::DISPOSITION_INLINE, + Zend_Mime::ENCODING_BASE64, + 'ixp-logo.jpg' + ); + $ixp_logo->id = 'ixp_logo'; + + $this->view->u = $u; + $mail->setBodyHtml( $this->view->render( 'cust-admin/mail/welcome.tpl' ) ); + + $mail_sent = true; + + try { $mail->send(); } + catch( Zend_Mail_Exception $e ) { $mail_sent = false; } + + $this->logger->notice( "New user created by {$this->user->username}: {$u->username}/{$u->email}" ); + + if( $mail_sent && $sms_sent ) + { + $this->session->message = new INEX_Message( + "New user {$u->username} created. A welcome email has been sent and the user's password has been delivered by SMS text message", + INEX_Message::MESSAGE_TYPE_SUCCESS + ); + } + else if( !$mail_sent && !$sms_sent ) + { + $this->session->message = new INEX_Message( + "New user {$u->username} created. However we could neither send a welcome email nor the password by SMS - please contact " . $this->_config['identity']['email'], + INEX_Message::MESSAGE_TYPE_ALERT + ); + } + else if( $mail_sent ) + { + $this->session->message = new INEX_Message( + "New user {$u->username} created. A welcome email has been sent but there was an error delivering by SMS text message - please contact " . $this->_config['identity']['email'], + INEX_Message::MESSAGE_TYPE_ALERT + ); + } + else + { + $this->session->message = new INEX_Message( + "New user {$u->username} created. A welcome email could not be sent but the password has been delivered via SMS text message", + INEX_Message::MESSAGE_TYPE_ALERT + ); + } + + } + else + { + // $isEdit + $this->logger->info( "cust-admin/edit-user User {$u->username} edited by {$this->user->username}" ); + + $this->session->message = new INEX_Message( + "User {$u->username} edited.", + INEX_Message::MESSAGE_TYPE_SUCCESS + ); + } + + return( $this->_redirect( 'cust-admin/users' ) ); + } + catch( Exception $e ) + { + Zend_Registry::set( 'exception', $e ); + return( $this->_forward( 'error', 'error' ) ); + } + }while( false ); + } + + $this->view->form = $form->render( $this->view ); + $this->view->u = $u; + + $this->view->display( 'cust-admin' . DIRECTORY_SEPARATOR . 'add-edit.tpl' ); + } + + + public function toggleEnabledAction() + { + // load the user and see if it exists + if( !( $u = Doctrine::getTable( 'User' )->find( $this->getRequest()->getParam( 'id' ) ) ) ) + { + $this->view->message = new INEX_Message( 'There is no such user in our database', INEX_Message::MESSAGE_TYPE_ERROR ); + return( $this->_forward( 'users' ) ); + } + + // now is the current CUSTADMIN user entitled to edit the specified user? + if( $u->custid != $this->user->custid ) + { + $this->logger->alert( "In cust-admin/toggle-enabled, user ($this->user->username} tried to illegally edit {$u->username}!" ); + $this->view->message = new INEX_Message( 'You have tried to edit a user that is not yours. Our administrators have been alerted and will act accordingly.', INEX_Message::MESSAGE_TYPE_ALERT ); + return( $this->_forward( 'users' ) ); + } + + $u->disabled = ( $u->disabled + 1 ) % 2; + $u->save(); + + if( $u->disabled ) + $this->session->message = new INEX_Message( "You have disabled user {$u->username}.", INEX_Message::MESSAGE_TYPE_SUCCESS ); + else + $this->session->message = new INEX_Message( "You have enabled user {$u->username}.", INEX_Message::MESSAGE_TYPE_SUCCESS ); + + $this->logger->info( "cust-admin/toggle-enabled: {$this->user->username} set disbaled flag of {$u->username} to {$u->disabled}" ); + + $this->_redirect( 'cust-admin/users' ); + } + +} + diff --git a/application/controllers/CustKitController.php b/application/controllers/CustKitController.php new file mode 100644 index 000000000..644432504 --- /dev/null +++ b/application/controllers/CustKitController.php @@ -0,0 +1,91 @@ +frontend['defaultOrdering'] = 'name'; + $this->frontend['model'] = 'Custkit'; + $this->frontend['name'] = 'CustKit'; + $this->frontend['pageTitle'] = 'Customer Kit'; + + $this->frontend['columns'] = array( + + 'displayColumns' => array( 'id', 'name', 'custid', 'cabinetid' ), + + 'sortDefaults' => array( + 'column' => 'name', + 'order' => 'desc' + ), + + 'id' => array( + 'label' => 'ID', + 'hidden' => true + ), + + + 'name' => array( + 'label' => 'Name', + 'sortable' => 'true', + ), + + 'custid' => array( + 'type' => 'hasOne', + 'model' => 'Cust', + 'controller' => 'customer', + 'field' => 'name', + 'label' => 'Customer', + 'sortable' => true + ), + + 'cabinetid' => array( + 'type' => 'hasOne', + 'model' => 'Cabinet', + 'controller' => 'cabinet', + 'field' => 'name', + 'label' => 'Cabinet', + 'sortable' => true + ), + + 'descr' => array( + 'label' => 'Description', + 'sortable' => false + ) + + ); + + parent::feInit(); + } + +} + +?> \ No newline at end of file diff --git a/application/controllers/CustomerController.php b/application/controllers/CustomerController.php new file mode 100644 index 000000000..68c0e2e67 --- /dev/null +++ b/application/controllers/CustomerController.php @@ -0,0 +1,609 @@ +frontend['defaultOrdering'] = 'name'; + $this->frontend['model'] = 'Cust'; + $this->frontend['name'] = 'Customer'; + $this->frontend['pageTitle'] = 'IXP Members'; + + $this->frontend['columns'] = array( + + 'displayColumns' => array( + 'id', 'name', 'autsys', 'shortname', 'peeringemail', 'nocphone' + ), + + // Customer can update: + 'updatableColumns' => array( 'peeringemail', 'noc24hphone', 'nocphone', 'nocemail', 'nocfax', 'nochours', 'nocwww', + 'billingContact', 'billingAddress1', 'billingAddress2', 'billingCity', 'billingCountry', 'corpwww' + ), + + 'viewPanelRows' => array( 'name', 'type', 'status', 'shortname', 'autsys', 'peeringemail', 'nocphone', 'nocemail', 'noc24hphone', 'nocfax', + 'nochours', 'nocwww', 'irrdb', 'peeringmacro', 'peeringpolicy', 'maxprefixes', + 'billingContact', 'billingAddress1', 'billingAddress2', 'billingCity', 'billingCountry', + 'corpwww', 'datejoin', 'dateleave', 'activepeeringmatrix', 'notes' + ), + + 'viewPanelTitle' => 'name', + + 'id' => array( + 'label' => 'ID', + 'hidden' => true + ), + + + 'name' => array( + 'label' => 'Member', + 'sortable' => true, + 'searchable' => true, + 'search' => array( + 'type' => 'text', + 'beginsWith' => true + ) + ), + + 'type' => array( + 'label' => 'Type', + 'sortable' => false, + 'type' => 'xlate', + 'xlator' => Cust::$CUST_TYPES_TEXT + ), + + 'status' => array( + 'label' => 'Status', + 'sortable' => false, + 'type' => 'xlate', + 'xlator' => Cust::$CUST_STATUS_TEXT + ), + + 'shortname' => array( + 'label' => 'Short Name', + 'sortable' => true, + 'searchable' => true, + 'search' => array( + 'type' => 'text', + 'beginsWith' => true + ) + ), + + 'autsys' => array( + 'label' => 'AS', + 'sortable' => true, + 'searchable' => true, + 'search' => array( + 'type' => 'text', + 'beginsWith' => true + ) + ), + + 'peeringemail' => array( + 'label' => 'Peering E-Mail', + 'sortable' => false + ), + + 'nocphone' => array( + 'label' => 'NOC Phone' + ), + + 'noc24hphone' => array( + 'label' => 'NOC 24hr Phone' + ), + + 'nocemail' => array( + 'label' => 'NOC E-mail' + ), + + 'nocfax' => array( + 'label' => 'NOC Fax' + ), + + 'nochours' => array( + 'label' => 'NOC Hours' + ), + + 'nocwww' => array( + 'label' => 'NOC Website' + ), + + 'irrdb' => array( + 'type' => 'hasOne', + 'model' => 'Irrdbconfig', + 'controller' => 'irrdb-config', + 'field' => 'source', + 'label' => 'IRRDB', + 'sortable' => true + ), + + 'peeringmacro' => array( + 'label' => 'Peering Macro' + ), + + 'peeringpolicy' => array( + 'label' => 'Peering Policy' + ), + + 'maxprefixes' => array( + 'label' => 'Max Prefixes' + ), + + 'billingContact' => array( + 'label' => 'Billing Contact' + ), + + 'billingAddress1' => array( + 'label' => 'Billing Address 1' + ), + + 'billingAddress2' => array( + 'label' => 'Billing Address 2' + ), + + 'billingCity' => array( + 'label' => 'Billing City' + ), + + 'billingCountry' => array( + 'label' => 'Billing Country' + ), + + 'corpwww' => array( + 'label' => 'Corporate Website' + ), + + 'datejoin' => array( + 'label' => 'Date Joined' + ), + + 'dateleave' => array( + 'label' => 'Date Left' + ), + + 'activepeeringmatrix' => array( + 'label' => 'Active Peering Matrix' + ), + + 'notes' => array( + 'label' => 'Notes' + ) + + ); + + + // Override global auth level requirement for specific actions + $this->frontend['authLevels'] = array( + 'update-attribute' => User::AUTH_CUSTUSER + ); + + parent::feInit(); + } + + + /** + * Additional checks when a new object is being added. + */ + protected function formValidateForAdd( $form ) + { + + if( Doctrine::getTable( $this->getModelName() )->findOneByShortname( $form->getValue( 'shortname' ) ) ) + { + $form->getElement( 'shortname' )->addError( 'This short name is not available' ); + return false; + } + } + + + + /** + * A generic action to list the elements of a database (as represented + * by a Doctrine model) via Smarty templates. + */ + public function getDataAction() + { + $dataQuery = Doctrine_Query::create() + ->from( $this->getModelName() . ' x' ) + ->orderBy( 'x.shortname ASC' ); + + if( $this->getRequest()->getParam( 'member' ) !== NULL ) + $dataQuery->andWhere( 'x.name LIKE ?', $this->getRequest()->getParam( 'member' ) . '%' ); + + if( $this->getRequest()->getParam( 'shortname' ) !== NULL ) + $dataQuery->andWhere( 'x.shortname LIKE ?', $this->getRequest()->getParam( 'shortname' ) . '%' ); + + + $rows = $dataQuery->execute(); + + $count = 0; + $data = ''; + foreach( $rows as $row ) + { + if( $count > 0 ) + $data .= ','; + + $count++; + + $data .= <<getIdentity(); + $customer = Doctrine::getTable( 'Cust' )->find( $identity['user']['custid'] ); + + if( in_array( $this->getRequest()->getParam( 'attribute' ), $this->frontend['columns']['updatableColumns'] ) ) + { + try + { + $customer[$this->getRequest()->getParam( 'attribute' )] = stripslashes( trim( $this->getRequest()->getParam( 'newValue' ) ) ); + $customer->save(); + echo( '1:Member details sucessfully updated.' ); + } + catch( DoctrineException $e ) + { + echo( '0:Error updating member details. Please contact ' . $this->_config['identity']['email'] . '.' ); + } + } + else + { + $this->logger->alert( "{$identity['user']['username']} tried to alter " . $this->getRequest()->getParam( 'attribute' ) . " via updateAttributeAction" ); + echo( '0:Bad request. This action has been logged. Please contact ' . $this->_config['identity']['email'] . ' for assistance if necessary.' ); + } + + } + + + /** + * Send the member an operations welcome mail + * + */ + public function sendWelcomeEmailAction() + { + // Is the customer ID valid? + if( $this->getRequest()->getParam( 'id' ) !== NULL && is_numeric( $this->getRequest()->getParam( 'id' ) ) ) + { + if( !( $customer = Doctrine::getTable( 'Cust' )->find( $this->getRequest()->getParam( 'id' ) ) ) ) + { + $this->view->message = new INEX_Message( 'Invalid Member ID', "error" ); + return( $this->_forward( 'list' ) ); + } + + $this->view->customer = $customer; + } + else + { + $this->view->message = new INEX_Message( 'Invalid Member ID', "error" ); + return( $this->_forward( 'list' ) ); + } + + + $cancelLocation = 'http' . ( isset( $_SERVER['HTTPS'] ) ? 's' : '' ) . '://' + . $_SERVER['SERVER_NAME'] . Zend_Controller_Front::getInstance()->getBaseUrl() + . '/' . $this->getRequest()->getParam( 'controller' ) . '/list'; + + $form = new INEX_Form_Customer_SendWelcomeEmail( null, false, $cancelLocation ); + + $form->getElement( 'to' )->setValue( $customer['nocemail'] ); + + $userEmails = array(); + foreach( $customer['User'] as $user ) + { + if( Zend_Validate::is( $user['email'], 'EmailAddress' ) ) + $userEmails[] = $user['email']; + } + + $form->getElement( 'cc' )->setValue( implode( ',', $userEmails ) ); + + $form->getElement( 'bcc' )->setValue( $this->_config['identity']['email'] ); + $form->getElement( 'subject' )->setValue( $this->_config['identity']['name'] . ' :: Welcome Mail' ); + + // Let's get the information we need for the welcome mail from the database. + + $this->view->networkInfo = Networkinfo::toStructuredArray(); + + $this->view->connections = Doctrine_Query::create() + ->from( 'Virtualinterface vi' ) + ->leftJoin( 'vi.Cust c' ) + ->leftJoin( 'vi.Physicalinterface pi' ) + ->leftJoin( 'vi.Vlaninterface vli' ) + ->leftJoin( 'vli.Ipv4address v4' ) + ->leftJoin( 'vli.Ipv6address v6' ) + ->leftJoin( 'vli.Vlan v' ) + ->leftJoin( 'pi.Switchport sp' ) + ->leftJoin( 'sp.SwitchTable s' ) + ->leftJoin( 's.Cabinet cb' ) + ->leftJoin( 'cb.Location l' ) + ->where( 'c.id = ?', $customer['id'] ) + ->orderBy( 'pi.monitorindex' ) + ->execute() + ->toArray( true ); + + $this->logger->debug( print_r( $this->view->connections, true ) ); + + $form->getElement( 'message' )->setValue( $this->view->render( 'customer' . DIRECTORY_SEPARATOR . 'welcomeEmail.tpl' ) ); + + + // Process a submitted form if it passes initial validation + if( $this->inexGetPost( 'commit' ) !== null && $form->isValid( $_POST ) ) + { + $validForm = true; + // Validate all e-mail addresses + foreach( array( 'to', 'cc', 'bcc' ) as $recipient ) + { + if( $form->getValue( $recipient ) != '' ) + { + foreach( explode( ',', $form->getElement( $recipient )->getValue() ) as $email ) + { + if( !Zend_Validate::is( $email, 'EmailAddress' ) ) + { + $form->getElement( $recipient )->addError( 'Invalid e-mail address: ' . $email ); + $validForm = false; + } + } + } + } + + if( $validForm ) + { + $mail = new Zend_Mail(); + $mail->setBodyText( $form->getValue( 'message' ) ); + $mail->setFrom( $this->_config['identity']['email'], $this->_config['identity']['name'] ); + $mail->setSubject( $form->getValue( 'subject' ) ); + + foreach( array( 'To', 'Cc', 'Bcc' ) as $recipient ) + if( $form->getValue( strtolower( $recipient ) ) != '' ) + foreach( explode( ',', $form->getElement( strtolower( $recipient ) )->getValue() ) as $email ) + if( Zend_Validate::is( $email, 'EmailAddress' ) ) + { + $fn = "add$recipient"; + $mail->$fn( $email ); + } + + if( $mail->send() ) + { + $this->logger->info( "Welcome email sent for {$customer['name']}" ); + $this->view->message = new INEX_Message( "Welcome email successfully sent to {$customer['name']}", "success" ); + $this->_forward( 'list' ); + return true; + } + else + { + $this->logger->err( "Could not sent welcome email for {$customer['name']}: " . print_r( $mail, true ) ); + $this->view->message = new INEX_Message( "Welcome email could not be sent to {$customer['name']}. Please see logs for more verbose output.", "error" ); + } + + } + } + + $this->view->form = $form->render( $this->view ); + + $this->view->display( 'customer' . DIRECTORY_SEPARATOR . 'sendWelcomeEmail.tpl' ); + } + + + public function leagueTableAction() + { + $metrics = array( + 'Total' => 'data', + 'Max' => 'max', + 'Average' => 'average' + ); + + $metric = $this->_request->getParam( 'metric', $metrics['Data'] ); + if( !in_array( $metric, $metrics ) ) + $metric = $metrics['Data']; + + $day = $this->_request->getParam( 'day', date( 'Y-m-d' ) ); + if( !Zend_Date::isDate( $day, 'Y-m-d' ) ) + $day = date( 'Y-m-d' ); + + $category = $this->_request->getParam( 'category', INEX_Mrtg::$CATEGORIES['Bits'] ); + + if( !in_array( $category, INEX_Mrtg::$CATEGORIES ) ) + $category = INEX_Mrtg::$CATEGORIES['Bits']; + + // load values from the database + $this->view->trafficDaily = Doctrine_Query::create() + ->from( 'TrafficDaily td' ) + ->where( 'day = ?', $day ) + ->andWhere( 'category = ?', $category ) + ->execute(); + + $this->view->day = $day; + $this->view->category = $category; + $this->view->categories = INEX_Mrtg::$CATEGORIES; + $this->view->metric = $metric; + $this->view->metrics = $metrics; + $this->view->display( 'customer' . DIRECTORY_SEPARATOR . 'leagueTable.tpl' ); + } + + public function ninetyFifthAction() + { + $month = $this->_request->getParam( 'month', date( 'Y-m-01' ) ); + + $cost = $this->_request->getParam( 'cost', "20.00" ); + if( !is_numeric( $cost ) ) + $cost = "20.00"; + $this->view->cost = $cost; + + $months = array(); + for( $year = 2010; $year <= date( 'Y' ); $year++ ) + for( $mth = ( $year == 2010 ? 4 : 1 ); $mth <= ( $year == 2010 ? date('n') : 12 ); $mth++ ) + { + $ts = mktime( 0, 0, 0, $mth, 1, $year ); + $months[date( 'M Y', $ts )] = date( 'Y-m-01', $ts ); + } + + $this->view->months = $months; + + if( in_array( $month, array_values( $months ) ) ) + $this->view->month = $month; + else + $this->view->month = date( 'Y-m-01' ); + + // load values from the database + $traffic95thMonthly = Doctrine_Query::create() + ->from( 'Traffic95thMonthly tf' ) + ->leftJoin( 'tf.Cust c' ) + ->where( 'month = ?', $month ) + ->execute() + ->toArray(); + + foreach( $traffic95thMonthly as $index => $row ) + $traffic95thMonthly[$index]['cost'] = sprintf( "%0.2f", $row['max_95th'] / 1024 / 1024 * $cost ); + + $this->view->traffic95thMonthly = $traffic95thMonthly; + + $this->view->display( 'customer' . DIRECTORY_SEPARATOR . 'ninety-fifth.tpl' ); + } + + public function statisticsOverviewAction() + { + $category = $this->_request->getParam( 'category', INEX_Mrtg::$CATEGORIES['Bits'] ); + + if( !in_array( $category, INEX_Mrtg::$CATEGORIES ) ) + $category = INEX_Mrtg::$CATEGORIES['Bits']; + + $period = $this->_request->getParam( 'period', INEX_Mrtg::$PERIODS['Day'] ); + + if( !in_array( $period, INEX_Mrtg::$PERIODS ) ) + $period = INEX_Mrtg::$PERIODS['Day']; + + $this->view->custs = Doctrine_Query::create() + ->select( 'c.shortname' ) + ->addSelect( 'c.name' ) + ->from( 'Cust c' ) + ->whereIn( 'c.type', array( Cust::TYPE_FULL, Cust::TYPE_INTERNAL, Cust::TYPE_PROBONO ) ) + ->andWhere( 'c.status = ?', array( Cust::STATUS_NORMAL ) ) + ->andWhere( 'c.dateleave = 0 or c.dateleave IS NULL' ) + ->andWhereIn( 'c.shortname', array( 'inex', 'routeservers' ), true ) + ->orderBy( 'c.name' ) + ->fetchArray(); + + $this->view->category = $category; + $this->view->categories = INEX_Mrtg::$CATEGORIES; + $this->view->period = $period; + $this->view->periods = INEX_Mrtg::$PERIODS; + $this->view->display( 'customer' . DIRECTORY_SEPARATOR . 'statistics-overview.tpl' ); + } + + public function statisticsByLanAction() + { + $category = $this->_request->getParam( 'category', INEX_Mrtg::$CATEGORIES['Bits'] ); + + if( !in_array( $category, INEX_Mrtg::$CATEGORIES ) ) + $category = INEX_Mrtg::$CATEGORIES['Bits']; + + $period = $this->_request->getParam( 'period', INEX_Mrtg::$PERIODS['Day'] ); + + if( !in_array( $period, INEX_Mrtg::$PERIODS ) ) + $period = INEX_Mrtg::$PERIODS['Day']; + + $lanTag = $this->_request->getParam( 'lan', 10 ); + + $lan = Doctrine_Core::getTable( 'Vlan' )->findOneByNumber( $lanTag ); + + if( !$lan ) + $lan = Doctrine_Core::getTable( 'Vlan' )->findOneByNumber( 10 ); + + $this->view->lan = $lan; + + $this->view->ints = Doctrine_Query::create() + ->from( 'Vlaninterface vl' ) + ->leftJoin( 'vl.Virtualinterface vi' ) + ->leftJoin( 'vi.Cust c' ) + ->leftJoin( 'vi.Physicalinterface pi' ) + ->leftJoin( 'pi.Switchport sp' ) + ->leftJoin( 'sp.SwitchTable s' ) + ->whereIn( 'c.type', array( Cust::TYPE_FULL, Cust::TYPE_INTERNAL, Cust::TYPE_PROBONO ) ) + ->andWhere( 'c.status = ?', array( Cust::STATUS_NORMAL ) ) + ->andWhere( 'c.dateleave = 0 or c.dateleave IS NULL' ) + ->andWhere( 'vl.vlanid = ?', $lan['id'] ) + ->andWhereIn( 'c.shortname', array( 'inex', 'routeservers' ), true ) + ->orderBy( 'c.name' ) + ->fetchArray(); + + $this->view->category = $category; + $this->view->categories = INEX_Mrtg::$CATEGORIES; + $this->view->period = $period; + $this->view->periods = INEX_Mrtg::$PERIODS; + $this->view->display( 'customer' . DIRECTORY_SEPARATOR . 'statistics-by-lan.tpl' ); + } + + public function statisticsListAction() + { + $this->view->custs = Doctrine_Query::create() + ->select( 'c.shortname' ) + ->addSelect( 'c.name' ) + ->from( 'Cust c' ) + ->whereIn( 'c.type', array( Cust::TYPE_FULL, Cust::TYPE_INTERNAL, Cust::TYPE_PROBONO ) ) + ->andWhere( 'c.status = ?', array( Cust::STATUS_NORMAL ) ) + ->andWhere( 'c.dateleave = 0 or c.dateleave IS NULL' ) + ->andWhereIn( 'c.shortname', array( 'inex', 'routeservers' ), true ) + ->orderBy( 'c.name' ) + ->fetchArray(); + + $this->view->display( 'customer' . DIRECTORY_SEPARATOR . 'statistics-list.tpl' ); + } + + +} + +?> \ No newline at end of file diff --git a/application/controllers/DashboardController.php b/application/controllers/DashboardController.php new file mode 100644 index 000000000..c101b6064 --- /dev/null +++ b/application/controllers/DashboardController.php @@ -0,0 +1,1009 @@ +hasIdentity() ) + { + // record the page we wanted + $this->session->postAuthRedirect = $this->_request->getPathInfo(); + $this->_redirect( 'auth/login' ); + } + else + { + $this->_identity = $auth->getIdentity(); + $this->_customer = Doctrine::getTable( 'Cust' )->find( $this->_identity['user']['custid'] ); + + $this->view->customer = $this->_customer; + } + } + + /** + * Return a Doctrine result of the users IXP connections. + */ + private function _getConnections( $cust = null ) + { + if( $cust === null ) + $cust = $this->_customer; + + return Doctrine_Query::create() + ->from( 'Virtualinterface vi' ) + ->leftJoin( 'vi.Cust c' ) + ->leftJoin( 'vi.Physicalinterface pi' ) + ->leftJoin( 'vi.Vlaninterface vli' ) + ->leftJoin( 'vli.Ipv4address v4' ) + ->leftJoin( 'vli.Ipv6address v6' ) + ->leftJoin( 'vli.Vlan v' ) + ->leftJoin( 'pi.Switchport sp' ) + ->leftJoin( 'sp.SwitchTable s' ) + ->leftJoin( 's.Cabinet cb' ) + ->leftJoin( 'cb.Location l' ) + ->where( 'c.id = ?', $cust['id'] ) + ->orderBy( 'pi.monitorindex' ) + ->execute(); + } + + /** + * Return a Doctrine result of a customer. + */ + private function _getCustomerByShortname( $shortname = null ) + { + if( $shortname === null || $shortname == $this->_customer->shortname ) + return $this->_customer; + + if( $cust = Doctrine::getTable( 'Cust' )->findOneByShortname( $shortname ) ) + return $cust; + + return $this->_customer; + } + + public function indexAction() + { + // Get the three most recent members + $this->view->recentMembers = Doctrine_Query::create() + ->from( 'Cust c' ) + ->where( 'c.type != ?', Cust::TYPE_ASSOCIATE ) + ->orderBy( 'c.datejoin DESC' ) + ->limit( 3 ) + ->execute() + ->toArray(); + + // is there a meeting available to register for? + $this->view->meeting = false; + + if( ( $meeting = MeetingTable::getUpcomingMeeting() ) !== false + && ( !isset( $this->session->dashboard_skip_meeting ) || !$this->session->dashboard_skip_meeting ) + ) + { + $rsvp = $this->getUser()->hasPreference( 'meeting.attending.' . $meeting['id'] ); + + if( $rsvp === false ) + { + $this->view->meeting = $meeting; + $this->view->meeting_pref = $rsvp; + } + } + + + $this->view->recentMembers = Doctrine_Query::create() + ->from( 'Cust c' ) + ->where( 'c.type != ?', Cust::TYPE_ASSOCIATE ) + ->orderBy( 'c.datejoin DESC' ) + ->limit( 3 ) + ->execute() + ->toArray(); + + + if( $this->customer->isFullMember() ) + { + // Get peering stats as set by the member + $this->_generateOrUpdateMyPeeringMatrix(); + $peering_stats = array(); + foreach( $this->config['peering_matrix']['public'] as $v ) + $peering_stats[$v['name']] = MyPeeringMatrixTable::getStatesTotal( $this->customer['id'], $v['number'] ); + + $peering_stats['Total'] = MyPeeringMatrixTable::getStatesTotal( $this->customer['id'] ); + $this->view->peering_stats = $peering_stats; + + // Get the member's port and vlan details + $this->view->networkInfo = Networkinfo::toStructuredArray(); + $this->view->connections = $this->customer->getConnections(); + + $this->view->categories = INEX_Mrtg::$CATEGORIES; + + $this->view->rsEnabled = $this->customer->isRouteServerClient( $this->config['primary_peering_lan']['vlan_tag'] ); + $this->view->as112Enabled = $this->customer->isAS112Client(); + } + + $this->view->display( 'dashboard' . DIRECTORY_SEPARATOR . 'index.tpl' ); + } + + + public function switchConfigurationAction() + { + $q = Doctrine_Query::create() + ->from( 'ViewCustCurrentActive vca' ) + ->leftJoin( 'vca.ViewSwitchDetailsByCustid vsd' ) + ->leftJoin( 'vsd.ViewVlaninterfaceDetailsByCustid vvid' ) + ->whereIn( 'vca.type', array( Cust::TYPE_FULL, Cust::TYPE_INTERNAL, Cust::TYPE_PROBONO ) ) + ->groupBy( 'vvid.virtualinterfaceid' ) + ->orderBy( 'name' ); + + $this->view->vlans = Doctrine::getTable( 'Vlan' )->findAll(); + + if( ( $vlan = (int)$this->getRequest()->getParam( 'vlan', null ) ) != null ) + { + if( is_integer( $vlan ) && Doctrine::getTable( 'Vlan' )->findByNumber( $vlan ) ) + { + $q->andWhere( 'vvid.vlan = ?', $vlan ); + $this->view->vlannum = $vlan; + } + } + + $this->view->swconf = $q->execute(); + + $this->view->display( 'dashboard' . DIRECTORY_SEPARATOR . 'switch-configuration.tpl' ); + } + + + public function membersDetailsListAction() + { + $this->view->memberDetails = Doctrine_Query::create() + ->from( 'ViewCustCurrentActive vca' ) + ->leftJoin( 'vca.ViewVlaninterfaceDetailsByCustid vvid' ) + ->whereIn( 'vca.type', array( Cust::TYPE_FULL, Cust::TYPE_INTERNAL, Cust::TYPE_PROBONO ) ) + ->groupBy( 'vvid.virtualinterfaceid' ) + ->orderBy( 'name' ) + ->execute(); + + #echo '
';
+        #print_r( $q->execute()->toArray(true) );
+        #die();
+
+        $this->view->display( 'dashboard' . DIRECTORY_SEPARATOR . 'members-details-list.tpl' );
+    }
+
+    public function memberDetailsAction()
+    {
+        if( ( $custid = $this->getRequest()->getParam( 'id', null ) ) === null
+            || !( $this->view->cust = Doctrine::getTable( 'Cust' )->find( (int)$custid ) ) )
+        {
+            $this->_forward( 'members-details-list' );
+            return;
+        }
+
+        // Let's get the information we need for the welcome mail from the database.
+
+        $this->view->networkInfo = Networkinfo::toStructuredArray();
+
+        $this->view->connections = Doctrine_Query::create()
+            ->from( 'Virtualinterface vi' )
+            ->leftJoin( 'vi.Cust c' )
+            ->leftJoin( 'vi.Physicalinterface pi' )
+            ->leftJoin( 'vi.Vlaninterface vli' )
+            ->leftJoin( 'vli.Ipv4address v4' )
+            ->leftJoin( 'vli.Ipv6address v6' )
+            ->leftJoin( 'vli.Vlan v' )
+            ->leftJoin( 'pi.Switchport sp' )
+            ->leftJoin( 'sp.SwitchTable s' )
+            ->leftJoin( 's.Cabinet cb' )
+            ->leftJoin( 'cb.Location l' )
+            ->where( 'c.id = ?', (int)$custid )
+            ->orderBy( 'pi.monitorindex' )
+            ->execute()
+            ->toArray( true );
+
+        $this->view->display( 'dashboard' . DIRECTORY_SEPARATOR . 'member-details.tpl' );
+    }
+
+    public function statisticsAction()
+    {
+        if( $this->user['privs'] < User::AUTH_SUPERUSER )
+            $shortname = $this->customer['shortname'];
+        else
+            $shortname = $this->getRequest()->getParam( 'shortname', $this->customer['shortname'] );
+
+        $cust = $this->_getCustomerByShortname( $shortname );
+
+        // get the connections
+        $this->view->connections = $this->_getConnections( $cust );
+
+        // is there a category selected?
+        $category = $this->getRequest()->getParam( 'category', false );
+        if( $category === false )
+            $this->view->category = INEX_Mrtg::$CATEGORIES['Bits'];
+        else if( !in_array( $category, INEX_Mrtg::$CATEGORIES ) )
+            $this->view->category = INEX_Mrtg::$CATEGORIES['Bits'];
+        else
+            $this->view->category = $category;
+
+        $this->view->categories = INEX_Mrtg::$CATEGORIES;
+        $this->view->shortname = $shortname;
+
+        $this->view->customer = $cust;
+
+        $this->view->display( 'dashboard' . DIRECTORY_SEPARATOR . 'statistics.tpl' );
+    }
+
+
+    public function statisticsDrilldownAction()
+    {
+        // is there a category selected?
+        $category = $this->getRequest()->getParam( 'category', INEX_Mrtg::$CATEGORIES['Bits'] );
+        if( !in_array( $category, INEX_Mrtg::$CATEGORIES ) )
+            $this->view->category = INEX_Mrtg::$CATEGORIES['Bits'];
+        else
+            $this->view->category = $category;
+
+        // monitorindex and member shortname is checked by the MrtgController so no need for it here
+        $monitorindex = $this->getRequest()->getParam( 'monitorindex', 1 );
+        if( $this->user['privs'] < User::AUTH_SUPERUSER )
+            $shortname = $this->customer['shortname'];
+        else
+            $shortname = $this->getRequest()->getParam( 'shortname', $this->customer['shortname'] );
+
+        $cust = $this->_getCustomerByShortname( $shortname );
+
+        if( $monitorindex != 'aggregate' )
+        {
+	        $interface = Doctrine_Query::create()
+	            ->from( 'Virtualinterface vi' )
+	            ->leftJoin( 'vi.Physicalinterface pi' )
+	            ->leftJoin( 'pi.Switchport sp' )
+	            ->leftJoin( 'sp.SwitchTable s' )
+	            ->where( 'vi.custid = ?', $cust['id'] )
+	            ->andWhere( 'pi.monitorindex = ?', $monitorindex )
+	            ->limit( 1 )
+	            ->fetchOne( null, Doctrine_Core::HYDRATE_ARRAY );
+
+            $this->view->switchname = $interface['Physicalinterface'][0]['Switchport']['SwitchTable']['name'];
+            $this->view->portname   = $interface['Physicalinterface'][0]['Switchport']['name'];
+        }
+        else
+        {
+            $this->view->switchname = '';
+            $this->view->portname   = '';
+        }
+
+        $this->view->periods      = INEX_Mrtg::$PERIODS;
+        $this->view->categories   = INEX_Mrtg::$CATEGORIES;
+        $this->view->monitorindex = $monitorindex;
+
+        $stats = array();
+        foreach( INEX_Mrtg::$PERIODS as $period )
+        {
+            $mrtg = new INEX_Mrtg( INEX_Mrtg::getMrtgFilePath( $this->config['mrtg']['path'],
+                    'LOG', $this->view->monitorindex, $this->view->category,
+                    $cust->shortname )
+            );
+
+            $stats[$period] = $mrtg->getValues( $period, $this->view->category );
+        }
+
+        $this->view->customer  = $cust;
+        $this->view->shortname = $shortname;
+        $this->view->stats     = $stats;
+
+        if( $this->_request->getParam( 'mini', 0 ) == '1' )
+        {
+            if( $this->config->resources.zfdebug.enabled )
+            {
+	            $this->getFrontController()->unregisterPlugin(
+	                $this->_bootstrap->getResource( 'zfdebug' )
+	            );
+            }
+            $this->view->display( 'dashboard' . DIRECTORY_SEPARATOR . 'statistics-drilldown-mini.tpl' );
+        }
+        else
+            $this->view->display( 'dashboard' . DIRECTORY_SEPARATOR . 'statistics-drilldown.tpl' );
+    }
+
+
+    public function trafficStatsAction()
+    {
+        // get the available graphs
+        foreach( $this->config['mrtg']['traffic_graphs'] as $g )
+        {
+            $p = explode( '::', $g );
+            $graphs[$p[0]] = $p[1];
+            $images[]      = $p[0];
+        }
+
+        $graph = $this->_request->getParam( 'graph', $images[0] );
+        if( !in_array( $graph, $images ) )
+            $graph = $images[0];
+
+        // is there a category selected?
+        $category = $this->getRequest()->getParam( 'category', INEX_Mrtg::CATEGORY_BITS );
+        if( !in_array( $category, INEX_Mrtg::$CATEGORIES_AGGREGATE ) )
+            $this->view->category = INEX_Mrtg::CATEGORY_BITS;
+        else
+            $this->view->category = $category;
+
+        $stats = array();
+        foreach( INEX_Mrtg::$PERIODS as $period )
+        {
+            $mrtg = new INEX_Mrtg(
+                $this->config['mrtg']['path']
+                    . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR
+                    . 'inex_peering-' . $graph . '-' . $category . '.log'
+            );
+
+            $stats[$period] = $mrtg->getValues( $period, $category );
+        }
+
+        $this->view->graphs     = $graphs;
+        $this->view->periods    = INEX_Mrtg::$PERIODS;
+        $this->view->categories = INEX_Mrtg::$CATEGORIES_AGGREGATE;
+        $this->view->graph      = $graph;
+        $this->view->stats      = $stats;
+
+        $this->view->display( 'dashboard' . DIRECTORY_SEPARATOR . 'statistics-peering-graphs.tpl' );
+    }
+
+
+    public function trunkGraphsAction()
+    {
+        // get the available graphs
+        foreach( $this->config['mrtg']['trunk_graphs'] as $g )
+        {
+            $p = explode( '::', $g );
+            $graphs[$p[0]] = $p[1];
+            $images[]      = $p[0];
+        }
+
+        $graph = $this->_request->getParam( 'trunk', $images[0] );
+        if( !in_array( $graph, $images ) )
+            $graph = $images[0];
+
+        $stats = array();
+        foreach( INEX_Mrtg::$PERIODS as $period )
+        {
+            $mrtg = new INEX_Mrtg(
+                $this->config['mrtg']['path']
+                    . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR
+                    . 'trunks' . DIRECTORY_SEPARATOR . $graph . '.log'
+            );
+
+            $stats[$period] = $mrtg->getValues( $period, INEX_Mrtg::CATEGORY_BITS );
+        }
+
+        $this->view->graphs  = $graphs;
+        $this->view->periods = INEX_Mrtg::$PERIODS;
+        $this->view->graph   = $graph;
+        $this->view->stats   = $stats;
+
+        $this->view->display( 'dashboard' . DIRECTORY_SEPARATOR . 'statistics-trunk-graphs.tpl' );
+    }
+
+
+    public function switchGraphsAction()
+    {
+        // get the available graphs
+        $_switches = Doctrine_Query::create()
+            ->select( 'sw.name' )
+            ->addSelect( 'sw.model' )
+            ->addSelect( 'l.name AS location' )
+            ->from( 'Switchtable sw' )
+            ->leftJoin( 'sw.Cabinet c' )
+            ->leftJoin( 'c.Location l' )
+            ->where( 'sw.active = 1' )
+            ->andWhere( 'sw.switchtype = ?', SwitchTable::SWITCHTYPE_SWITCH )
+            ->orderBy( 'l.name, sw.name' )
+            ->fetchArray();
+
+        foreach( $_switches as $s )
+            $switches[$s['id']] = $s;
+
+        $switch = $this->_request->getParam( 'switch', $_switches[0]['id'] );
+        if( !in_array( $switch, array_keys( $switches ) ) )
+            $switch = $_switches[0]['id'];
+
+        // is there a category selected?
+        $category = $this->getRequest()->getParam( 'category', INEX_Mrtg::CATEGORY_BITS );
+        if( !in_array( $category, INEX_Mrtg::$CATEGORIES_AGGREGATE ) )
+            $this->view->category = INEX_Mrtg::CATEGORY_BITS;
+        else
+            $this->view->category = $category;
+
+        $stats = array();
+        foreach( INEX_Mrtg::$PERIODS as $period )
+        {
+            $mrtg = new INEX_Mrtg(
+                $this->config['mrtg']['path']
+                    . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR
+                    . 'switches' . DIRECTORY_SEPARATOR . 'switch-aggregate-'
+                    . $switches[$switch]['name'] . '-' . $category . '.log'
+            );
+
+            $stats[$period] = $mrtg->getValues( $period, $category );
+        }
+
+        $this->view->switches   = $switches;
+        $this->view->periods    = INEX_Mrtg::$PERIODS;
+        $this->view->switch     = $switch;
+        $this->view->stats      = $stats;
+        $this->view->categories = INEX_Mrtg::$CATEGORIES_AGGREGATE;
+
+        $this->view->display( 'dashboard' . DIRECTORY_SEPARATOR . 'statistics-switch-graphs.tpl' );
+    }
+
+
+
+    public function rsInfoAction()
+    {
+        $this->view->rsEnabled = $this->customer->isRouteServerClient(  $this->config['primary_peering_lan']['vlan_tag'] );
+
+        $this->view->display( 'dashboard' . DIRECTORY_SEPARATOR . 'rs-info.tpl' );
+    }
+
+    public function enableRouteServerAction()
+    {
+        foreach( $this->customer->getConnections() as $connection )
+            foreach( $connection->Vlaninterface as $interface )
+            {
+                $interface['rsclient'] = 1;
+	            $interface->save();
+            }
+
+        $this->logger->notice( "{$this->user->username} of {$this->customer->shortname} enabled route server sessions" );
+        $this->view->rsSessionsEnabled = true;
+        $this->_forward( 'rs-info' );
+    }
+
+    public function as112Action()
+    {
+        if( $this->_request->getParam( 'enable', 0 ) )
+        {
+	        foreach( $this->customer->getConnections() as $connection )
+	            foreach( $connection->Vlaninterface as $interface )
+	            {
+	                $interface['as112client'] = 1;
+	                $interface->save();
+	            }
+	        $this->view->as112JustEnabled = true;
+        }
+
+        $this->view->as112Enabled = $this->customer->isAS112Client();
+        $this->view->rsEnabled    = $this->customer->isRouteServerClient( $this->config['primary_peering_lan']['vlan_tag'] );
+
+        $this->view->display( 'dashboard' . DIRECTORY_SEPARATOR . 'as112.tpl' );
+    }
+
+    public function staticAction()
+    {
+        $page = $this->_request->getParam( 'page', null );
+
+        if( $page == null )
+            return( $this->_redirect( 'dashboard/index' ) );
+
+        // does the requested static page exist? And if so, display it
+        if( preg_match( '/^[a-zA-Z0-9\-]+$/', $page ) > 0
+                && file_exists( APPLICATION_PATH . "/views/dashboard/static/{$page}.tpl" ) )
+        {
+            $this->view->display( "dashboard/static/{$page}.tpl" );
+        }
+        else
+        {
+            $this->view->message = new INEX_Message(
+                "The requested page was not found.",
+                INEX_Message::MESSAGE_TYPE_ERROR
+            );
+            $this->_forward( 'index' );
+        }
+    }
+
+
+    public function peeringMatrixAction()
+    {
+        $lan = $this->_request->getParam( 'lan', 0 );
+
+        if( !isset( $this->config['peering_matrix']['public'][$lan] ) )
+        {
+            $this->session->message = new INEX_Message(
+                            "Invalid peering matrix requested",
+                            INEX_Message::MESSAGE_TYPE_ERROR
+                        );
+
+            return( $this->_redirect( 'dashboard' ) );
+        }
+
+        $peering_states = Doctrine_Query::create()
+            ->select( 'pm.x_as, pm.y_as, pm.peering_status' )
+            ->addSelect( 'xc.name, xc.id, xc.peeringmacro, xc.peeringpolicy' )
+            ->addSelect( 'yc.name, yc.id, yc.peeringmacro, yc.peeringpolicy' )
+            ->from( 'PeeringMatrix pm' )
+            ->leftJoin( 'pm.X_Cust xc' )
+            ->leftJoin( 'pm.Y_Cust yc' )
+            ->where( 'pm.vlan = ?', $this->config['peering_matrix']['public'][$lan]['number'] )
+            ->orderBy( 'pm.x_as ASC, pm.y_as ASC' )
+            ->fetchArray();
+
+        // try and arrange the array as n x n keyed by x's as number
+        $matrix = array();
+
+        $potential = 0;
+        $active    = 0;
+
+        foreach( $peering_states as $pm )
+        {
+            $matrix[$pm['x_as']][] = $pm;
+
+            if( $pm['peering_status'] == 'YES' )
+                $active++;
+
+            $potential++;
+        }
+
+        $this->view->potential = $potential;
+        $this->view->active    = $active;
+
+        $this->view->lan    = $lan;
+        $this->view->matrix = $matrix;
+        $this->view->display( 'dashboard/peering-matrix.tpl' );
+    }
+
+    /**
+     * Generates or updates the users My Peering Matrix table
+     *
+     * @param bool $force Force the update even if it's already been done this session
+     */
+    private function _generateOrUpdateMyPeeringMatrix( $force = false)
+    {
+        // we're only going to do the following once per session unless told otherwise
+        if( !isset( $this->session->myPeeringMatrixChecked ) )
+            $this->session->myPeeringMatrixChecked = false;
+
+        if( !$force && $this->session->myPeeringMatrixChecked )
+            return;
+
+        MyPeeringMatrixTable::generateOrUpdateMyPeeringMatrix( $this->customer['id'] );
+
+        $this->session->myPeeringMatrixChecked = true;
+    }
+
+    public function myPeeringMatrixAction()
+    {
+        // are we downloading in a non-html format?
+        $dl_as = $this->_getParam( 'as', false );
+
+        // do we have a VLAN and is it valid
+        $vlan = $this->_request->getParam( 'vlan', $this->config['peering_matrix']['public'][0]['number'] );
+
+        // is it one of the allowed VLANs?
+        $vlan_valid = false;
+        foreach( $this->config['peering_matrix']['public'] as $v )
+        {
+            if( $v['number'] == $vlan )
+            {
+                $vlan_valid = true;
+                break;
+            }
+        }
+
+        // if it's not valid, just bounce them to the first default
+        if( !$vlan_valid )
+            $vlan = $this->config['peering_matrix']['public'][0]['number'];
+
+        $this->view->vlans    = $this->config['peering_matrix']['public'];
+        $this->view->vlan     = $vlan;
+
+        // update the my peering table
+        $this->_generateOrUpdateMyPeeringMatrix();
+
+        $matrix = Doctrine_Query::create()
+            ->from( 'PeeringMatrix pm' )
+            ->leftJoin( 'pm.X_Cust xc' )
+            ->leftJoin( 'pm.Y_Cust yc' )
+            ->leftJoin( 'pm.MyPeeringMatrix mpm' )
+            ->leftJoin( 'mpm.MyPeeringMatrixNotes mpmn' )
+            ->where( 'pm.x_custid = ?', $this->customer['id'] )
+            ->andWhere( 'pm.vlan = ?', $vlan )
+            ->andWhere( 'mpm.vlan = ?', $vlan )
+            ->andWhere( 'pm.y_custid = mpm.peerid')
+            ->orderBy( 'pm.y_as ASC' )
+            ->fetchArray();
+
+        $this->view->matrix = $matrix;
+
+        $this->view->ipv6     = ViewVlaninterfaceDetailsByCustidTable::getIPv6EnabledPerVLAN( $vlan );
+        $this->view->rsclient = ViewVlaninterfaceDetailsByCustidTable::getRSClientEnabledPerVLAN( $vlan );
+
+        if( $dl_as )
+        {
+            switch( $dl_as )
+            {
+                case 'ascii':
+                    header( "Content-type: text/plain" );
+                    header( 'Content-Disposition: filename="my-peering-matrix.txt"' );
+                    $content = $this->view->render( 'dashboard/my-peering-matrix/ascii.tpl' );
+                    break;
+
+                case 'php':
+                    header( "Content-type: text/plain" );
+                    header( 'Content-Disposition: filename="my-peering-matrix.inc"' );
+                    $content = $this->view->render( 'dashboard/my-peering-matrix/php.tpl' );
+                    break;
+
+                    case 'csv':
+                default:
+                    header( "Content-type: text/csv" );
+                    header( 'Content-Disposition: filename="my-peering-matrix.csv"' );
+                    $content = $this->view->render( 'dashboard/my-peering-matrix/csv.tpl' );
+                    break;
+            }
+
+            header( "Content-length: " . strlen( $content ) );
+            header( "Cache-control: private");
+            echo $content;
+            return;
+        }
+
+
+        if( $this->_request->getParam( 'email', false ) )
+            $this->view->email = $this->_request->getParam( 'email', false );
+
+        // if we haven't been here before, show the instructions
+        if( !$this->user->hasPreference( 'dashboard.my_peering_matrix.first_visit' ) )
+        {
+            $this->user->setPreference( 'dashboard.my_peering_matrix.first_visit', mktime() );
+            $this->view->showInstructions = true;
+        }
+
+        $this->view->display( 'dashboard/my-peering-matrix.tpl' );
+    }
+
+    public function myPeeringMatrixEmailAction()
+    {
+        $bcust = Doctrine_Core::getTable( 'Cust' )->find( $this->_request->getParam( 'id', null ) );
+
+        $this->getResponse()
+            ->setHeader('Content-Type', 'text/html');
+
+        if( !$bcust && $this->_request->getParam( 'send' ) == '1' )
+        {
+            $this->getResponse()
+                 ->setBody( Zend_Json::encode(
+                    array(
+                        'status' => '0',
+                        'message' => "Error: Invalid parameters supplied"
+                  ) ) )
+            ->sendResponse();
+            exit;
+        }
+        else if( !$bcust )
+        {
+            echo '';
+            exit;
+        }
+
+        // need to get VLAN interfaces in common for these two members
+        $aints = Doctrine_Core::getTable( 'ViewVlaninterfaceDetailsByCustid' )->findByCustid(
+            $this->customer['id'], Doctrine_Core::HYDRATE_ARRAY
+        );
+        $bints = Doctrine_Core::getTable( 'ViewVlaninterfaceDetailsByCustid' )->findByCustid(
+            $bcust['id'], Doctrine_Core::HYDRATE_ARRAY
+        );
+
+        // potential peerings
+        $pp = array();
+        $count = 0;
+        foreach( $aints as $aint )
+        {
+            // does b member have one (or more than one)?
+            foreach( $bints as $bint )
+            {
+                if( $aint['vlanid'] == $bint['vlanid'] )
+                {
+                    $pp[$count]['a'] = $aint;
+                    $pp[$count]['b'] = $bint;
+                    $count++;
+                }
+            }
+        }
+
+        $this->view->bcust  = $bcust;
+        $this->view->pp     = $pp;
+
+        if( $this->_request->getParam( 'send' ) == '1' )
+        {
+            $mail = new Zend_Mail();
+            $mail->setFrom( $this->customer['peeringemail'], $this->customer['peeringemail'] . ' Peering Team' )
+                 ->setSubject( stripslashes( $this->_request->getParam( 'subject' ) ) )
+                 ->addTo( $bcust['peeringemail'], $bcust['name'] . ' Peering Team' )
+                 ->addBcc( $this->customer['peeringemail'], $this->customer['peeringemail'] . ' Peering Team' )
+                 ->setBodyText( stripslashes( $this->_request->getParam( 'message' ) ) );
+
+            try {
+                $mail->send();
+
+                $myPeerRecord = Doctrine_Query::create()
+                    ->from( 'MyPeeringMatrix mpm' )
+                    ->where( 'mpm.custid = ?', $this->customer['id'] )
+                    ->andWhere( 'mpm.peerid = ?', $bcust['id'] )
+                    ->fetchOne( null, Doctrine_core::HYDRATE_RECORD );
+
+                $myPeerRecord->updateNotes( date( 'Y-m-d ' ) . $this->user['username']
+                        . ": Peering request sent by email via IXP Manager",
+                    true
+                );
+
+                $this->getResponse()
+                    ->setBody( Zend_Json::encode(
+                        array(
+                            'status' => '1',
+                            'message' => "Email successfully sent to the {$bcust['name']} Peering Team",
+                            'commentAdded' => '1', 'cid' => $bcust['id']
+                        ) ) )
+                    ->sendResponse();
+            }
+            catch( Zend_Exception $e )
+            {
+                $this->logger->err( $e->getMessage() . "\n\n" . $e->getTraceAsString() );
+
+                $this->getResponse()
+                    ->setBody( Zend_Json::encode(
+                        array(
+                            'status' => '0',
+                            'message' => "Error: Sorry, we could not send the email. Please try later or send manually."
+                        ) ) )
+                    ->sendResponse();
+            }
+
+
+        }
+        else
+        {
+
+            $content = array(
+                'subject' => $this->_config['identity']['orgname'] . " Peering Request between AS" . $this->customer['autsys']
+                                . ' - AS' . $bcust['autsys'],
+                'to'      => $bcust['name'] . " Peering Team <" . $bcust['peeringemail'] . ">",
+                'from'    => $this->customer['name'] . " Peering Team <" . $this->customer['peeringemail'] . ">",
+                'bcc'     => $this->customer['name'] . " Peering Team <" . $this->customer['peeringemail'] . ">",
+                'message' => $this->view->render( 'dashboard/email/peering-request.tpl' )
+            );
+
+            $this->getResponse()
+                ->setHeader('Content-Type', 'text/html')
+                ->setBody( Zend_Json::encode( $content ) )
+                ->sendResponse();
+        }
+
+        exit();
+    }
+
+
+    public function myPeeringMatrixNotesAction()
+    {
+        $bcust = Doctrine_Core::getTable( 'Cust' )->find( $this->_request->getParam( 'id', null ) );
+
+        $this->getResponse()
+            ->setHeader('Content-Type', 'text/html');
+
+        if( !$bcust && $this->_request->getParam( 'save' ) == '1' )
+        {
+            $this->getResponse()
+                 ->setBody( Zend_Json::encode(
+                    array(
+                        'status' => '0',
+                        'message' => "Error: Invalid parameters supplied"
+                  ) ) )
+            ->sendResponse();
+            exit;
+        }
+        else if( !$bcust )
+        {
+            echo '';
+            exit;
+        }
+
+        $myPeerRecord = Doctrine_Query::create()
+            ->from( 'MyPeeringMatrix mpm' )
+            ->where( 'mpm.custid = ?', $this->customer['id'] )
+            ->andWhere( 'mpm.peerid = ?', $bcust['id'] )
+            ->fetchOne( null, Doctrine_core::HYDRATE_RECORD );
+
+        if( $this->_request->getParam( 'save' ) == '1' )
+        {
+            try
+            {
+                $myPeerRecord->updateNotes( stripslashes( $this->_request->getParam( 'notes' ) ) );
+                $this->getResponse()
+                    ->setBody( Zend_Json::encode(
+                        array(
+                            'status' => '1',
+                            'message' => "Peering notes updated for {$bcust['name']}.",
+                            'commentAdded' => '1', 'cid' => $bcust['id']
+                        ) ) )
+                    ->sendResponse();
+            }
+            catch( Zend_Exception $e )
+            {
+                $this->getResponse()
+                    ->setBody( Zend_Json::encode(
+                        array(
+                            'status' => '1',
+                            'message' => "Error: Sorry, we could not save your updated notes. Please contact support to report this issue."
+                        ) ) )
+                    ->sendResponse();
+            }
+        }
+        else
+        {
+            $prefix = date( 'Y-m-d ' ) . $this->user['username'] . ": ";
+            $content = array(
+                'name'  => $bcust['name'],
+                'notes' => "$prefix\n\n" . $myPeerRecord->getNotes(),
+                'pos'   => strlen( $prefix )
+            );
+
+            $this->getResponse()
+                ->setHeader('Content-Type', 'text/html')
+                ->setBody( Zend_Json::encode( $content ) )
+                ->sendResponse();
+        }
+
+        exit();
+    }
+
+
+    public function myPeeringMatrixPeeredStateAction()
+    {
+        $type  = $this->_request->getParam( 'type', 'state' );
+
+        $bcust = Doctrine_Core::getTable( 'Cust' )->find( $this->_request->getParam( 'id', false ) );
+
+        if( !$bcust )
+            exit;
+
+        // do we have a VLAN and is it valid
+        $vlan = $this->_request->getParam( 'vlan', false );
+
+        // is it one of the allowed VLANs?
+        $vlan_valid = false;
+        foreach( $this->config['peering_matrix']['public'] as $v )
+        {
+            if( $v['number'] == $vlan )
+            {
+                $vlan_valid = true;
+                break;
+            }
+        }
+
+        // if it's not valid, just bounce them to the first default
+        if( !$vlan_valid )
+            exit;
+
+
+        $myPeeringMatrix = Doctrine_Query::create()
+            ->from( 'MyPeeringMatrix mpm' )
+            ->where( 'mpm.custid = ?', $this->customer['id'] )
+            ->andWhere( 'mpm.peerid = ?', $bcust['id'] )
+            ->andWhere( 'mpm.vlan = ?', $vlan )
+            ->fetchOne( null, Doctrine_Core::HYDRATE_RECORD );
+
+        if( !$myPeeringMatrix )
+            exit;
+
+        if( $type == 'ipv6' )
+        {
+            $myPeeringMatrix['ipv6'] = ( $myPeeringMatrix['ipv6'] + 1 ) % 2;
+            $newstate = $myPeeringMatrix['ipv6'];
+        }
+        else
+        {
+	        $newstate = ( array_search( $myPeeringMatrix['peered'], MyPeeringMatrix::$PEERED_STATES ) + 1 )
+	            % count( MyPeeringMatrix::$PEERED_STATES );
+
+	        $myPeeringMatrix['peered'] = MyPeeringMatrix::$PEERED_STATES[ $newstate ];
+        }
+
+        $myPeeringMatrix->save();
+
+        $content = array( 'newstate' => $newstate );
+
+        $this->getResponse()
+            ->setHeader('Content-Type', 'text/html')
+            ->setBody( Zend_Json::encode( $content ) )
+            ->sendResponse();
+        exit();
+    }
+
+
+    /**
+     * Allow users to set the member preferences for delivery of various SEC event
+     * notifications.
+     */
+    public function secEventEmailConfigAction()
+    {
+        // possible events that can be set with default values
+        $events = SecEvent::$TYPES_DEFAULTS;
+
+        // are we updating the preferences?
+        if( $this->_request->getParam( 'update', false ) )
+        {
+            // get existing preferences, if any
+            foreach( $events as $name => $value )
+            {
+                if( $this->_request->getParam( $name, 0 ) )
+                {
+                    $this->user->Parent->setPreference( 'sec.notification.' . $name, 1 );
+                    $events[$name] = 1;
+                }
+                else
+                {
+                    $this->user->Parent->setPreference( 'sec.notification.' . $name, 0 );
+                    $events[$name] = 0;
+                }
+            }
+
+            $this->view->message = new INEX_Message( 'SEC Notification preferecnces updated',
+                INEX_Message::MESSAGE_TYPE_SUCCESS
+            );
+        }
+        else
+        {
+            // get existing preferences, if any
+            foreach( $events as $name => $value )
+            {
+                $pref = $this->user->Parent->getPreference( 'sec.notification.' . $name );
+
+                if( $pref === false ) // not set
+                    $this->user->Parent->setPreference( 'sec.notification.' . $name, 1 );
+                else
+                    $events[$name] = $pref;
+            }
+        }
+
+        $this->view->assign( 'events', $events );
+        $this->view->display( 'dashboard/sec-event-email-config.tpl' );
+    }
+}
diff --git a/application/controllers/ErrorController.php b/application/controllers/ErrorController.php
new file mode 100644
index 000000000..62be4e346
--- /dev/null
+++ b/application/controllers/ErrorController.php
@@ -0,0 +1,85 @@
+_getParam( 'error_handler' );
+
+        $this->getResponse()->clearBody();
+        ob_clean();
+
+        switch( $errors->type )
+        {
+            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
+            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
+
+                // 404 error -- controller or action not found
+                $this->getResponse()
+                ->setRawHeader( 'HTTP/1.1 404 Not Found' );
+
+                $this->view->display( 'error' . DIRECTORY_SEPARATOR . 'error-404.tpl' );
+                break;
+
+            default:
+                // application error; display error page, but don't change
+                // status code
+
+                if( isset( $errors->exception ) )
+                $exception = $errors->exception;
+                else if( Zend_Registry::isRegistered( 'exception' ) )
+                $exception = Zend_Registry::get( 'exception' );
+
+                if( isset( $exception ) )
+                {
+                    // Log the exception:
+                    $this->logger->debug( $exception->getMessage() . "\n" .
+                    $exception->getTraceAsString()
+                    );
+
+                    // print it appropriately
+                    if( isset( $this->config->debug->enabled ) && $this->config->debug->enabled )
+                    {
+                        $this->view->errorException = $exception;
+                        $this->view->display( 'error' . DIRECTORY_SEPARATOR . 'error-debug.tpl' );
+                    }
+                    else
+                    $this->view->display( 'error' . DIRECTORY_SEPARATOR . 'error.tpl' );
+                }
+                else
+                $this->view->display( 'error' . DIRECTORY_SEPARATOR . 'error.tpl' );
+                break;
+        }
+    }
+
+}
+
+?>
\ No newline at end of file
diff --git a/application/controllers/IndexController.php b/application/controllers/IndexController.php
new file mode 100644
index 000000000..579c678ab
--- /dev/null
+++ b/application/controllers/IndexController.php
@@ -0,0 +1,63 @@
+view->message ) !== null )
+            $this->session->message = $m;
+
+        $auth = Zend_Auth::getInstance();
+        if( !$auth->hasIdentity() )
+            $this->_forward( 'login', 'auth' );
+        else
+        {
+            $identity = $auth->getIdentity();
+
+            if( $identity['user']['privs'] == User::AUTH_SUPERUSER )
+            {
+                $this->_redirect( 'customer' );
+            }
+            else if( $identity['user']['privs'] == User::AUTH_CUSTADMIN )
+            {
+                $this->_redirect( 'cust-admin/users' );
+            }
+            else
+            {
+                $this->_redirect( 'dashboard' );
+            }
+        }
+    }
+
+}
+
+?>
\ No newline at end of file
diff --git a/application/controllers/Ipv4AddressController.php b/application/controllers/Ipv4AddressController.php
new file mode 100644
index 000000000..be6708558
--- /dev/null
+++ b/application/controllers/Ipv4AddressController.php
@@ -0,0 +1,97 @@
+frontend['defaultOrdering'] = 'name';
+        $this->frontend['model']           = 'Ipv4address';
+        $this->frontend['name']            = 'IPv4 Address';
+        $this->frontend['pageTitle']       = 'IPv4 Addresses';
+
+        $this->frontend['columns'] = array(
+
+            'displayColumns' => array( 'id', 'address', 'vlanid' ),
+
+            'viewPanelRows'  => array( 'address', 'vlanid' ),
+            'viewPanelTitle' => 'address',
+
+            'sortDefaults' => array(
+                'column' => 'address',
+                'order'  => 'desc'
+            ),
+
+            'id' => array(
+                'label' => 'ID',
+                'hidden' => true
+            ),
+
+            'address' => array(
+                'label' => 'Ipv4 Address',
+                'sortable' => 'true',
+            ),
+
+            'vlanid' => array(
+                'type' => 'hasOne',
+                'model' => 'Vlan',
+                'controller' => 'vlan',
+                'field' => 'name',
+                'label' => 'Vlan',
+                'sortable' => true
+            )
+
+        );
+
+        parent::feInit();
+    }
+
+    public function listAction()
+    {
+        $vlan = $this->_getParam( 'vlan', 10 );
+
+        $this->view->ips = Doctrine_Query::create()
+            ->from( 'Ipv4address ip' )
+            ->leftJoin( 'ip.Vlaninterface vi' )
+            ->leftJoin( 'vi.Virtualinterface virt' )
+            ->leftJoin( 'virt.Cust c' )
+            ->leftJoin( 'ip.Vlan v' )
+            ->where( 'v.number = ?', $vlan )
+            ->orderBy( 'ip.id ASC' )
+            ->fetchArray();
+
+        //INEX_Debug::dd( $this->view->ips, true );
+        $this->view->display( 'ipv4-address/list.tpl' );
+    }
+
+}
+
+?>
\ No newline at end of file
diff --git a/application/controllers/Ipv6AddressController.php b/application/controllers/Ipv6AddressController.php
new file mode 100644
index 000000000..1cf26fcf2
--- /dev/null
+++ b/application/controllers/Ipv6AddressController.php
@@ -0,0 +1,98 @@
+frontend['defaultOrdering'] = 'name';
+        $this->frontend['model']           = 'Ipv6address';
+        $this->frontend['name']            = 'IPv6 Address';
+        $this->frontend['pageTitle']       = 'IPv6 Addresses';
+
+        $this->frontend['columns'] = array(
+
+            'displayColumns' => array( 'id', 'address', 'vlanid' ),
+
+            'viewPanelRows'  => array( 'address', 'vlanid' ),
+            'viewPanelTitle' => 'address',
+
+            'sortDefaults' => array(
+                'column' => 'address',
+                'order'  => 'desc'
+            ),
+
+            'id' => array(
+                'label' => 'ID',
+                'hidden' => true
+            ),
+
+            'address' => array(
+                'label' => 'Ipv6 Address',
+                'sortable' => 'true',
+            ),
+
+            'vlanid' => array(
+                'type' => 'hasOne',
+                'model' => 'Vlan',
+                'controller' => 'vlan',
+                'field' => 'name',
+                'label' => 'Vlan',
+                'sortable' => true
+            )
+
+        );
+
+        parent::feInit();
+    }
+
+
+    public function listAction()
+    {
+        $vlan = $this->_getParam( 'vlan', 10 );
+
+        $this->view->ips = Doctrine_Query::create()
+            ->from( 'Ipv6address ip' )
+            ->leftJoin( 'ip.Vlaninterface vi' )
+            ->leftJoin( 'vi.Virtualinterface virt' )
+            ->leftJoin( 'virt.Cust c' )
+            ->leftJoin( 'ip.Vlan v' )
+            ->where( 'v.number = ?', $vlan )
+            ->orderBy( 'ip.id ASC' )
+            ->fetchArray();
+
+        //INEX_Debug::dd( $this->view->ips, true );
+        $this->view->display( 'ipv6-address/list.tpl' );
+    }
+
+}
+
+?>
\ No newline at end of file
diff --git a/application/controllers/IrrdbConfigController.php b/application/controllers/IrrdbConfigController.php
new file mode 100644
index 000000000..e8ae320e7
--- /dev/null
+++ b/application/controllers/IrrdbConfigController.php
@@ -0,0 +1,83 @@
+frontend['defaultOrdering'] = 'source';
+        $this->frontend['model']           = 'Irrdbconfig';
+        $this->frontend['name']            = 'IrrdbConfig';
+        $this->frontend['pageTitle']       = 'IRRDB Configuration';
+
+        $this->frontend['columns'] = array(
+
+            'displayColumns' => array( 'id', 'host', 'protocol', 'source' ),
+
+            'viewPanelRows'  => array( 'id', 'host', 'protocol', 'source', 'notes' ),
+
+            'sortDefaults' => array(
+                'column' => 'source',
+                'order'  => 'asc'
+            ),
+
+            'id' => array(
+                'label' => 'ID',
+                'hidden' => true
+            ),
+
+            'host' => array(
+                'label' => 'Host',
+                'sortable' => 'true',
+            ),
+
+            'protocol' => array(
+                'label' => 'Protocol',
+                'sortable' => 'true',
+            ),
+
+            'source' => array(
+                'label' => 'Source',
+                'sortable' => 'true',
+            ),
+
+            'notes' => array(
+                'label' => 'Notes'
+            )
+
+        );
+
+        parent::feInit();
+    }
+
+}
+
+?>
\ No newline at end of file
diff --git a/application/controllers/LocationController.php b/application/controllers/LocationController.php
new file mode 100644
index 000000000..afeb786bf
--- /dev/null
+++ b/application/controllers/LocationController.php
@@ -0,0 +1,108 @@
+frontend['defaultOrdering'] = 'name';
+        $this->frontend['model']           = 'Location';
+        $this->frontend['name']            = 'Location';
+        $this->frontend['pageTitle']       = 'Locations';
+
+        $this->frontend['columns'] = array(
+
+            'displayColumns' => array( 'id', 'name', 'shortname' ),
+
+            'viewPanelRows'  => array( 'name', 'shortname', 'address', 'nocphone', 'nocfax', 'nocemail', 'officephone', 'officefax', 'officeemail', 'notes' ),
+            'viewPanelTitle' => 'name',
+
+
+            'sortDefaults' => array(
+                'column' => 'name',
+                'order'  => 'desc'
+            ),
+
+            'id' => array(
+                'label' => 'ID',
+                'hidden' => true
+            ),
+
+            'name' => array(
+                'label' => 'Name',
+                'sortable' => 'true',
+            ),
+
+            'shortname' => array(
+                'label' => 'Short Name',
+                'sortable' => true
+            ),
+
+            'address' => array(
+                'label' => 'Address'
+            ),
+
+            'nocphone' => array(
+                'label' => 'NOC Phone'
+            ),
+
+            'nocfax' => array(
+                'label' => 'NOC Fax'
+            ),
+
+            'nocemail' => array(
+                'label' => 'NOC Email'
+            ),
+
+            'officephone' => array(
+                'label' => 'Office Phone'
+            ),
+
+            'officefax' => array(
+                'label' => 'Office Fax'
+            ),
+
+            'officeemail' => array(
+                'label' => 'Office e-mail'
+            ),
+
+            'notes' => array(
+                'label' => 'Notes'
+            )
+        );
+
+
+        parent::feInit();
+    }
+
+}
+
+?>
\ No newline at end of file
diff --git a/application/controllers/LogicalCircuitController.php b/application/controllers/LogicalCircuitController.php
new file mode 100644
index 000000000..dfa9a7896
--- /dev/null
+++ b/application/controllers/LogicalCircuitController.php
@@ -0,0 +1,182 @@
+frontend['defaultOrdering'] = 'name';
+        $this->frontend['model']           = 'LogicalCircuit';
+        $this->frontend['name']            = 'LogicalCircuit';
+        $this->frontend['pageTitle']       = 'Logical Circuits';
+
+        $this->frontend['columns'] = array(
+
+            'displayColumns' => array( 'id', 'our_ref', 'installed', 'removed', 'custid' ),
+
+            'viewPanelRows'  => array( 'id', 'our_ref', 'installed', 'removed', 'custid', 'notes' ),
+
+            'viewPanelTitle' => 'our_ref',
+
+            'sortDefaults' => array(
+                'column' => 'our_ref',
+                'order'  => 'asc'
+            ),
+
+            'id' => array(
+                'label' => 'ID',
+                'hidden' => true
+            ),
+
+            'our_ref' => array(
+                'label' => 'Our Reference',
+                'sortable' => 'true',
+            ),
+
+            'installed' => array(
+                'label' => 'Installed',
+                'sortable' => true
+            ),
+
+            'removed' => array(
+                'label' => 'Removed',
+                'sortable' => true
+            ),
+
+            'custid' => array(
+                'type' => 'hasOne',
+                'model' => 'Cust',
+                'controller' => 'customer',
+                'field' => 'name',
+                'label' => 'Customer',
+                'sortable' => true
+            )
+
+        );
+
+        parent::feInit();
+    }
+
+    public function addAction()
+    {
+        $this->view->physicalConnectionTypes = PhysicalCircuit::$TYPES_TEXT;
+
+        // is this an attempt to edit?
+        if( $this->getRequest()->getParam( 'id' ) !== NULL && is_numeric( $this->getRequest()->getParam( 'id' ) ) )
+        {
+            $isEdit = true;
+
+            // is the ID valid?
+            if( !( $object = Doctrine::getTable( $this->frontend['model'] )->find( $this->getRequest()->getParam( 'id' ) ) ) )
+            {
+                $this->view->message = new INEX_Message( 'No entry with ID: ' . $this->getRequest()->getParam( 'id' ) . " exists.", "failure" );
+                return( $this->_forward( 'list' ) );
+            }
+
+            $this->view->object = $object;
+
+            $form = $this->getForm( null, $isEdit );
+            $form->assignModelToForm( $object, $this );
+            $form->setAction(  Zend_Controller_Front::getInstance()->getBaseUrl() . '/' . $this->getRequest()->getParam( 'controller' ) . '/edit/id/' . $this->getRequest()->getParam( 'id' ) );
+            $form->getElement( 'commit' )->setLabel( 'Save Changes' );
+        }
+        else
+        {
+            $isEdit = false;
+
+            $form = $this->getForm( null, $isEdit );
+            $form->setAction( Zend_Controller_Front::getInstance()->getBaseUrl() . '/' . $this->getRequest()->getParam( 'controller' ) . "/add" );
+        }
+
+        $this->view->isEdit = $isEdit;
+
+        if( $this->getRequest()->getParam( 'return' ) !== null )
+            $form->addElement( $form->createElement( 'hidden', 'return' )->setValue( $this->getRequest()->getParam( 'return' ) ) );
+
+        if( $this->inexGetPost( 'commit' ) !== null && $form->isValid( $_POST ) )
+        {
+            do
+            {
+                try
+                {
+                    // non-standard validation checks
+                    if( !$isEdit )
+                    {
+                        if( method_exists( $this, 'formValidateForAdd' ) )
+                        if( $this->formValidateForAdd( $form ) === false )
+                        break;
+
+                        $object = new $this->frontend['model'];
+                    }
+
+                    $form->assignFormToModel( $object, $this, $isEdit );
+                    $object->save();
+
+                    if( $isEdit )
+                    {
+                        $this->logger->notice( $this->getName() . ' edited' );
+                        $this->view->message = new INEX_Message( $this->getName() . ' edited', "success" );
+                    }
+                    else
+                    {
+                        $this->logger->notice( 'New ' . $this->getName() . ' created' );
+                        $this->view->message = new INEX_Message( $this->getName() . ' added', "success" );
+                    }
+
+                    if( $this->getRequest()->getParam( 'return' ) !== null )
+                        $this->_redirect( 'http' . ( isset( $_SERVER['HTTPS'] ) ? 's' : '' ) . '://' . $_SERVER['SERVER_NAME'] . $this->getRequest()->getParam( 'return' ) );
+                    else
+                        return( $this->_forward( 'list' ) );
+                }
+                catch( Exception $e )
+                {
+                    Zend_Registry::set( 'exception', $e );
+                    return( $this->_forward( 'error', 'error' ) );
+                }
+            }while( false );
+        }
+
+        if( method_exists( $this, 'addEditPreDisplay' ) )
+            $this->addEditPreDisplay( $form );
+
+        $this->view->form   = $form->render( $this->view );
+        $this->view->object = $object;
+
+        if( $this->view->templateExists( $this->getRequest()->getParam( 'controller' ) . DIRECTORY_SEPARATOR . 'addEdit.tpl' ) )
+            $this->view->display( $this->getRequest()->getParam( 'controller' ) . DIRECTORY_SEPARATOR . 'addEdit.tpl' );
+        else
+            $this->view->display( 'frontend' . DIRECTORY_SEPARATOR . 'addEdit.tpl' );
+    }
+
+}
+
+?>
\ No newline at end of file
diff --git a/application/controllers/MeetingController.php b/application/controllers/MeetingController.php
new file mode 100644
index 000000000..3c44c4be2
--- /dev/null
+++ b/application/controllers/MeetingController.php
@@ -0,0 +1,323 @@
+frontend['defaultOrdering'] = 'date';
+        $this->frontend['model']           = 'Meeting';
+        $this->frontend['name']            = 'Meeting';
+        $this->frontend['pageTitle']       = 'Meetings';
+
+        $this->frontend['columns'] = array(
+
+            'displayColumns' => array(
+                'id', 'title', 'date', 'time', 'created_by', 'created_at'
+            ),
+
+            'viewPanelRows'  => array( 'title', 'before_text', 'after_text', 'date', 'time', 'venue', 'venue_url', 'created_by', 'created_at', 'updated_by', 'updated_at' ),
+
+            'viewPanelTitle' => 'title',
+
+            'sortDefaults' => array(
+                'column' => 'date', 'order' => 'desc'
+            ),
+
+            'id' => array(
+                'label' => 'ID',
+                'hidden' => true
+            ),
+
+            'title' => array(
+                'label' => 'Title',
+                'sortable' => false
+            ),
+
+            'date' => array(
+                'label' => 'Date',
+                'sortable' => true
+            ),
+
+            'time' => array(
+                'label' => 'Time',
+                'sortable' => false
+            ),
+
+            'venue' => array(
+                'label' => 'Venue',
+                'sortable' => true
+            ),
+
+            'venue_url' => array(
+                'label' => 'Venue URL',
+                'sortable' => false
+            ),
+
+            'before_text' => array(
+                'label' => 'Preamble'
+            ),
+
+            'after_text' => array(
+                'label' => 'Postamble'
+            ),
+
+            'created_by' => array(
+                'type' => 'hasOne',
+                'model' => 'User',
+                'controller' => 'user',
+                'field' => 'username',
+                'label' => 'Created By',
+                'sortable' => true
+            ),
+
+            'created_at' => array(
+                'label' => 'Created At'
+            ),
+
+            'updated_by' => array(
+                'type' => 'hasOne',
+                'model' => 'User',
+                'controller' => 'user',
+                'field' => 'username',
+                'label' => 'Updated By',
+                'sortable' => true
+            ),
+
+            'updated_at' => array(
+                'label' => 'Created At'
+            )
+
+
+        );
+
+        // Override global auth level requirement for specific actions
+        $this->frontend['authLevels'] = array(
+            'read'   => User::AUTH_CUSTUSER,
+            'rsvp'   => User::AUTH_CUSTUSER,
+            'simple' => User::AUTH_PUBLIC
+        );
+
+        parent::feInit();
+
+    }
+
+
+    /**
+     * Before we save, set the created by field.
+     *
+     * @param unknown_type $log The Change Log object
+     * @param unknown_type $isEdit True if the log is being edited, flase if it's being added
+     * @param unknown_type $form The submitted form object
+     */
+    protected function addEditPreSave( $row, $isEdit, $form )
+    {
+        $row['updated_by'] = $this->user;
+
+        if( !$isEdit )
+            $row['created_by'] = $this->user;
+    }
+
+
+    public function readAction()
+    {
+        $entries = Doctrine_Query::create()
+            ->from( 'Meeting m' )
+            ->leftJoin( 'm.MeetingItem mi' )
+            ->orderBy( 'm.date DESC, mi.other_content ASC' )
+            ->execute( null, Doctrine_Core::HYDRATE_ARRAY );
+
+        $this->view->entries = $entries;
+        $this->view->simple  = false;
+        $this->view->display( 'meeting/meetings.tpl' );
+    }
+
+    /**
+     * A simple HTML snippet for display on other websites
+     */
+    public function simpleAction()
+    {
+        $entries = Doctrine_Query::create()
+            ->from( 'Meeting m' )
+            ->leftJoin( 'm.MeetingItem mi' )
+            ->orderBy( 'm.date DESC, mi.other_content ASC' )
+            ->execute( null, Doctrine_Core::HYDRATE_ARRAY );
+
+        $this->view->entries = $entries;
+        $this->view->simple  = true;
+
+        if( $this->_request->getParam( 'nostyle', false ) )
+            $this->view->display( 'meeting/simple2.tpl' );
+        else
+            $this->view->display( 'meeting/simple.tpl' );
+    }
+
+
+    public function rsvpAction()
+    {
+        $meeting = Doctrine_Core::getTable( 'Meeting' )->find( $this->_request->getParam( 'id', null ) );
+
+        if( !$meeting )
+            exit;
+
+        $answer = $this->_getParam( 'answer', null );
+
+        if( !in_array( $answer, array( 'attend', 'noattend', 'skip', 'dontask' ) ) )
+            exit;
+
+        $response = 1;
+        $msg = false;
+
+        switch( $answer )
+        {
+            case 'skip':
+                $this->logger->debug( 'User skipped meeting RSVP request' );
+                $this->session->dashboard_skip_meeting = true;
+                break;
+
+            case 'dontask':
+                $this->logger->debug( 'User asked not to be asked to RSVP again' );
+                $this->getUser()->setPreference( 'meeting.attending.' . $meeting['id'], 'DONT_ASK' );
+                break;
+
+            case 'attend':
+                $msg = 'ATTEND';
+                $this->logger->debug( 'User will be attending this meeting' );
+                $this->getUser()->setPreference( 'meeting.attending.' . $meeting['id'], 'ATTENDING' );
+                break;
+
+            case 'noattend':
+                $msg = 'NOT ATTEND';
+                $this->logger->debug( 'User will not be attending this meeting' );
+                $this->getUser()->setPreference( 'meeting.attending.' . $meeting['id'], 'NOT_ATTENDING' );
+                break;
+
+        }
+
+        if( $msg !== false )
+        {
+            $mail = new Zend_Mail();
+            $mail->addTo( $this->config['meeting']['rsvp_to_email'], $this->config['meeting']['rsvp_to_name'] )
+                 ->setSubject( '[Meeting RSVP] ' . $msg . ': ' . $this->getUser()->email . '/' . $this->customer['name'] )
+                 ->setBodyText( "\nThis is an automated message from the IXP Manager.\n\n"
+                        . "The following person has indicated that they will $msg the meeting scheduled for {$meeting['date']}\n\n"
+                        . "{$this->getUser()->username} / {$this->getUser()->email} / {$this->customer['name']}\n\n"
+                 );
+            $mail->setFrom( $this->_config['identity']['autobot']['email'] );
+
+            try {
+                $mail->send();
+            } catch( Zend_Mail_Exception $e ) {
+                $response = 0;
+                $this->getLogger()->err( $e->getMessage() );
+            }
+        }
+
+        $this->getResponse()
+            ->setHeader( 'Content-Type', 'text/html' )
+            ->setBody( Zend_Json::encode( array( 'response' => $response ) ) )
+            ->sendResponse();
+
+        exit;
+    }
+
+
+    public function composeAction()
+    {
+        $meeting = Doctrine_Query::create()
+            ->from( 'Meeting m' )
+            ->where( 'm.id = ?', $this->_request->getParam( 'id', null ) )
+            ->leftJoin( 'm.MeetingItem mi' )
+            ->orderBy( 'm.date DESC, mi.other_content ASC' )
+            ->fetchOne( null, Doctrine_Core::HYDRATE_ARRAY );
+
+        if( !$meeting )
+        {
+            $this->session->message = new INEX_Message(
+                "Invalid meeting selected", INEX_Message::MESSAGE_TYPE_ERROR
+            );
+            return( $this->_redirect( 'meeting/list' ) );
+        }
+
+        $this->view->meeting = $meeting;
+
+        do
+        {
+
+	        if( $this->_getParam( 'send', 0 ) == 1 )
+	        {
+                $this->view->to      = $this->_getParam( 'to' );
+                $this->view->from    = $this->_getParam( 'from' );
+                $this->view->bcc     = $this->_getParam( 'bcc' );
+                $this->view->subject = trim( stripslashes( $this->_getParam( 'subject' ) ) );
+                $this->view->body    = trim( stripslashes( $this->_getParam( 'body' ) ) );
+
+	            foreach( array( 'to', 'from', 'bcc' ) as $p )
+	            {
+	                $v = trim( $this->_getParam( $p ) );
+	                $$p = $v;
+
+	                if( $p == 'bcc' && $v == '' ) continue;
+
+	                if( !Zend_Validate::is( $v, 'EmailAddress' ) )
+	                {
+	                    $this->view->message = new INEX_Message( "Invalid email address in the '$p' field",
+	                           INEX_Message::MESSAGE_TYPE_ERROR
+	                    );
+	                    break 2;
+	                }
+	            }
+
+                $mail = new Zend_Mail();
+                $mail->addTo( $to );
+                $mail->setFrom( $from );
+                if( $bcc != '' ) $mail->addBcc( $bcc );
+                $mail->setSubject( trim( stripslashes( $this->_getParam( 'subject' ) ) ) );
+                $mail->setBodyHtml( $this->view->render( 'meeting/email/meeting.tpl' ), 'utf8' );
+
+	            try {
+	                $mail->send();
+	                $this->view->message = new INEX_Message( "Email sent successfully", INEX_Message::MESSAGE_TYPE_SUCCESS );
+	            } catch( Zend_Mail_Exception $e ) {
+                    $this->view->message = new INEX_Message( "Error: Could not send email.", INEX_Message::MESSAGE_TYPE_ERROR );
+	                $this->getLogger()->err( $e->getMessage() );
+	            }
+
+	        }
+
+        }while( false );
+
+        $this->view->display( 'meeting/compose.tpl' );
+    }
+
+}
+
+?>
\ No newline at end of file
diff --git a/application/controllers/MeetingItemController.php b/application/controllers/MeetingItemController.php
new file mode 100644
index 000000000..23bcdf3cb
--- /dev/null
+++ b/application/controllers/MeetingItemController.php
@@ -0,0 +1,311 @@
+frontend['defaultOrdering'] = 'date';
+        $this->frontend['model']           = 'MeetingItem';
+        $this->frontend['name']            = 'MeetingItem';
+        $this->frontend['pageTitle']       = 'Meeting Item';
+
+        $this->frontend['columns'] = array(
+
+            'displayColumns' => array(
+                'id', 'meeting_id', 'title', 'name', 'company'
+            ),
+
+            'viewPanelRows'  => array( 'meeting_id', 'title', 'name', 'role', 'email',
+                'company', 'company_url', 'summary', 'presentation', 'video_url', 'other_content',
+                'created_by', 'created_at', 'updated_by', 'updated_at'
+            ),
+
+            'viewPanelTitle' => 'title',
+
+            'id' => array(
+                'label' => 'ID',
+                'hidden' => true
+            ),
+
+            'meeting_id' => array(
+                'type' => 'hasOne',
+                'model' => 'Meeting',
+                'controller' => 'meeting',
+                'field' => 'date',
+                'label' => 'Meeting Date',
+                'sortable' => true
+            ),
+
+            'title' => array(
+                'label' => 'Title',
+                'sortable' => false
+            ),
+
+            'name' => array(
+                'label' => 'Name',
+                'sortable' => false
+            ),
+
+            'role' => array(
+                'label' => 'Role',
+                'sortable' => false
+            ),
+
+            'email' => array(
+                'label' => 'E-Mail',
+                'sortable' => false
+            ),
+
+            'company' => array(
+                'label' => 'Company',
+                'sortable' => false
+            ),
+
+            'company' => array(
+                'label' => 'Company URL',
+                'sortable' => false
+            ),
+
+            'summary' => array(
+                'label' => 'Summary',
+                'sortable' => false
+            ),
+
+            'presentation' => array(
+                'label' => 'Presentation',
+                'sortable' => false
+            ),
+
+            'video_url' => array(
+                'label' => 'Video',
+                'sortable' => false
+            ),
+
+            'other_content' => array(
+                'label' => 'Other Content?',
+                'sortable' => true
+            ),
+
+            'created_by' => array(
+                'type' => 'hasOne',
+                'model' => 'User',
+                'controller' => 'user',
+                'field' => 'username',
+                'label' => 'Created By',
+                'sortable' => true
+            ),
+
+            'created_at' => array(
+                'label' => 'Created At'
+            ),
+
+            'updated_by' => array(
+                'type' => 'hasOne',
+                'model' => 'User',
+                'controller' => 'user',
+                'field' => 'username',
+                'label' => 'Updated By',
+                'sortable' => true
+            ),
+
+            'updated_at' => array(
+                'label' => 'Created At'
+            )
+
+
+        );
+
+        // Override global auth level requirement for specific actions
+        $this->frontend['authLevels'] = array(
+            'get-presentation' => User::AUTH_CUSTUSER
+        );
+
+        parent::feInit();
+
+    }
+
+    /**
+     * Return the presentation file
+     */
+    protected function getPresentationAction()
+    {
+        if( !( $pres = Doctrine_Core::getTable( 'MeetingItem' )->find( $this->_request->getParam( 'id', null ) ) ) )
+        {
+            $this->session->message = new INEX_Message(
+                'The request presentation does not exist or does not have an associated file attached to it.',
+                INEX_Message::MESSAGE_TYPE_ERROR
+            );
+            $this->_redirect( 'meeting/read' );
+        }
+
+        $fn = "INEX_Members_Meeting_" . $pres['Meeting']['date'] . "_(" . $pres['id'] . ').';
+
+        // What kind of file do we have?
+        if( preg_match( '/pdf$/i', $pres['filename'] ) ) {
+            header('Content-type: application/pdf');
+            $fn .= 'pdf';
+        }
+        else if( preg_match( '/ppt$/i', $pres['filename'] ) ) {
+            header('Content-type: application/vnd.ms-powerpoint');
+            $fn .= 'ppt';
+        }
+        else if( preg_match( '/pps$/i', $pres['filename'] ) ) {
+            header('Content-type: application/vnd.ms-powerpoint');
+            $fn .= 'pps';
+        }
+        else if( preg_match( '/pptx$/i', $pres['filename'] ) ) {
+            header( 'Content-type: application/vnd.ms-powerpoint' );
+            $fn .= 'pptx';
+        }
+        else {
+            header( 'Content-type: application/octet-stream' );
+            $fn .= substr( $pres['filename'], strrpos( $pres['filename'], '.' ) );
+        }
+
+
+        // It will be called downloaded.pdf
+        header('Content-Disposition: attachment; filename="' . $fn . '"');
+
+        $file = APPLICATION_PATH . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR
+                    . 'var' . DIRECTORY_SEPARATOR . 'meetings' . DIRECTORY_SEPARATOR
+                    . $pres['meeting_id'] . DIRECTORY_SEPARATOR . $pres['presentation'];
+
+        echo @file_get_contents( $file );
+    }
+
+    /**
+     * Before we save, set the created by field.
+     *
+     * @param unknown_type $log The Change Log object
+     * @param unknown_type $isEdit True if the log is being edited, flase if it's being added
+     * @param unknown_type $form The submitted form object
+     */
+    protected function addEditPreSave( $row, $isEdit, $form )
+    {
+        $row['updated_by'] = $this->user;
+
+        if( !$isEdit )
+            $row['created_by'] = $this->user;
+
+        // is there a file upload?
+        if( $form->getValue( 'presentation' ) != '' )
+        {
+            // lets make more memory available for large files
+            ini_set( 'memory_limit', '128M' );
+
+            $this->logger->debug( 'Received upload of file: ' . $form->getValue( 'presentation' ) );
+
+            // Zend sticks the original filename in the form variable
+            $row['filename'] = $form->getValue( 'presentation' );
+
+            // We're going to store presentations in the var directory under meetings.
+
+            $root = APPLICATION_PATH . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR
+                    . 'var' . DIRECTORY_SEPARATOR . 'meetings';
+
+            // make sure meetings exists
+            if( !is_dir( $root ) && !@mkdir( $root ) )
+            {
+                $this->logger->crit( 'Could not create presentations directory.' );
+                die( 'ERROR: Could not create the presentations root directory.' );
+            }
+
+            // now, create a directory for this meeting if it does not already exists
+            $meeting_dir = $root . DIRECTORY_SEPARATOR . $row['meeting_id'];
+
+            if( !is_dir( $meeting_dir ) && !@mkdir( $meeting_dir ) )
+            {
+                $this->logger->crit( 'Could not create meetings directory.' );
+                die( 'ERROR: Could not create presentations directory.' );
+            }
+
+            // get the extension for this presentation
+
+            if( strrpos( $row['filename'], '.' ) === false )
+                $exten = '';
+            else
+                $exten = substr( $row['filename'], strrpos( $row['filename'], '.' ) );
+
+            // we need the row ID so we'll do a save
+            $row->save();
+
+            $row['presentation'] = $row['id'] . $exten;
+            $this->logger->debug( 'Uploaded file will be saved as: ' . $row['presentation'] );
+
+            // delete an existing file in case we're updating
+            if( file_exists( $meeting_dir . DIRECTORY_SEPARATOR . $row['presentation'] ) )
+            {
+                $this->logger->debug( 'Pre-existing file exists so deleteing' );
+                @unlink( $meeting_dir . DIRECTORY_SEPARATOR . $row['presentation'] );
+            }
+
+            @rename( $form->presentation->getFilename(), $meeting_dir . DIRECTORY_SEPARATOR . $row['presentation'] );
+        }
+    }
+
+    /**
+     * Before deleting a meeting, delete meeting items.
+     */
+    protected function preDelete( $object = null )
+    {
+        Doctrine_Core::getTable( 'MeetingItem' )->findByMeetingId(
+                $object['id']
+        )->delete();
+    }
+
+
+    /**
+     * Add a filter to the list
+     */
+    protected function _preList( $dataQuery )
+    {
+        // assign the filterable items to the view
+        $this->view->entries  = Doctrine_Query::create()
+            ->select( 'm.id, m.title, m.date' )
+            ->from( 'Meeting m' )
+            ->orderBy( 'm.date DESC' )
+            ->execute( null, Doctrine_Core::HYDRATE_ARRAY );
+
+        // did the user specify a specific meeting?
+        if( ( $id = $this->_request->getParam( 'meeting_id', 0 ) ) )
+        {
+            $dataQuery->leftJoin( 'x.Meeting m' )
+                ->andWhere( 'm.id = ?', $id );
+
+            $this->view->filter_id = $id;
+        }
+
+        return $dataQuery;
+    }
+}
+
+?>
\ No newline at end of file
diff --git a/application/controllers/MrtgController.php b/application/controllers/MrtgController.php
new file mode 100644
index 000000000..02a2175f9
--- /dev/null
+++ b/application/controllers/MrtgController.php
@@ -0,0 +1,195 @@
+ 'Bits',
+        'pkts' => 'Packets',
+        'errs' => 'Errors',
+        'discs' => 'Discards',
+    );
+
+    /**
+     * A variable to hold an instance of the bootstrap object
+     *
+     * @var object An instance of the bootstrap object
+     */
+    protected $_bootstrap;
+
+    /**
+     * A variable to hold an instance of the configuration object
+     *
+     * @var object An instance of the configuration object
+     */
+    protected $config = null;
+
+    /**
+     * A variable to hold an instance of the logger object
+     *
+     * @var object An instance of the logger object
+     */
+    protected $logger = null;
+
+    /**
+     * A variable to hold the identity object
+     *
+     * @var object An instance of the user's identity or false
+     */
+    protected $auth = null;
+
+    /**
+     * A variable to hold an identify of the user
+     *
+     * Will be !false if there is a valid identity
+     *
+     * @var object An instance of the user's identity or false
+     */
+    protected $identity = false;
+
+    /**
+     * A variable to hold the user record
+     *
+     * @var object An instance of the user record
+     */
+    protected $user = null;
+
+
+    protected $_flock = null;
+
+    /**
+     * Override the Zend_Controller_Action's constructor (which is called
+     * at the very beginning of this function anyway).
+     *
+     * @param object $request See Parent class constructer
+     * @param object $response See Parent class constructer
+     * @param object $invokeArgs See Parent class constructer
+     */
+    public function __construct(
+            Zend_Controller_Request_Abstract  $request,
+            Zend_Controller_Response_Abstract $response,
+            array $invokeArgs = null )
+    {
+        // get the bootstrap object
+        $this->_bootstrap = $invokeArgs['bootstrap'];
+
+        // and from the bootstrap, we can get other resources:
+        $this->config  = $this->_bootstrap->getApplication()->getOptions();
+        $this->_bootstrap->getResource( 'namespace' );
+        $this->logger  = $this->_bootstrap->getResource( 'logger' );
+
+        $this->auth    = $this->_bootstrap->getResource( 'auth' );
+
+        if( $this->auth->hasIdentity() )
+        {
+            $this->identity = $this->auth->getIdentity();
+            $this->user     = Doctrine::getTable( 'User' )->find( $this->identity['user']['id'] );
+            $this->customer = Doctrine::getTable( 'Cust' )->find( $this->identity['user']['custid'] );
+        }
+        else
+        {
+            die();
+        }
+
+        // call the parent's version where all the Zend magic happens
+        parent::__construct( $request, $response, $invokeArgs );
+    }
+
+
+    private function checkShortname( $shortname )
+    {
+        return Doctrine::getTable( 'Cust' )->findByShortname( $shortname );
+    }
+
+
+    function retrieveImageAction()
+    {
+        header( 'Content-Type: image/png' );
+        header( 'Expires: Thu, 01 Jan 1970 00:00:00 GMT' );
+
+        $monitorindex = $this->getRequest()->getParam( 'monitorindex', 'aggregate' );
+        $period       = $this->getRequest()->getParam( 'period', INEX_Mrtg::$PERIODS['Day'] );
+        $shortname    = $this->getRequest()->getParam( 'shortname' );
+        $category     = $this->getRequest()->getParam( 'category', INEX_Mrtg::$CATEGORIES['Bits'] );
+        $graph        = $this->getRequest()->getParam( 'graph', '' );
+
+        $this->logger->debug( "Request for $shortname-$monitorindex-$category-$period-$graph by {$this->user->username}" );
+
+        if( !$this->identity )
+            exit(0);
+
+        if( $shortname == 'X_Trunks' )
+        {
+            $filename = $this->config['mrtg']['path']
+                . '/../trunks/' . $graph . '-' . $period . '.png';
+        }
+        else if( $shortname == 'X_SwitchAggregate' )
+        {
+            $filename = $this->config['mrtg']['path']
+                . '/../switches/switch-aggregate-' . $graph . '-'
+                . $category . '-' . $period . '.png';
+        }
+        else if( $shortname == 'X_Peering' )
+        {
+            $filename = $this->config['mrtg']['path']
+                . '/../inex_peering-' . $graph . '-'
+                . $category . '-' . $period . '.png';
+        }
+        else
+        {
+            if( $this->user['privs'] < User::AUTH_SUPERUSER || !$this->checkShortname( $shortname ) )
+                $shortname = $this->customer['shortname'];
+
+            $filename = INEX_Mrtg::getMrtgFilePath( $this->config['mrtg']['path'], 'PNG',
+                $monitorindex, $category, $shortname, $period
+            );
+        }
+
+        $this->logger->debug( "Serving $filename to {$this->user->username}" );
+
+        $stat = @readfile( $filename );
+
+        if( $stat === false )
+        {
+            $this->logger->err( 'Could not load ' . $filename . ' for mrtg/retrieveImageAction' );
+            echo readfile(
+                APPLICATION_PATH . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR
+                    . 'public' . DIRECTORY_SEPARATOR . 'images' . DIRECTORY_SEPARATOR
+                    . 'image-missing.png'
+            );
+        }
+    }
+
+
+}
+
+
diff --git a/application/controllers/PatchPanelController.php b/application/controllers/PatchPanelController.php
new file mode 100644
index 000000000..051fcd881
--- /dev/null
+++ b/application/controllers/PatchPanelController.php
@@ -0,0 +1,343 @@
+frontend['defaultOrdering'] = 'name';
+        $this->frontend['model']           = 'PatchPanel';
+        $this->frontend['name']            = 'PatchPanel';
+        $this->frontend['pageTitle']       = 'Patch Panels';
+
+        $this->frontend['columns'] = array(
+
+            'displayColumns' => array( 'id', 'name', 'cabinetid', 'colo_ref', 'cable_type', 'interface_type', 'allow_duplex' ),
+
+            'viewPanelRows'  => array( 'id', 'name', 'cabinetid', 'colo_ref', 'cable_type', 'interface_type', 'allow_duplex' ),
+
+            'viewPanelTitle' => 'name',
+
+            'sortDefaults' => array(
+                'column' => 'name',
+                'order'  => 'asc'
+            ),
+
+            'id' => array(
+                'label' => 'ID',
+                'hidden' => true
+            ),
+
+            'name' => array(
+                'label' => 'Name',
+                'sortable' => 'true',
+            ),
+
+            'cabinetid' => array(
+                'type' => 'hasOne',
+                'model' => 'Cabinet',
+                'controller' => 'cabinet',
+                'field' => 'name',
+                'label' => 'Cabinet',
+                'sortable' => true
+            ),
+
+            'colo_ref' => array(
+                'label' => 'Co-lo Ref',
+                'sortable' => true
+            ),
+
+            'cable_type' => array(
+                'label' => 'Cable Type',
+                'sortable' => true,
+                'type' => 'xlate',
+                'xlator' => PatchPanelPort::$CABLES_TYPES
+            ),
+
+            'interface_type' => array(
+                'label' => 'Interface',
+                'sortable' => true,
+                'type' => 'xlate',
+                'xlator' => PatchPanelPort::$INTERFACE_TYPES
+            ),
+
+            'allow_duplex' => array(
+                'label' => 'Duplex Allowed?',
+                'sortable' => true
+            )
+
+        );
+
+        parent::feInit();
+    }
+
+
+
+
+    public function addAction()
+    {
+        $pp = null;
+        $form = new INEX_Form_PatchPanel( null, false );
+
+        $form->setAction(
+            Zend_Controller_Front::getInstance()->getBaseUrl()
+                . '/' . $this->getRequest()->getParam( 'controller' ) . "/add"
+        );
+
+        if( $this->_request->getParam( 'commit', null ) !== null )
+        {
+
+            if( $this->_request->getParam( 'cb_autogen' ) == '1' )
+            {
+                $form->getSubForm( 'AutoGenForm' )
+                     ->getElement( 'num_ports' )
+                     ->setRequired( true )
+                     ->addValidator( 'Between', true, array( 'min' => 1, 'max' => 48 ) );
+            }
+
+	        if( $form->isValid( $_POST ) )
+	        {
+	            do
+	            {
+	                try
+	                {
+	                    $ppform = $form->getSubForm( 'PatchPanelForm' );
+
+	                    if( $form->getSubForm( 'AutoGenForm' )->getElement( 'edit' )->isChecked() )
+	                    {
+	                        // user wants to edit each port first
+                            $this->session->pp_form = $form;
+                            return( $this->_forward( 'edit-ports' ) );
+                        }
+
+	                    $pp = new PatchPanel();
+	                    $ppform->assignFormToModel( $pp, $this, false );
+	                    $pp->save();
+
+                        $this->logger->notice( 'New patch panel created with ID: ' . $pp->id );
+
+                        if( $form->getSubForm( 'AutoGenForm' )->getElement( 'cb_autogen' )->isChecked() )
+                        {
+					        for( $i = 1; $i <= $form->getSubForm( 'AutoGenForm' )->getElement( 'num_ports' )->getValue(); $i++ )
+					        {
+					            foreach( PatchPanelPort::$SIDES as $side_i => $side_v )
+					            {
+                                    $mport = new PatchPanelPort();
+                                    $mport->port       = $i;
+                                    $mport->side       = $side_i;
+                                    $mport->type       = $ppform->interface_type->getValue();
+                                    $mport->colo_ref   = $ppform->colo_ref->getValue() . ".$i";
+                                    $mport->cable_type = $ppform->cable_type->getValue();
+                                    $mport->PatchPanel = $pp;
+                                    $mport->save();
+                                    $this->logger->notice( "New patch panel port created with ID {$mport->id} for patch panel #{$pp->id}" );
+					            }
+					        }
+
+					        $this->view->message = new INEX_Message( "The new patch panel and its ports have been added", "success" );
+                        }
+                        else
+                        {
+                            $this->view->message = new INEX_Message( "The new patch panel has been added without ports", "success" );
+                        }
+
+	                    return( $this->_forward( 'list' ) );
+	                }
+	                catch( Exception $e )
+	                {
+	                    Zend_Registry::set( 'exception', $e );
+	                    return( $this->_forward( 'error', 'error' ) );
+	                }
+	            }while( false );
+	        }
+
+        }
+
+        $this->view->isEdit = false;
+        $this->view->form   = $form->render( $this->view );
+        $this->view->pp     = $pp;
+
+        $this->view->display( $this->getRequest()->getParam( 'controller' ) . DIRECTORY_SEPARATOR . 'addEdit.tpl' );
+    }
+
+
+
+    public function editAction()
+    {
+        // does the requested patch panel exist?
+        if( !( $pp = Doctrine_Core::getTable( 'PatchPanel' )->find( $this->getRequest()->getParam( 'id', null ) ) ) )
+        {
+            $this->view->message = new INEX_Message( "No patch panel with the requested ID exists", "error" );
+            return( $this->_forward( 'list' ) );
+        }
+
+        $orig_colo_ref = $pp->colo_ref;
+
+        $form = new INEX_Form_PatchPanel( null, true );
+
+        $form->removeSubForm( 'AutoGenForm' );
+
+        $form->setAction(
+            Zend_Controller_Front::getInstance()->getBaseUrl()
+                . '/' . $this->getRequest()->getParam( 'controller' ) . "/edit/id/" . $pp->id
+        );
+
+        $form->getSubForm( 'PatchPanelForm' )->assignModelToForm( $pp, $this );
+
+        if( $this->_request->getParam( 'commit', null ) !== null && $form->isValid( $_POST ) )
+        {
+            $ppform = $form->getSubForm( 'PatchPanelForm' );
+
+            $ppform->assignFormToModel( $pp, $this, false );
+            $pp->save();
+
+            $this->logger->notice( "Patch panel #{$pp->id} edited" );
+
+            if( $orig_colo_ref != $pp->colo_ref )
+            {
+                // need to update the ports colo references
+                foreach( Doctrine_Core::getTable( 'PatchPanelPort' )->findByPatchPanelId( $pp->id ) as $port )
+                {
+                    $port->colo_ref = "{$pp->colo_ref}.{$port->port}";
+                    $port->save();
+                }
+                $this->logger->notice( "Patch panel #{$pp->id} has had it's colo-ref edited - ports have been updated also" );
+                $this->view->message = new INEX_Message( "Patch panel {$pp->name} edited and its ports colocation references have been updated", "success" );
+            }
+            else
+            {
+                $this->view->message = new INEX_Message( "Patch panel {$pp->name} edited", "success" );
+            }
+
+            return( $this->_forward( 'list' ) );
+        }
+
+        $this->view->form   = $form->render( $this->view );
+        $this->view->pp     = $pp;
+        $this->view->isEdit = true;
+
+        $this->view->display( $this->getRequest()->getParam( 'controller' ) . DIRECTORY_SEPARATOR . 'addEdit.tpl' );
+    }
+
+
+    public function editPortsAction()
+    {
+        $cancelLocation = 'http' . ( isset( $_SERVER['HTTPS'] ) ? 's' : '' ) . '://' . $_SERVER['SERVER_NAME'] . Zend_Controller_Front::getInstance()->getBaseUrl() . '/' . $this->getRequest()->getParam( 'controller' ) . '/list';
+
+        if( $this->_request->getParam( 'commit2', null ) !== null )
+            $submitted = true;
+        else
+            $submitted = false;
+
+        // allow the user to edit the ports on a per port basis
+        $pp = $this->session->pp_form;
+
+        $ppps = new INEX_Form_PatchPanelPorts( null, false, $cancelLocation );
+
+        $ppps->setAction(
+            Zend_Controller_Front::getInstance()->getBaseUrl()
+                . '/' . $this->getRequest()->getParam( 'controller' ) . "/edit-ports"
+        );
+
+        for( $i = 1; $i <= $pp->getSubForm( 'AutoGenForm' )->getElement( 'num_ports' )->getValue(); $i++ )
+        {
+            $index = ($i - 1) * 2;
+
+            foreach( PatchPanelPort::$SIDES as $side_i => $side_v )
+            {
+                $pppf = new INEX_Form_SubForm_PatchPanelPort( null, false, null );
+
+                $pppf->setName( 'PPP_' . $index );
+
+                $pppf->port->setValue( $i );
+                $pppf->side->setValue( $side_i );
+
+	            $pppf->type->setValue( $pp->getSubForm( 'PatchPanelForm' )->interface_type->getValue() );
+	            $pppf->cable_type->setValue( $pp->getSubForm( 'PatchPanelForm' )->cable_type->getValue() );
+                $pppf->colo_ref->setValue( $pp->getSubForm( 'PatchPanelForm' )->colo_ref->getValue() . ".$i" );
+
+                $pppf->setElementsBelongTo( 'PPP_' . $index );
+
+                $ppps->addSubForm( $pppf, 'PPP_' . $index, $index );
+
+                ++$index;
+            }
+        }
+
+        if( $this->_request->getParam( 'commit2', null ) !== null && $ppps->isValid( $_POST ) )
+        {
+            // all validation checks out - add patch panel and ports.
+            $pp_model = new PatchPanel();
+            $pp->getSubForm( 'PatchPanelForm' )->assignFormToModel( $pp_model, $this, false );
+            $pp_model->save();
+
+            $this->logger->notice( 'New patch panel created with ID: ' . $pp_model->id );
+
+            foreach( $ppps->getSubForms() as $fport )
+            {
+                $mport = new PatchPanelPort();
+                $mport->port       = $fport->port->getValue();
+                $mport->side       = $fport->side->getValue();
+                $mport->type       = $fport->type->getValue();
+                $mport->colo_ref   = $fport->colo_ref->getValue();
+                $mport->cable_type = $fport->cable_type->getValue();
+                $mport->PatchPanel = $pp_model;
+                $mport->save();
+            }
+
+            $this->logger->notice( "New patch panel port created with ID {$mport->id} for patch panel #{$pp_model->id}" );
+            $this->view->message = new INEX_Message( "The new patch panel and its ports have been added", "success" );
+
+            return( $this->_forward( 'list' ) );
+
+        }
+
+        $this->view->form   = $ppps->render( $this->view );
+        $this->view->sides  = PatchPanelPort::$SIDES;
+
+        $this->view->display( 'patch-panel' . DIRECTORY_SEPARATOR . 'edit-ports.tpl' );
+    }
+
+
+
+    /**
+     * Pre-deletion method to delete all patch panel ports before deleting the patch panel itself
+     *
+     */
+    public function preDelete( $object = null )
+    {
+        Doctrine_Core::getTable( 'PatchPanelPort' )->findByPatchPanelId(
+                $this->getRequest()->getParam( 'id' )
+            )->delete();
+    }
+}
+
+?>
\ No newline at end of file
diff --git a/application/controllers/PatchPanelPortController.php b/application/controllers/PatchPanelPortController.php
new file mode 100644
index 000000000..56b99be4e
--- /dev/null
+++ b/application/controllers/PatchPanelPortController.php
@@ -0,0 +1,106 @@
+frontend['defaultOrdering'] = 'name';
+        $this->frontend['model']           = 'PatchPanelPort';
+        $this->frontend['name']            = 'PatchPanelPort';
+        $this->frontend['pageTitle']       = 'Patch Panel Ports';
+
+        $this->frontend['columns'] = array(
+
+            'displayColumns' => array( 'id', 'patch_panel_id', 'port', 'side', 'type', 'colo_ref', 'cable_type', 'duplex' ),
+
+            'viewPanelRows' => array( 'id', 'patch_panel_id', 'port', 'side', 'type', 'colo_ref', 'cable_type', 'duplex' ),
+
+            'viewPanelTitle' => 'colo_ref',
+
+            'sortDefaults' => array(
+                'column' => 'colo_ref',
+                'order'  => 'asc'
+            ),
+
+            'id' => array(
+                'label' => 'ID',
+                'hidden' => true
+            ),
+
+            'patch_panel_id' => array(
+                'type' => 'hasOne',
+                'model' => 'PatchPanel',
+                'controller' => 'patch-panel',
+                'field' => 'name',
+                'label' => 'Patch Panel',
+                'sortable' => true
+            ),
+
+            'colo_ref' => array(
+                'label' => 'Co-lo Ref',
+                'sortable' => true
+            ),
+
+            'side' => array(
+                'label' => 'Side',
+                'sortable' => true,
+                'type' => 'xlate',
+                'xlator' => PatchPanelPort::$SIDES
+            ),
+
+            'cable_type' => array(
+                'label' => 'Cable Type',
+                'sortable' => true,
+                'type' => 'xlate',
+                'xlator' => PatchPanelPort::$CABLES_TYPES
+            ),
+
+            'type' => array(
+                'label' => 'Interface',
+                'sortable' => true,
+                'type' => 'xlate',
+                'xlator' => PatchPanelPort::$INTERFACE_TYPES
+            ),
+
+            'duplex' => array(
+                'label' => 'Duplexed?',
+                'sortable' => true
+            )
+
+        );
+
+        parent::feInit();
+    }
+
+}
+
+?>
\ No newline at end of file
diff --git a/application/controllers/PeeringMatrixController.php b/application/controllers/PeeringMatrixController.php
new file mode 100644
index 000000000..91f402d7d
--- /dev/null
+++ b/application/controllers/PeeringMatrixController.php
@@ -0,0 +1,80 @@
+_request->getParam( 'lan', 0 );
+
+        if( !isset( $this->config['peering_matrix']['public'][$lan] ) )
+        {
+            $this->session->message = new INEX_Message(
+                "Invalid peering matrix requested",
+                INEX_Message::MESSAGE_TYPE_ERROR
+            );
+            return( $this->_redirect( 'dashboard' ) );
+        }
+        
+        $peering_states = Doctrine_Query::create()
+            ->select( 'pm.x_as, pm.y_as, pm.peering_status' )
+            ->addSelect( 'xc.name, xc.id, xc.peeringmacro, xc.peeringpolicy' )
+            ->addSelect( 'yc.name, yc.id, yc.peeringmacro, yc.peeringpolicy' )
+            ->from( 'PeeringMatrix pm' )
+            ->leftJoin( 'pm.X_Cust xc' )
+            ->leftJoin( 'pm.Y_Cust yc' )
+            ->where( 'pm.vlan = ?', $this->config['peering_matrix']['public'][$lan]['number'] )
+            ->orderBy( 'pm.x_as ASC, pm.y_as ASC' )
+            ->fetchArray();
+        
+        // try and arrange the array as n x n keyed by x's as number
+        $matrix = array();
+        $potential = 0; 
+        $active    = 0; 
+        foreach( $peering_states as $pm )
+        {
+            $matrix[$pm['x_as']][] = $pm;
+            if( $pm['peering_status'] == 'YES' )
+                $active++;
+            $potential++;
+        }
+        
+        $this->view->potential = $potential;
+        $this->view->active    = $active;
+        $this->view->lan    = $lan;
+        $this->view->matrix = $matrix;
+        $this->view->display( 'peering-matrix/index.tpl' );
+    }
+                                                                                                                                                                                                                                                                                                                                                                                                                            
+}
+
+
diff --git a/application/controllers/PhysicalInterfaceController.php b/application/controllers/PhysicalInterfaceController.php
new file mode 100644
index 000000000..bb12c3483
--- /dev/null
+++ b/application/controllers/PhysicalInterfaceController.php
@@ -0,0 +1,153 @@
+frontend['defaultOrdering'] = 'name';
+        $this->frontend['model']           = 'Physicalinterface';
+        $this->frontend['name']            = 'PhysicalInterface';
+        $this->frontend['pageTitle']       = 'Physical Interfaces';
+
+        $this->frontend['disableAddNew']   = true;
+
+        $this->frontend['columns'] = array(
+
+            'displayColumns' => array( 'id', 'switch', 'switchport', 'status', 'speed', 'duplex' ),
+
+
+            'viewPanelRows'  => array( 'switch', 'switchport', 'status', 'speed', 'duplex', 'monitorindex', 'notes' ),
+
+
+            'sortDefaults' => array(
+                'column' => 'status',
+                'order'  => 'desc'
+            ),
+
+            'id' => array(
+                'label' => 'ID',
+                'hidden' => true
+            ),
+
+
+            'switch' => array(
+                'type' => 'l2HasOne',
+                'l1model' => 'Switchport',
+                'l1controller' => 'switchport',
+                'l2model' => 'SwitchTable',
+                'l2controller' => 'switch',
+                'field' => 'name',
+                'label' => 'Switch',
+                'sortable' => true
+            ),
+
+            'switchport' => array(
+                'type' => 'hasOne',
+                'model' => 'Switchport',
+                'controller' => 'switch-port',
+                'field' => 'name',
+                'label' => 'Port',
+                'sortable' => true
+            ),
+
+            'status' => array(
+                'label' => 'Status',
+                'sortable' => false,
+                'type' => 'xlate',
+                'xlator' => Physicalinterface::$STATES_TEXT
+            ),
+
+            'speed' => array(
+                'label' => 'Speed',
+                'sortable' => true,
+            ),
+
+            'duplex' => array(
+                'label' => 'Duplex',
+                'sortable' => true
+            ),
+
+            'monitorindex' => array(
+                'label' => 'Monitor Index'
+            )
+
+        );
+
+        parent::feInit();
+    }
+
+    /**
+     * addEditPreDisplay
+     *
+     * @param INEX_Form_PhysicalInterface The form object
+     */
+    function addEditPreDisplay( $form )
+    {
+        // did we get a customer id from the provisioning controller?
+        if( $this->_getParam( 'prov_virtualinterface_id', false ) )
+        {
+            $form->getElement( 'cancel' )->setAttrib( 'onClick',
+                "parent.location='" . $this->config['identity']['ixp']['url']
+                    . '/provision/interface-overview/id/' . $this->session->provisioning_interface_active_id . "'"
+            );
+        }
+
+        // if provisioning and we're creating an interface:
+        if( $this->_getParam( 'prov_physicalinterface_id' ) !== null )
+        {
+            $form->getElement( 'status' )->setValue( Physicalinterface::STATUS_XCONNECT );
+        }
+
+
+        if( $this->getRequest()->getParam( 'virtualinterfaceid' ) !== null )
+        {
+            $form->getElement( 'virtualinterfaceid' )->setValue( $this->getRequest()->getParam( 'virtualinterfaceid' ) );
+
+            if( $form->getElement( 'monitorindex' )->getValue() == '' )
+            {
+                $virtualInterface = Doctrine::getTable( 'Virtualinterface' )->find( $this->getRequest()->getParam( 'virtualinterfaceid' ) );
+
+                $nextMonitorIndex = Doctrine_Query::create()
+	                ->select( 'MAX( pi.monitorindex )' )
+	                ->from( 'Physicalinterface pi' )
+	                ->leftJoin( 'pi.Virtualinterface vi' )
+	                ->where( 'vi.custid = ?', $virtualInterface['custid'] )
+	                ->execute()
+	                ->toArray();
+
+                $form->getElement( 'monitorindex' )->setValue( $nextMonitorIndex[0]['MAX'] + 1 );
+            }
+        }
+    }
+}
+
+?>
\ No newline at end of file
diff --git a/application/controllers/ProfileController.php b/application/controllers/ProfileController.php
new file mode 100644
index 000000000..171338702
--- /dev/null
+++ b/application/controllers/ProfileController.php
@@ -0,0 +1,155 @@
+auth->hasIdentity() )
+            $this->_forward( 'index', 'auth' );
+
+        $this->_passwordForm = new INEX_Form_ProfilePassword();
+        $this->_passwordForm->setAction(
+            Zend_Controller_Front::getInstance()->getBaseUrl()
+            . '/' . $this->getRequest()->getParam( 'controller' )
+            . '/change-password'
+        );
+
+        $this->_profileForm = new INEX_Form_Profile();
+        $this->_profileForm->getElement( 'username' )->setValue( $this->user['username'] );
+        $this->_profileForm->getElement( 'email' )->setValue( $this->user['email'] );
+        $this->_profileForm->getElement( 'mobile' )->setValue( $this->user['authorisedMobile'] );
+        $this->_profileForm->setAction(
+            Zend_Controller_Front::getInstance()->getBaseUrl()
+            . '/' . $this->getRequest()->getParam( 'controller' )
+            . '/change-profile'
+        );
+
+    }
+
+    public function indexAction()
+    {
+        $this->view->profileForm  = $this->_profileForm->render( $this->view );
+        $this->view->passwordForm = $this->_passwordForm->render( $this->view );
+        $this->view->display( 'profile/index.tpl' );
+    }
+
+
+    /**
+     * Action to allow a user to change their profile
+     *
+     */
+    public function changeProfileAction()
+    {
+        if( $this->_profileForm->isValid( $_POST ) )
+        {
+            // update the user
+            $this->user['authorisedMobile'] = $this->_profileForm->getValue( 'mobile' );
+            $this->user['email']            = $this->_profileForm->getValue( 'email' );
+
+            try
+            {
+                $this->user->save();
+            }
+            catch( Doctrine_Exception $e )
+            {
+                $this->logger->log( 'Doctrine save() error: ' . $e->getMessage() . ' in Profile/ChangePassword',
+                    Zend_Log::CRIT
+                );
+                $this->view->message = new INEX_Message( 'Internal Error: Your profile could not be changed', 'error' );
+                return( $this->indexAction() );
+            }
+
+            $this->view->message = new INEX_Message( 'Your profile has been changed', 'success' );
+
+        }
+
+        $this->indexAction();
+    }
+
+
+    /**
+     * Action to allow a user to change their password
+     *
+     */
+    public function changePasswordAction()
+    {
+        if( $this->_passwordForm->isValid( $_POST ) )
+        {
+            // let's do some suplementary checks
+            if( $this->_passwordForm->getValue( 'password1' ) != $this->_passwordForm->getValue( 'password2' ) )
+            {
+                $this->_passwordForm->getElement( 'password2' )->addError(
+                	'Your passwords do not match'
+                );
+                return( $this->indexAction() );
+            }
+
+            if( $this->_passwordForm->getValue( 'oldpassword' ) != $this->user->password )
+            {
+                $this->_passwordForm->getElement( 'oldpassword' )->addError(
+                    'You have entered an incorrect current password'
+                );
+                return( $this->indexAction() );
+            }
+
+            // update the users password
+            $this->user['password'] = $this->_passwordForm->getValue( 'password1' );
+
+            $this->_passwordForm->reset();
+
+            try
+            {
+                $this->user->save();
+            }
+            catch( Doctrine_Exception $e )
+            {
+                $this->logger->log( 'Doctrine save() error: ' . $e->getMessage() . ' in Profile/ChangePassword',
+                    Zend_Log::CRIT
+                );
+                $this->view->message = new INEX_Message( 'Internal Error: Your password could not be changed', 'error' );
+                return( $this->indexAction() );
+            }
+
+            $this->view->message = new INEX_Message( 'Your password has been changed', 'success' );
+
+        }
+
+        $this->indexAction();
+    }
+}
+
diff --git a/application/controllers/ProvisionController.php b/application/controllers/ProvisionController.php
new file mode 100644
index 000000000..db30f2a2c
--- /dev/null
+++ b/application/controllers/ProvisionController.php
@@ -0,0 +1,290 @@
+from( 'ProvisioningInterface pi' )
+            ->where( 'complete = 0' )
+            ->orderBy( 'created_at ASC' )
+            ->execute( null, Doctrine_Core::HYDRATE_RECORD );
+
+        $this->view->outstanding = $outstanding;
+        $this->view->display( 'provision/interface/list.tpl' );
+    }
+
+
+    /**
+     * Provision a new interface
+     */
+    public function interfaceOverviewAction()
+    {
+        if( $this->_getParam( 'new', false ) == 'yes' )
+        {
+            $progress = new ProvisioningInterface();
+
+            $this->view->customers = CustTable::getAllNames();
+        }
+        else
+        {
+            if( $id = $this->_getParam( 'id', false ) )
+                $this->session->provisioning_interface_active_id = $id;
+            else
+                $id = $this->session->provisioning_interface_active_id;
+
+            if( !( $progress = Doctrine_Core::getTable( 'ProvisioningInterface' )->find( $id ) ) )
+            {
+                throw new INEX_Exception( 'ERROR: Missing interface provisioning task ID' );
+            }
+        }
+
+        $this->view->progress = $progress;
+        $this->view->display( 'provision/interface/overview.tpl' );
+    }
+
+    /**
+     * First step in interface provisioning - choose a customer.
+     *
+     * This also creates the provision object.
+     */
+    public function interfaceChooseCustAction()
+    {
+        // get the id and make sure it's valid
+        $cust = Doctrine_Core::getTable( 'Cust' )->find( $this->_getParam( 'cust', false ) );
+
+        if( !$cust )
+        {
+            $this->view->message = new INEX_Message(
+                'No or invalid customer specified.', INEX_Message::MESSAGE_TYPE_ERROR
+            );
+            $this->_setParam( 'new', 'yes' );
+            return $this->_forward( 'interface-overview' );
+        }
+
+        // okay, we have a customer, create the provisioning object
+        $progress = new ProvisioningInterface();
+        $progress['Cust'] = $cust;
+        $progress['created_by'] = $this->getUser()->id;
+        $progress['created_at'] = date( 'Y-m-d H:i:s' );
+        $progress->save();
+
+        $this->session->provisioning_interface_active_id = $progress['id'];
+
+        $this->session->message = new INEX_Message(
+            "Provisioning process started and customer set. Please create a virtual interface.",
+            INEX_Message::MESSAGE_TYPE_SUCCESS
+        );
+
+        $this->_redirect( 'provision/interface-overview/id/' . $progress['id'] );
+    }
+
+    /**
+     * Second step in interface provisioning - virtual interface selected
+     */
+    public function interfaceVirtualInterfaceAction()
+    {
+        if( !( $progress = Doctrine_Core::getTable( 'ProvisioningInterface' )->find(
+                $this->session->provisioning_interface_active_id ) ) )
+        {
+            throw new INEX_Exception( 'ERROR: Missing interface provisioning task ID' );
+        }
+
+        $progress['virtualinterface_id'] = $this->_getParam( 'objectid', 0 );
+        $progress->save();
+
+        $this->_redirect( 'provision/interface-overview/id/' . $progress['id'] );
+    }
+
+    /**
+     * Third step in interface provisioning - physical interface selected
+     */
+    public function interfacePhysicalInterfaceAction()
+    {
+        if( !( $progress = Doctrine_Core::getTable( 'ProvisioningInterface' )->find(
+                $this->session->provisioning_interface_active_id ) ) )
+        {
+            throw new INEX_Exception( 'ERROR: Missing interface provisioning task ID' );
+        }
+
+        $progress['physicalinterface_id'] = $this->_getParam( 'objectid', 0 );
+        $progress->save();
+
+        $this->_redirect( 'provision/interface-overview/id/' . $progress['id'] );
+    }
+
+    /**
+     * Fourth step in interface provisioning - physical interface selected
+     */
+    public function interfaceVlanInterfaceAction()
+    {
+        if( !( $progress = Doctrine_Core::getTable( 'ProvisioningInterface' )->find(
+                $this->session->provisioning_interface_active_id ) ) )
+        {
+            throw new INEX_Exception( 'ERROR: Missing interface provisioning task ID' );
+        }
+
+        $progress['vlaninterface_id'] = $this->_getParam( 'objectid', 0 );
+        $progress->save();
+
+        $this->_redirect( 'provision/interface-overview/id/' . $progress['id'] );
+    }
+
+    /**
+     * Fifth step in interface provisioning - send email with details
+     */
+    public function interfaceSendMailAction()
+    {
+        if( !( $progress = Doctrine_Core::getTable( 'ProvisioningInterface' )->find(
+                $this->session->provisioning_interface_active_id ) ) )
+        {
+            throw new INEX_Exception( 'ERROR: Missing interface provisioning task ID' );
+        }
+
+        $cancelLocation = $this->config['identity']['ixp']['url']
+            . '/provision/interface-overview/id/' . $this->session->provisioning_interface_active_id;
+
+        $form = new INEX_Form_Provision_InterfaceEmail( null, false, $cancelLocation );
+
+        $form->getElement( 'to' )->setValue( $progress['Cust']['nocemail'] );
+
+        $userEmails = array();
+        foreach( $progress['Cust']['User'] as $user )
+        {
+            if( Zend_Validate::is( $user['email'], 'EmailAddress' ) )
+                $userEmails[] = $user['email'];
+        }
+
+        $form->getElement( 'cc' )->setValue( implode( ',', $userEmails ) );
+
+        $form->getElement( 'bcc' )->setValue( 'ops@inex.ie' );
+
+        $form->getElement( 'subject' )->setValue( 'INEX Operations :: New Interface Details' );
+
+        $this->view->networkInfo = Networkinfo::toStructuredArray();
+        $this->view->progress    = $progress;
+
+        $form->getElement( 'message' )->setValue(
+            $this->view->render( 'provision/interface/mail/interface-details.tpl' )
+        );
+
+
+        // Process a submitted form if it passes initial validation
+        if( $this->inexGetPost( 'commit' ) !== null && $form->isValid( $_POST ) )
+        {
+            $validForm = true;
+            // Validate all e-mail addresses
+            foreach( array( 'to', 'cc', 'bcc' ) as $recipient )
+            {
+                if( $form->getValue( $recipient ) != '' )
+                {
+                    foreach( explode( ',', $form->getElement( $recipient )->getValue() ) as $email )
+                    {
+                        if( !Zend_Validate::is( $email, 'EmailAddress' ) )
+                        {
+                            $form->getElement( $recipient )->addError( 'Invalid e-mail address: ' . $email );
+                            $validForm = false;
+                        }
+                    }
+                }
+            }
+
+            if( $validForm )
+            {
+                $mail = new Zend_Mail();
+                $mail->setBodyText( $form->getValue( 'message' ) );
+                $mail->setFrom( 'operations@inex.ie', 'INEX Operations' );
+                $mail->setSubject( $form->getValue( 'subject' ) );
+
+                foreach( array( 'To', 'Cc', 'Bcc' ) as $recipient )
+                    if( $form->getValue( strtolower( $recipient ) ) != '' )
+                        foreach( explode( ',', $form->getElement( strtolower( $recipient ) )->getValue() ) as $email )
+                            if( Zend_Validate::is( $email, 'EmailAddress' ) )
+                            {
+                                $fn = "add$recipient";
+                                $mail->$fn( $email );
+                            }
+
+                if( $mail->send() )
+                {
+                    $progress['mail_sent'] = 1;
+                    $progress->save();
+                    $this->logger->info( "Interface details email sent for {$progress['Cust']['name']}" );
+                    $this->session->message = new INEX_Message( "Interface email successfully sent to {$progress['Cust']['name']}", INEX_Message::MESSAGE_TYPE_SUCCESS );
+                    $this->_redirect( 'provision/interface-overview/id/' . $progress['id'] );
+                    return true;
+                }
+                else
+                {
+                    $this->logger->err( "Could not sent welcome email for {$progress['Cust']['name']}: " . print_r( $mail, true ) );
+                    $this->session->message = new INEX_Message( "Welcome email could not be sent to {$progress['Cust']['name']}. Please see logs for more verbose output.", INEX_Message::MESSAGE_TYPE_ERROR );
+                }
+
+            }
+        }
+
+        $this->view->form   = $form->render( $this->view );
+        $this->view->display( 'provision/interface/send-mail.tpl' );
+
+        //$this->_redirect( 'provision/interface-overview/id/' . $progress['id'] );
+    }
+
+
+
+    /**
+     * Sixth step in interface provisioning - generate switch configuration
+     */
+    public function interfaceSwitchConfigAction()
+    {
+        if( !( $progress = Doctrine_Core::getTable( 'ProvisioningInterface' )->find(
+                $this->session->provisioning_interface_active_id ) ) )
+        {
+            throw new INEX_Exception( 'ERROR: Missing interface provisioning task ID' );
+        }
+
+        if( !$progress['switch_config'] )
+        {
+            $progress['switch_config'] = 1;
+            $progress->save();
+        }
+
+        $this->view->progress = $progress;
+        $this->view->display( 'provision/interface/switch-config.tpl' );
+    }
+
+
+}
+
diff --git a/application/controllers/SecController.php b/application/controllers/SecController.php
new file mode 100644
index 000000000..2ce6bf4e4
--- /dev/null
+++ b/application/controllers/SecController.php
@@ -0,0 +1,389 @@
+_bootstrap = $invokeArgs['bootstrap'];
+
+        // and from the bootstrap, we can get other resources:
+        $this->_config   = $this->_bootstrap->getApplication()->getOptions();
+        $this->_logger   = $this->_bootstrap->getResource( 'logger' );
+        $this->_session  = $this->_bootstrap->getResource( 'namespace' );
+        $this->_view     = $this->_bootstrap->getResource( 'view' );
+
+        // call the parent's version where all the Zend magic happens
+        parent::__construct( $request, $response, $invokeArgs );
+    }
+
+
+    /**
+     * The default action - show the home page
+     */
+    public function indexAction()
+    {
+        // TODO Auto-generated SecController::indexAction() default action
+        echo "No such event defined\n";
+    }
+
+    /**
+     * Handle BGP MD5 Authentication errors from the route collector
+     *
+     * This inserts a row into the sec_event table and optionally notifies the customer
+     * and / or IXP operations.
+     *
+     * Example test commands:
+     *
+     *  echo "day=10&hour=10&minute=36&second=15&router=rc1&month=Feb&type=BGP_AUTH&ip=193.242.111.37" | ./sec-processor.php
+     *
+     * See sec.port_updown.* configuration options in application.ini.
+     */
+    public function bgpAuthAction()
+    {
+
+        // Log the event
+        $this->_logger->notice( "{$this->_session->type} {$this->_session->cust['shortname']} - "
+            . "{$this->_session->router} - {$this->_session->ip['address']}"
+        );
+
+        // Record it in the database
+        $se = new SecEvent;
+        $se['Cust']          = $this->_session->cust;
+        $se['type']          = $this->_session->type;
+        $se['recorded_date'] = $this->_session->date;
+        $se['message']     = "Bad or no BGP MD5 digest from {$this->_session->ip['address']} connecting to " . $this->_config['identity']['orgname'] . " router collector";
+        $se->save();
+
+        $this->_view->params = $this->_session;
+
+        if( $this->_config['sec']['bgp_auth']['alert_customers']
+                && $this->_session->user->getOrSetGetPreference( SecEvent::TYPE_BGP_AUTH, 1 ) )
+        {
+            $mail = new Zend_Mail();
+            $mail->addTo( $this->_config['identity']['testemail'] /* $this->_session->cust['nocemail']*/, "NOC of {$this->_session->cust['name']}" );
+            $mail->setSubject( '[' . $this->_config['identity']['orgname'] . ' Autobot] BGP MD5 Auth Issue with ' . $this->_config['identity']['orgname'] . ' Route Collector' );
+            $this->_sendMail( $mail, 'sec/cust_bgp_auth.tpl', true, false, $this->_config['sec']['bgp_auth']['cc_opsauto'] );
+        }
+
+        if( $this->_config['sec']['bgp_auth']['alert_operations'] )
+        {
+            $this->_view->customer_notified = $this->_config['sec']['bgp_auth']['alert_customers'];
+
+            $mail = new Zend_Mail();
+
+            $mail->setSubject( "BGP Auth Issue with rc1 :: {$this->_session->cust['shortname']} :: "
+                . "{$this->_session->ip['address']}"
+            );
+
+            $this->_sendMail( $mail, 'sec/ops_bgp_auth.tpl', true, true );
+        }
+
+    }
+
+
+
+    /**
+     * Handle Port and Line Protocol Up/Down events
+     *
+     * This inserts a row into the sec_event table and optionally notifies the customer
+     * and / or IXP operations.
+     *
+     * Example test commands:
+     *
+     *  echo "day=10:hour=10:minute=36:second=15:switch=sw01:month=Feb:type=PORT_UPDOWN:state=down:port=GigabitEthernet1/1" | ./sec-processor.php
+     *
+     * See sec.port_updown.* configuration options in application.ini.
+     */
+    public function portUpdownAction()
+    {
+        // FIXME Handle more that core and customer ports!
+
+        // Log the event
+        if( $this->_session->isCorePort )
+        {
+            $this->_logger->notice( "{$this->_session->type} CORE LINK - "
+                . "{$this->_session->switch['name']} - {$this->_session->port}"
+            );
+        }
+        else
+        {
+            $this->_logger->notice( "{$this->_session->type} {$this->_session->cust['shortname']} - "
+                . "{$this->_session->switch['name']} - {$this->_session->switchPort['name']} "
+            );
+        }
+
+        // Record it in the database
+        $se = new SecEvent;
+        $se['Cust']          = $this->_session->cust;
+        $se['SwitchTable']   = $this->_session->switch;
+        $se['Switchport']    = $this->_session->switchPort;
+        $se['type']          = $this->_session->type == 'PORT_UPDOWN' ? SecEvent::TYPE_PORT_UPDOWN : SecEvent::TYPE_LINEPROTO_UPDOWN;
+        $se['recorded_date'] = $this->_session->date;
+
+
+        if( $this->_session->isCorePort )
+        {
+            $se['message']     = 'CORE LINK: ' . ( $this->_session->type == 'PORT_UPDOWN' ? 'Port' : 'Line protocol' )
+                . ' ' . strtoupper( $this->_session->state ) . ": {$this->_session->port} "
+                . "of switch {$this->_session->switch['name']}";
+        }
+        else
+        {
+            $se['message']     = ( $this->_session->type == 'PORT_UPDOWN' ? 'Port' : 'Line protocol' )
+                . ' ' . strtoupper( $this->_session->state ) . ": {$this->_session->switchPort['name']} "
+                . "of switch {$this->_session->switch['name']}";
+        }
+
+        $se->save();
+
+        $this->_view->params = $this->_session;
+
+        if( $this->_config['sec']['port_updown']['alert_customers']
+            && !$this->_session->isCorePort
+            && $this->_session->user->getOrSetGetPreference( SecEvent::TYPE_PORT_UPDOWN, 1 ) )
+        {
+            $mail = new Zend_Mail();
+            $mail->addTo( $this->_config['identity']['testemail'] /* $this->_session->cust['nocemail']*/, "NOC of {$this->_session->cust['name']}" );
+            $mail->setSubject( '[' . $this->_config['identity']['orgname'] . ' Autobot] ALERT: Your Port / Line Protocol is ' . strtoupper( $this->_session->state ) );
+            $this->_sendMail( $mail, 'sec/cust_port_updown.tpl', true, false, $this->_config['sec']['security_violation']['cc_opsauto'] );
+        }
+
+        if( $this->_config['sec']['port_updown']['alert_operations'] || $this->_session->isCorePort )
+        {
+            $this->_view->customer_notified = $this->_config['sec']['port_updown']['alert_customers'];
+
+            $mail = new Zend_Mail();
+
+            if( $this->_session->isCorePort )
+            {
+                $mail->setSubject( 'CORE LINK ' . strtoupper( $this->_session->state )
+                    . " :: {$this->_session->switch['name']} {$this->_session->port}"
+                );
+
+                // Send SMS to Operators!
+                foreach( $this->_config['sec']['pagers'] as $pager )
+                {
+                    $this->_getClickatell()->send( $pager,
+                        "CORE PORT {$this->_session->switch['name']} {$this->_session->port} " . strtoupper( $this->_session->state )
+                    );
+                }
+            }
+            else
+            {
+                $mail->setSubject( "Port/Line Protocol Up/Down :: {$this->_session->cust['shortname']} :: "
+                    . "{$this->_session->switch['name']} {$this->_session->switchPort['name']}"
+                );
+            }
+
+            $this->_sendMail( $mail, 'sec/ops_port_updown.tpl', true, true );
+        }
+
+    }
+
+
+
+    /**
+     * Handle Security Violation events
+     *
+     * This inserts a row into the sec_event table and optionally notifies the customer
+     * and / or IXP operations.
+     *
+     * Example test command:
+     *
+     *    echo "day=10:hour=10:minute=36:second=15:switch=sw01:month=Feb:type=SECURITY_VIOLATION:mac=0011.93fb.3040:port=GigabitEthernet1/1" | ./sec-processor.php
+     *
+     * See sec.security_violation.* configuration options in application.ini.
+     */
+    public function securityViolationAction()
+    {
+
+	    ///////////////////////////////////////////////////////
+        // wonder who manufactured the device that caused this violation?
+
+	    $smac = strtoupper( $this->_session->mac );
+	    $smac = substr( $smac, 0, 2 ) . '-' . substr( $smac, 2, 2 ) . '-' . substr( $smac, 5, 2 );
+
+        $manufacturer = 'Unknown';
+	    $fp = fopen( APPLICATION_PATH . '/../data/oui.txt', 'r' );
+	    while( $oui = fgets( $fp ) )
+	    {
+	        if( substr( $oui, 0, 8 ) == $smac )
+                $manufacturer = trim( substr( $oui, strpos( $oui, '(hex)' ) + 5 ) );
+	    }
+	    fclose( $fp );
+
+        // Log the event
+        $this->_logger->notice( "SECURITY VIOLATION {$this->_session->cust['shortname']} - "
+            . "{$this->_session->switch['name']} - {$this->_session->switchPort['name']} "
+            . "MAC: {$this->_session->mac} Manufactur: $manufacturer"
+        );
+
+        // Record it in the database
+        $se = new SecEvent;
+        $se['Cust']          = $this->_session->cust;
+        $se['SwitchTable']   = $this->_session->switch;
+        $se['Switchport']    = $this->_session->switchPort;
+        $se['type']          = SecEvent::TYPE_SECURITY_VIOLATION;
+        $se['recorded_date'] = $this->_session->date;
+
+        $se['message']     = "Security violation occurred, caused by MAC address {$this->_session->mac} "
+            . "(manufacturer: {$manufacturer}) on port {$this->_session->switchPort['name']} "
+            . "of switch {$this->_session->switch['name']}";
+
+        $se->save();
+
+        $this->_view->params = $this->_session;
+        $this->_view->manufacturer = $manufacturer;
+
+        if( $this->_config['sec']['security_violation']['alert_customers']
+            && $this->_session->user->getOrSetGetPreference( SecEvent::TYPE_SECURITY_VIOLATION, 1 ) )
+        {
+	        $mail = new Zend_Mail();
+            $mail->addTo( $this->_config['identity']['testemail'] /* $this->_session->cust['nocemail']*/, "NOC of {$this->_session->cust['name']}" );
+            $mail->setSubject( "[" . $this->_config['identity']['orgname'] . " Autobot] Port Security Violation" );
+            $this->_sendMail( $mail, 'sec/cust_security_violation.tpl', true, false, $this->_config['sec']['security_violation']['cc_opsauto'] );
+        }
+
+        if( $this->_config['sec']['security_violation']['alert_operations'] )
+        {
+            $this->_view->customer_notified = $this->_config['sec']['security_violation']['alert_customers'];
+
+            $mail = new Zend_Mail();
+
+            $mail->setSubject( "Port Security Violation :: {$this->_session->cust['shortname']} :: "
+                . "{$this->_session->switch['name']} {$this->_session->switchPort['name']}"
+            );
+
+            $this->_sendMail( $mail, 'sec/ops_security_violation.tpl', true, true );
+        }
+
+    }
+
+    /**
+     * A utility function to send mails.
+     *
+     * In this SEC controller, we'll be sending a lot of mails based on alerts. This
+     * utility function should reduce duplicate code.
+     *
+     * @param Zend_Mail $mail A Zend_Mail object (with a subject set for example)
+     * @param string $tpl The template to use for the email content
+     * @param bool $fops Add an identity.autobot from address
+     * @param bool $tops Add an identity.autobot to address
+     * @param bool $cops Add an identity.autobot CC address
+     */
+    private function _sendMail( $mail, $tpl, $fops = false, $tops = false, $cops = false )
+    {
+        $options = $this->_bootstrap->getApplication()->getOptions();
+
+        $mail->setBodyText(
+            $this->_view->render( $tpl )
+        );
+
+        if( $fops )
+            $mail->setFrom( $options['identity']['autobot']['email'], $options['identity']['autobot']['name'] );
+
+        if( $tops )
+            $mail->addTo(   $options['identity']['autobot']['email'], $options['identity']['autobot']['name'] );
+
+        if( $cops )
+            $mail->addCc(   $options['identity']['autobot']['email'], $options['identity']['autobot']['name'] );
+
+        return $mail->send();
+    }
+
+    /**
+     * Get a Clicktell object to send SMS'
+     *
+     * @return INEX_SMS_Clickatell The Clickatell object
+     */
+    private function _getClickatell()
+    {
+        if( $this->_clickatell === null )
+            $this->_clickatell = new INEX_SMS_Clickatell(
+                $this->_config['sms']['clickatell']['username'],
+                $this->_config['sms']['clickatell']['password'],
+                $this->_config['sms']['clickatell']['api_id']
+            );
+
+        return $this->_clickatell;
+    }
+}
+
diff --git a/application/controllers/SecViewerController.php b/application/controllers/SecViewerController.php
new file mode 100644
index 000000000..f8ce6e0e0
--- /dev/null
+++ b/application/controllers/SecViewerController.php
@@ -0,0 +1,145 @@
+frontend['defaultOrdering'] = 'timestamp';
+        $this->frontend['model']           = 'SecEvent';
+        $this->frontend['name']            = 'SEC Event Viewer';
+        $this->frontend['pageTitle']       = 'SEC Events';
+
+        $this->frontend['columns'] = array(
+
+            'displayColumns' => array( 'id', 'custid', 'switchid', 'switchportid', 'type', 'timestamp' ),
+
+            'viewPanelRows'  => array(  'custid', 'switchid', 'switchportid', 'type', 'message', 'timestamp', 'recorded_date' ),
+
+            'viewPanelTitle' => 'custid',
+
+            'sortDefaults' => array(
+                'column' => 'timestamp',
+                'order'  => 'desc'
+            ),
+
+            'id' => array(
+                'label' => 'ID',
+                'hidden' => true
+            ),
+
+
+            'custid' => array(
+                'type' => 'hasOne',
+                'model' => 'Cust',
+                'controller' => 'customer',
+                'field' => 'name',
+                'label' => 'Customer',
+                'sortable' => true
+            ),
+
+            'switchid' => array(
+                'type' => 'hasOne',
+                'model' => 'SwitchTable',
+                'controller' => 'switch',
+                'field' => 'name',
+                'label' => 'Switch',
+                'sortable' => true
+            ),
+
+            'switchportid' => array(
+                'type' => 'hasOne',
+                'model' => 'Switchport',
+                'controller' => 'switchport',
+                'field' => 'name',
+                'label' => 'Port',
+                'sortable' => false
+            ),
+
+            'type' => array(
+                'label' => 'Type',
+                'sortable' => true
+            ),
+
+            'message' => array(
+                'label' => 'Message',
+            ),
+
+            'timestamp' => array(
+                'label' => 'Timestamp',
+                'sortable' => true
+            ),
+
+            'recorded_time' => array(
+                'label' => 'Recorded Time',
+            )
+
+        );
+
+        // Override global auth level requirement for specific actions
+        $this->frontend['authLevels'] = array(
+            'read' => User::AUTH_CUSTUSER
+        );
+
+        parent::feInit();
+    }
+
+
+
+
+    /**
+     * Show each member their own SEC event logs
+     */
+    public function readAction()
+    {
+        $page    = $this->_request->getParam( 'p', 1 );
+        $perPage = 20;
+
+        $logs = new Doctrine_Pager(
+            Doctrine_Query::create()
+                ->select( 'e.message, e.recorded_date' )
+                ->from( 'SecEvent e' )
+                ->where( 'e.custid = ?' )
+                ->orderby( 'e.recorded_date ASC' ),
+            $page,
+            $perPage
+        );
+
+        $this->view->assign( 'logs', $logs->execute( $this->customer['id'], Doctrine_Core::HYDRATE_ARRAY ) );
+        $this->view->assign( 'pager', $logs );
+
+        $this->view->display( 'sec-viewer/read.tpl' );
+    }
+
+
+}
+
+?>
\ No newline at end of file
diff --git a/application/controllers/SwitchController.php b/application/controllers/SwitchController.php
new file mode 100644
index 000000000..d48a83207
--- /dev/null
+++ b/application/controllers/SwitchController.php
@@ -0,0 +1,167 @@
+frontend['defaultOrdering'] = 'name';
+        $this->frontend['model']           = 'SwitchTable';
+        $this->frontend['name']            = 'Switch';
+        $this->frontend['pageTitle']       = 'Switches';
+
+        $this->frontend['columns'] = array(
+
+            'displayColumns' => array( 'id', 'name', 'switchtype', 'cabinet', 'infrastructure', 'ipv4addr', 'vendorid', 'model', 'active' ),
+
+            'viewPanelRows'  => array( 'name', 'cabinet', 'ipv4addr', 'ipv6addr', 'snmppasswd', 'switchtype', 'vendorid', 'model', 'active', 'notes' ),
+            'viewPanelTitle' => 'name',
+
+            'sortDefaults' => array(
+                'column' => 'name',
+                'order'  => 'desc'
+            ),
+
+            'id' => array(
+                'label' => 'ID',
+                'hidden' => true
+            ),
+
+
+            'name' => array(
+                'label' => 'Name',
+                'sortable' => 'true',
+            ),
+
+            'cabinet' => array(
+                'type' => 'hasOne',
+                'model' => 'Cabinet',
+                'controller' => 'cabinet',
+                'field' => 'name',
+                'label' => 'Cabinet',
+                'sortable' => true
+            ),
+
+            'infrastructure' => array(
+                'label' => 'Infrastructure',
+                'sortable' => true
+            ),
+
+            'ipv4addr' => array(
+                'label' => 'IPv4 Address',
+                'sortable' => true
+            ),
+
+            'ipv6addr' => array(
+                'label' => 'IPv6 Address',
+                'sortable' => true
+            ),
+
+            'snmppasswd' => array(
+                'label' => 'SNMP Password',
+                'sortable' => false
+            ),
+
+            'switchtype' => array(
+                'label' => 'Switch Type',
+                'sortable' => true,
+                'type' => 'xlate',
+                'xlator' => SwitchTable::$SWITCHTYPES_TEXT
+            ),
+
+            'vendorid' => array(
+                'type' => 'hasOne',
+                'model' => 'Vendor',
+                'controller' => 'vendor',
+                'field' => 'name',
+                'label' => 'Vendor',
+                'sortable' => true
+            ),
+
+            'model' => array(
+                'label' => 'Model',
+                'sortable' => true
+            ),
+
+            'active' => array(
+                'label' => 'Active',
+                'sortable' => true
+            ),
+
+            'notes' => array(
+                'label' => 'Notes',
+                'sortable' => false
+            )
+        );
+
+        parent::feInit();
+    }
+
+
+    function portReportAction()
+    {
+        $switch = Doctrine_Core::getTable( 'SwitchTable' )->find( $this->_getParam( 'id' ) );
+
+        if( !$switch )
+        {
+            $this->view->message = new INEX_Message( 'Invalid switch', INEX_Message::MESSAGE_TYPE_ERROR );
+            return( $this->_forward( 'list' ) );
+        }
+
+        // load switch ports
+        $ports = Doctrine_Query::create()
+            ->from( 'Switchport sp' )
+            ->where( 'sp.switchid = ?', $switch['id'] )
+            ->orderBy( 'sp.id ASC' )
+            ->execute( null, Doctrine_Core::HYDRATE_ARRAY );
+
+        // add in customer details.
+        // FIXME: there a better way of doing this
+        foreach( $ports as $i => $p )
+        {
+            $ports[$i]['connection'] = Doctrine_Query::create()
+                ->from( 'Physicalinterface p' )
+                ->leftJoin( 'p.Virtualinterface v' )
+                ->leftJoin( 'v.Cust c' )
+                ->where( 'p.switchportid = ?', $p['id'] )
+                ->fetchOne( null, Doctrine_Core::HYDRATE_ARRAY );
+
+            $ports[$i]['type'] = Switchport::$TYPE_TEXT[ $p['type'] ];
+        }
+
+        //echo '
'; print_r( $ports );die();
+
+        $this->view->ports = $ports;
+        $this->view->display( 'switch/port-report.tpl' );
+    }
+}
+
+?>
\ No newline at end of file
diff --git a/application/controllers/SwitchPortController.php b/application/controllers/SwitchPortController.php
new file mode 100644
index 000000000..d3ab33b5b
--- /dev/null
+++ b/application/controllers/SwitchPortController.php
@@ -0,0 +1,86 @@
+frontend['defaultOrdering'] = 'name';
+        $this->frontend['model']           = 'Switchport';
+        $this->frontend['name']            = 'SwitchPort';
+        $this->frontend['pageTitle']       = 'Switch Ports';
+
+        $this->frontend['columns'] = array(
+
+            'displayColumns' => array( 'id', 'name', 'type', 'switchid' ),
+
+            'viewPanelRows'  => array( 'name', 'type', 'switchid' ),
+            'viewPanelTitle' => 'name',
+
+            'sortDefaults' => array(
+                'column' => 'name',
+                'order'  => 'desc'
+            ),
+
+            'id' => array(
+                'label' => 'ID',
+                'hidden' => true
+            ),
+
+            'name' => array(
+                'label' => 'Name',
+                'sortable' => 'true',
+            ),
+
+            'type' => array(
+                'label' => 'Type',
+                'sortable' => true,
+                'type' => 'xlate',
+                'xlator' => Switchport::$TYPE_TEXT
+            ),
+
+            'switchid' => array(
+                'type' => 'hasOne',
+                'model' => 'SwitchTable',
+                'controller' => 'switch',
+                'field' => 'name',
+                'label' => 'Switch',
+                'sortable' => true
+            )
+
+        );
+
+        parent::feInit();
+    }
+
+}
+
+?>
\ No newline at end of file
diff --git a/application/controllers/UserController.php b/application/controllers/UserController.php
new file mode 100644
index 000000000..cc306f3c0
--- /dev/null
+++ b/application/controllers/UserController.php
@@ -0,0 +1,229 @@
+frontend[ 'defaultOrdering' ] = 'name';
+        $this->frontend[ 'model' ] = 'User';
+        $this->frontend[ 'name' ] = 'User';
+        $this->frontend[ 'pageTitle' ] = 'Users';
+
+        $this->frontend[ 'columns' ] = array(
+
+            'displayColumns' => array(
+                'id', 'username', 'password', 'email', 'authorisedMobile', 'custid', 'privs', 'disabled'
+            ),
+
+	        'viewPanelRows' => array(
+	            'username', 'password', 'email', 'authorisedMobile', 'custid', 'privs', 'disabled'
+	        ),
+
+	        'viewPanelTitle' => 'username',
+
+	        'sortDefaults' => array(
+	            'column' => 'username', 'order' => 'asc'
+	        ),
+
+	        'id' => array(
+	            'label' => 'ID', 'hidden' => true
+	        ),
+
+
+	        'username' => array(
+	            'label' => 'Username', 'sortable' => true
+	        ),
+
+	        'password' => array(
+	            'label' => 'Password', 'sortable' => true
+	        ),
+
+	        'email' => array(
+	            'label' => 'E-mail', 'sortable' => true
+	        ),
+
+	        'authorisedMobile' => array(
+	            'label' => 'Authorised Mobile', 'sortable' => false
+	        ),
+
+	        'custid' => array(
+	            'type' => 'hasOne', 'model' => 'Cust', 'controller' => 'customer', 'field' => 'name', 'label' => 'Customer', 'sortable' => true
+	        ),
+
+	        'privs' => array(
+	            'label' => 'Privileges', 'sortable' => true, 'type' => 'xlate', 'xlator' => User::$PRIVILEGES_TEXT
+	        ),
+
+	        'disabled' => array(
+	            'label' => 'Disabled', 'sortable' => true
+	        )
+        );
+
+        parent::feInit();
+    }
+
+    /**
+     * Checks / actions before we try and validate the form
+     */
+    protected function formPrevalidate( $form, $isEdit )
+    {
+        // If we're a super user, then the length of the username is up to us
+        if( $this->user['privs'] == User::AUTH_SUPERUSER )
+            $form->getElement( 'username' )->removeValidator( 'stringLength' );
+    }
+
+    /**
+     * Additional checks when a new object is being added.
+     */
+    protected function formValidateForAdd( $form )
+    {
+
+        // is there already a user with this username?
+        if( Doctrine::getTable( $this->getModelName() )->findOneByUsername( $form->getValue( 'username' ) ) ) {
+            $form->getElement( 'username' )->addError( 'This username is not available' );
+            return false;
+        }
+
+
+    }
+
+
+    /**
+     * If we're adding or editing a user, set the parent_id accordingly
+     *
+     * @param Doctrine_Record $object The object being built for adding or edited
+     * @param bool $isEdit True if this is an edit, false if it's an add
+     * @param Zend_Form $form The submitted add / edit form
+     */
+    protected function addEditPreSave( $object, $isEdit, $form )
+    {
+        if( $object['privs'] == User::AUTH_CUSTUSER && $user = Doctrine::getTable( 'User' )->findOneByCustidAndPrivs( $form->getValue( 'custid' ), User::AUTH_CUSTADMIN ) )
+            $object['Parent'] = $user;
+    }
+
+    /**
+     * Send the user a message by SMS
+     */
+    protected function sendSmsAction()
+    {
+        $options = $this->_bootstrap->getApplication()->getOptions();
+
+        if( $this->getRequest()->getParam( 'id' ) !== NULL && is_numeric( $this->getRequest()->getParam( 'id' ) ) ) {
+            // is the ID valid?
+            if( !($object = Doctrine::getTable( $this->frontend[ 'model' ] )->find( $this->getRequest()->getParam( 'id' ) )) ) {
+                echo "0:Err:No entry with ID: " . $this->getRequest()->getParam( 'id' );
+                return false;
+            }
+
+            // we actually don't use the ID at all in the end!
+            if( $this->getRequest()->getParam( 'to' ) !== NULL && is_numeric( $this->getRequest()->getParam( 'to' ) ) && $this->getRequest()->getParam( 'message' ) !== NULL && strlen( $this->getRequest()->getParam( 'message' ) ) > 5 )
+            {
+
+                $sms = new INEX_SMS_Clickatell(
+                        $options['sms']['clickatell']['username'],
+                        $options['sms']['clickatell']['password'],
+                        $options['sms']['clickatell']['api_id'],
+                        $options['sms']['clickatell']['sender_id']
+                );
+
+                if( $sms->send( $this->getRequest()->getParam( 'to' ), stripslashes( $this->getRequest()->getParam( 'message' ) ) ) )
+                    echo "1:SMS successfully sent ({$sms->apiResponse})";
+                else
+                    echo "0:{$sms->apiResponse}";
+            }
+            else {
+                echo '0:Err:One or more of your submitted parameters were incorrect.';
+            }
+
+        }
+    }
+
+    /**
+     * Send the user an email by SMS
+     */
+    protected function sendEmailAction()
+    {
+        $options = $this->_bootstrap->getApplication()->getOptions();
+
+        if( $this->getRequest()->getParam( 'id' ) !== NULL && is_numeric( $this->getRequest()->getParam( 'id' ) ) ) {
+            // is the ID valid?
+            if( !($object = Doctrine::getTable( $this->frontend[ 'model' ] )->find( $this->getRequest()->getParam( 'id' ) )) ) {
+                echo "0:Err:No entry with ID: " . $this->getRequest()->getParam( 'id' );
+                return false;
+            }
+
+            // we actually don't use the ID at all in the end!
+            if( $this->getRequest()->getParam( 'to' ) !== NULL && $this->getRequest()->getParam( 'message' ) !== NULL && strlen( $this->getRequest()->getParam( 'message' ) ) > 5 ) {
+                try {
+                    $mail = new Zend_Mail( );
+                    $mail->setBodyHtml( stripslashes( $this->getRequest()->getParam( 'message' ) ) )
+                         ->setFrom( $options['identity']['email'], $options['identity']['name'] )
+                         ->addTo( $this->getRequest()->getParam( 'to' ) )
+                         ->setSubject( $this->getRequest()->getParam( 'to' ) )
+                         ->send();
+
+                    echo "1:Email successfully sent";
+                }
+                catch( Zend_Exception $e ) {
+                    echo '0:' . $e->getMessage();
+                }
+            }
+            else {
+                echo '0:Err:One or more of your submitted parameters were incorrect.
' . $this->getRequest()->getParam( 'message' ) . '
'; + } + + } + } + + /** + * Show the last users to login + * + * Named for the UNIX 'last' command + */ + public function lastAction() + { + $last = Doctrine_Query::create() + ->select( 'up.attribute, up.value, u.username, c.shortname' ) + ->from( 'UserPref up' ) + ->leftJoin( 'up.User u' ) + ->leftJoin( 'u.Cust c' ) + ->where( 'up.attribute = ?', 'auth.last_login_at' ) + ->orderBy( 'up.value DESC' ) + ->execute( null, Doctrine_Core::HYDRATE_SCALAR ); + + $this->view->last = $last; + $this->view->display( 'user/last.tpl' ); + } +} + +?> \ No newline at end of file diff --git a/application/controllers/UtilsController.php b/application/controllers/UtilsController.php new file mode 100644 index 000000000..fe51cb304 --- /dev/null +++ b/application/controllers/UtilsController.php @@ -0,0 +1,77 @@ +identity ) + $this->_redirect( 'auth/login' ); + else if( $this->user->privs != User::AUTH_SUPERUSER ) + { + $this->view->message = new INEX_Message( + "You must be an administrator to access this page. This attempt to access private and " + . "secure sections of the site has been recorded and our administrators alerted.", + INEX_Message::MESSAGE_TYPE_ERROR + ); + + $this->logger->alert( $this->user->username . " tried to access utils without sufficient permissions" ); + + Zend_Session::destroy( true, true ); + + $this->_forward( 'login', 'auth' ); + return false; + } + + } + + + /** + * Display apcinfo() + */ + public function apcinfoAction() + { + $BU = Zend_Controller_Front::getInstance()->getBaseUrl() . '/utils/apcinfo'; + + require( APPLICATION_PATH . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'library' . DIRECTORY_SEPARATOR . 'apcinfo.php' ); + } + + /** + * Display phpinfo() + */ + public function phpinfoAction() + { + phpinfo(); + } +} + diff --git a/application/controllers/VendorController.php b/application/controllers/VendorController.php new file mode 100644 index 000000000..53e8a5794 --- /dev/null +++ b/application/controllers/VendorController.php @@ -0,0 +1,70 @@ +frontend['defaultOrdering'] = 'name'; + $this->frontend['model'] = 'Vendor'; + $this->frontend['name'] = 'Vendor'; + $this->frontend['pageTitle'] = 'Vendors'; + + $this->frontend['columns'] = array( + + 'displayColumns' => array( 'id', 'name' ), + + 'viewPanelRows' => array(), + 'viewPanelTitle' => 'name', + + 'sortDefaults' => array( + 'column' => 'name', + 'order' => 'desc' + ), + + 'id' => array( + 'label' => 'ID', + 'hidden' => true + ), + + 'name' => array( + 'label' => 'Name', + 'sortable' => 'true', + ) + ); + + parent::feInit(); + + } + +} + +?> \ No newline at end of file diff --git a/application/controllers/VirtualInterfaceController.php b/application/controllers/VirtualInterfaceController.php new file mode 100644 index 000000000..e559c02bc --- /dev/null +++ b/application/controllers/VirtualInterfaceController.php @@ -0,0 +1,177 @@ +frontend['defaultOrdering'] = 'name'; + $this->frontend['model'] = 'Virtualinterface'; + $this->frontend['name'] = 'VirtualInterface'; + $this->frontend['pageTitle'] = 'Virtual Interfaces'; + + $this->frontend['columns'] = array( 'ignoreme' ); + + parent::feInit(); + } + + /** + * If deleting a virtual interface, we should also the delete the physical and vlan interfaces + * if they exist. + * + */ + protected function preDelete( $object = null ) + { + if( ( $oid = $this->getRequest()->getParam( 'id', null ) ) === null ) + return false; + + if( !( $vint = Doctrine::getTable( $this->getModelName() )->find( $oid ) ) ) + return false; + + foreach( $vint->Physicalinterface as $pi ) + { + $this->logger->notice( "Deleting physical interface with id #{$pi->id} while deleting virtual interface #{$vint->id}" ); + $pi->delete(); + } + + foreach( $vint->Vlaninterface as $vl ) + { + $this->logger->notice( "Deleting vlan interface with id #{$vl['id']} while deleting virtual interface #{$vint['id']}" ); + $vl->delete(); + } + } + + + //addEditPreDisplay + function addEditPreDisplay( $form ) + { + // did we get a customer id from the provisioning controller? + if( $this->_getParam( 'prov_cust_id', false ) ) + { + $form->getElement( 'custid' )->setValue( $this->_getParam( 'prov_cust_id' ) ); + + $form->getElement( 'cancel' )->setAttrib( 'onClick', + "parent.location='" . $this->config['identity']['ixp']['url'] + . '/provision/interface-overview/id/' . $this->session->provisioning_interface_active_id . "'" + ); + } + + $dataQuery1 = Doctrine_Query::create() + ->from( 'Physicalinterface pi' ) + ->leftJoin( 'pi.Switchport sp' ) + ->leftJoin( 'sp.SwitchTable s' ) + ->leftJoin( 's.Cabinet cb' ) + ->leftJoin( 'cb.Location l' ) + ->where( 'pi.Virtualinterface.id = ?', $this->getRequest()->getParam( 'id' ) ); + + $this->view->phyInts = $dataQuery1->execute(); + + $dataQuery2 = Doctrine_Query::create() + ->from( 'Vlaninterface vli' ) + ->leftJoin( 'vli.Virtualinterface vi' ) + ->leftJoin( 'vli.Ipv4address v4' ) + ->leftJoin( 'vli.Ipv6address v6' ) + ->leftJoin( 'vli.Vlan v' ) + ->where( 'vi.id = ?', $this->getRequest()->getParam( 'id' ) ); + + $this->view->vlanInts = $dataQuery2->execute(); + + } + + + /** + * A generic action to list the elements of a database (as represented + * by a Doctrine model) via Smarty templates. + */ + public function getDataAction() + { + $dataQuery = Doctrine_Query::create() + ->from( 'Virtualinterface vi' ) + ->leftJoin( 'vi.Cust c' ) + ->leftJoin( 'vi.Physicalinterface pi' ) + ->leftJoin( 'pi.Switchport sp' ) + ->leftJoin( 'sp.SwitchTable s' ) + ->leftJoin( 's.Cabinet cb' ) + ->leftJoin( 'cb.Location l' ) + ->orderBy( 'c.shortname ASC' ); + + if( $this->getRequest()->getParam( 'member' ) !== NULL ) + $dataQuery->andWhere( 'c.name LIKE ?', $this->getRequest()->getParam( 'member' ) . '%' ); + + if( $this->getRequest()->getParam( 'shortname' ) !== NULL ) + $dataQuery->andWhere( 'c.shortname LIKE ?', $this->getRequest()->getParam( 'shortname' ) . '%' ); + + + $rows = $dataQuery->execute(); + + // FIXME :: below assumes a single physical interface for a virtual interface so port channels are not catered for + + $count = 0; + $data = ''; + foreach( $rows as $row ) + { + if( $count > 0 ) + $data .= ','; + + $count++; + + $data .= <<frontend['defaultOrdering'] = 'name'; + $this->frontend['model'] = 'Vlan'; + $this->frontend['name'] = 'VLAN'; + $this->frontend['pageTitle'] = 'VLANs'; + + $this->frontend['columns'] = array( + + 'displayColumns' => array( 'id', 'name', 'number', 'rcvrfname' ), + + 'viewPanelRows' => array( 'name', 'number', 'rcvrfname', 'notes' ), + + 'viewPanelTitle' => 'name', + + 'sortDefaults' => array( + 'column' => 'name', + 'order' => 'desc' + ), + + 'id' => array( + 'label' => 'ID', + 'hidden' => true + ), + + + 'name' => array( + 'label' => 'Name', + 'sortable' => 'true', + ), + + 'number' => array( + 'label' => 'Number', + 'sortable' => 'true', + ), + + 'rcvrfname' => array( + 'label' => 'RC VRF Name', + 'sortable' => 'true', + ), + + 'notes' => array( + 'label' => 'Notes', + 'sortable' => false + ), + + ); + + parent::feInit(); + } + +} + +?> \ No newline at end of file diff --git a/application/controllers/VlanInterfaceController.php b/application/controllers/VlanInterfaceController.php new file mode 100644 index 000000000..5eb9d70e3 --- /dev/null +++ b/application/controllers/VlanInterfaceController.php @@ -0,0 +1,215 @@ +frontend['defaultOrdering'] = 'name'; + $this->frontend['model'] = 'Vlaninterface'; + $this->frontend['name'] = 'VlanInterface'; + $this->frontend['pageTitle'] = 'VLAN Interfaces'; + + $this->frontend['columns'] = array( + + 'displayColumns' => array( 'id', 'vlanName', 'vlanTag', 'ipv4Address', 'ipv6Address', 'custShortname' ), + + 'viewPanelRows' => array( 'custName', 'vlanName', 'vlanTag', + 'ipv4enabled', 'ipv4Address', 'ipv4hostname', + 'ipv6enabled', 'ipv6Address', 'ipv6hostname', + 'mcastenabled', + 'bgpmd5secret', 'ipv4bgpmd5secret', 'ipv6bgpmd5secret', 'maxbgpprefix', + 'rsclient', 'ipv4canping', 'ipv6canping', + 'ipv4monitorrcbgp', 'ipv6monitorrcbgp', 'as112client', 'busyhost', 'notes' + ), + + 'sortDefaults' => array( + 'column' => 'vlanName', + 'order' => 'desc' + ), + + 'id' => array( + 'label' => 'ID', + 'hidden' => true + ), + + 'vlanName' => array( + 'type' => 'hasOne', + 'model' => 'Vlan', + 'controller' => 'vlan', + 'field' => 'name', + 'label' => 'VLAN Name', + 'sortable' => true + ), + + 'vlanTag' => array( + 'type' => 'hasOne', + 'model' => 'Vlan', + 'controller' => 'vlan', + 'field' => 'number', + 'label' => 'VLAN Tag', + 'sortable' => true + ), + + 'ipv4Address' => array( + 'type' => 'hasOne', + 'model' => 'Ipv4address', + 'controller' => 'ipv4-address', + 'field' => 'address', + 'label' => 'IPv4 Address', + 'sortable' => true + ), + + 'ipv6Address' => array( + 'type' => 'hasOne', + 'model' => 'Ipv6address', + 'controller' => 'ipv6-address', + 'field' => 'address', + 'label' => 'IPv6 Address', + 'sortable' => true + ), + + 'custShortname' => array( + 'type' => 'l2HasOne', + 'l1model' => 'Virtualinterface', + 'l1controller' => 'virtual-interface', + 'l2model' => 'Cust', + 'l2controller' => 'customer', + 'field' => 'shortname', + 'label' => 'Member', + 'sortable' => true + ), + + 'custName' => array( + 'type' => 'l2HasOne', + 'l1model' => 'Virtualinterface', + 'l1controller' => 'virtual-interface', + 'l2model' => 'Cust', + 'l2controller' => 'customer', + 'field' => 'name', + 'label' => 'Member', + 'sortable' => true + ), + + 'ipv4enabled' => array( + 'label' => 'IPv4 Enabled' + ), + + 'ipv4hostname' => array( + 'label' => 'IPv4 Hostname' + ), + + 'ipv6enabled' => array( + 'label' => 'IPv6 Enabled' + ), + + 'ipv6hostname' => array( + 'label' => 'IPv6 Hostname' + ), + + 'mcastenabled' => array( + 'label' => 'Multicast Enabled' + ), + + 'bgpmd5secret' => array( + 'label' => 'BGP MD5 Secret' + ), + + 'ipv6bgpmd5secret' => array( + 'label' => 'IPv6 BGP MD5 Secret' + ), + + 'ipv4bgpmd5secret' => array( + 'label' => 'IPv4 BGP MD5 Secret' + ), + + 'maxbgpprefix' => array( + 'label' => 'Max BGP Prefix' + ), + + 'rsclient' => array( + 'label' => 'Route Server Client' + ), + + 'ipv4canping' => array( + 'label' => 'IPv4 Can Ping?' + ), + + 'ipv6canping' => array( + 'label' => 'IPv6 Can Ping?' + ), + + 'ipv4monitorrcbgp' => array( + 'label' => 'IPv4 Monitor RC BGP' + ), + + 'ipv6monitorrcbgp' => array( + 'label' => 'IPv6 Monitor RC BGP' + ), + + 'as112client' => array( + 'label' => 'AS112 Client' + ), + + 'busyhost' => array( + 'label' => 'Busy host' + ), + + 'notes' => array( + 'label' => 'Notes' + ) + + ); + + parent::feInit(); + } + + + //addEditPreDisplay + function addEditPreDisplay( $form ) + { + // did we get an id from the provisioning controller? + if( $this->_getParam( 'prov_virtualinterface_id', false ) ) + { + $form->getElement( 'cancel' )->setAttrib( 'onClick', + "parent.location='" . $this->config['identity']['ixp']['url'] + . '/provision/interface-overview/id/' . $this->session->provisioning_interface_active_id . "'" + ); + } + + if( $this->getRequest()->getParam( 'virtualinterfaceid' ) !== null ) + { + $form->getElement( 'virtualinterfaceid' )->setValue( $this->getRequest()->getParam( 'virtualinterfaceid' ) ); + } + } +} + +?> \ No newline at end of file diff --git a/application/models/Bgpsessiondata.php b/application/models/Bgpsessiondata.php new file mode 100644 index 000000000..5f9ae0bb9 --- /dev/null +++ b/application/models/Bgpsessiondata.php @@ -0,0 +1,40 @@ + + * @author Barry O'Donovan + */ +class Bgpsessiondata extends BaseBgpsessiondata +{ + +} \ No newline at end of file diff --git a/application/models/BgpsessiondataTable.php b/application/models/BgpsessiondataTable.php new file mode 100644 index 000000000..4de3894ba --- /dev/null +++ b/application/models/BgpsessiondataTable.php @@ -0,0 +1,36 @@ + + * @author Barry O'Donovan + */ +class BgpsessiondataTable extends Doctrine_Table +{ + +} \ No newline at end of file diff --git a/application/models/Cabinet.php b/application/models/Cabinet.php new file mode 100644 index 000000000..041de1ed9 --- /dev/null +++ b/application/models/Cabinet.php @@ -0,0 +1,47 @@ + + * @author Barry O'Donovan + */ +class Cabinet extends BaseCabinet +{ + + public function setUp() + { + parent::setUp(); + + $this->hasOne( 'Location', array( 'local' => 'locationid', 'foreign' => 'id') ); + } + +} \ No newline at end of file diff --git a/application/models/CabinetTable.php b/application/models/CabinetTable.php new file mode 100644 index 000000000..602f5612f --- /dev/null +++ b/application/models/CabinetTable.php @@ -0,0 +1,36 @@ + + * @author Barry O'Donovan + */ +class CabinetTable extends Doctrine_Table +{ + +} \ No newline at end of file diff --git a/application/models/ChangeLog.php b/application/models/ChangeLog.php new file mode 100644 index 000000000..e8989a97b --- /dev/null +++ b/application/models/ChangeLog.php @@ -0,0 +1,63 @@ + + * @version SVN: $Id: ChangeLog.php 446 2011-05-26 13:40:19Z barryo $ + */ +/** + * + * Auto-generated Doctrine ORM File + * + * @category ORM + * @package IXP_ORM_Models + * @copyright Copyright 2008 - 2010 Internet Neutral Exchange Association Limited + * @author Barry O'Donovan + */ +class ChangeLog extends BaseChangeLog +{ + + public function setUp() + { + parent::setUp(); + + $this->actAs( + 'Timestampable', + array( + 'updated' => array( + 'disabled' => true + ) + ) + ); + + $this->hasOne( 'User', array( 'local' => 'created_by', 'foreign' => 'id' ) ); + } + +} \ No newline at end of file diff --git a/application/models/ChangeLogTable.php b/application/models/ChangeLogTable.php new file mode 100644 index 000000000..464336148 --- /dev/null +++ b/application/models/ChangeLogTable.php @@ -0,0 +1,95 @@ + + * @author Barry O'Donovan + */ +class ChangeLogTable extends Doctrine_Table +{ + /** + * Returns an instance of this class. + * + * @return object ChangeLogTable + */ + public static function getInstance() + { + return Doctrine_Core::getTable('ChangeLog'); + } + + + /** + * Get updates for a user from a given date + * + * @param $priv int The privilege level to check for (and lesser privileges) + * @param $dateFrom string The date and time (YYYY-MM-DD HH:MM:SS) from when to search the change log or false to indicate 'from the start' + * @param $hydrateMethod int The Doctrine hydration method (defaults to HYDRATE_RECORD) + * @return array An array of associate records or Doctrine objects + */ + public static function getUpdates( $priv = 0, $dateFrom = false, $hydrateMethod = Doctrine_Core::HYDRATE_RECORD ) + { + $entries = Doctrine_Query::create() + ->select( 'cl.*' ) + ->addSelect( 'u.username' ) + ->from( 'ChangeLog cl' ) + ->leftJoin( 'cl.User u' ) + ->where( 'cl.visibility <= ?', $priv ) + ->orderBy( 'cl.livedate DESC' ); + + if( $dateFrom !== false ) + $entries->andWhere( 'cl.created_at >= ?', $dateFrom ); + + return $entries->execute( null, $hydrateMethod ); + } + + /** + * Does the given user have unseen updates on the change log? + * + * @param $priv int The privilege level to check for (and lesser privileges) + * @param $dateFrom string The date and time (YYYY-MM-DD HH:MM:SS) from when to search the change log or false to indicate 'from the start' + * @return int The number of entries available (0 can be used to evalaute as false, >0 for true) + */ + public static function hasUpdates( $priv = 0, $dateFrom = false ) + { + $count = Doctrine_Query::create() + ->select( 'COUNT(cl.id)' ) + ->from( 'ChangeLog cl' ) + ->where( 'cl.visibility <= ?', $priv ); + + if( $dateFrom !== false ) + $count->andWhere( 'cl.created_at >= ?', $dateFrom ); + + return $count->fetchOne( null, Doctrine_Core::HYDRATE_SINGLE_SCALAR ); + } +} diff --git a/application/models/Consoleserverconnection.php b/application/models/Consoleserverconnection.php new file mode 100644 index 000000000..d7d9e0f81 --- /dev/null +++ b/application/models/Consoleserverconnection.php @@ -0,0 +1,47 @@ + + * @author Barry O'Donovan + */ +class Consoleserverconnection extends BaseConsoleserverconnection +{ + public function setUp() + { + parent::setUp(); + + $this->hasOne( 'Cust', array( 'local' => 'custid', 'foreign' => 'id') ); + $this->hasOne( 'SwitchTable', array( 'local' => 'switchid', 'foreign' => 'id') ); + } + +} \ No newline at end of file diff --git a/application/models/ConsoleserverconnectionSeq.php b/application/models/ConsoleserverconnectionSeq.php new file mode 100644 index 000000000..fbcc62235 --- /dev/null +++ b/application/models/ConsoleserverconnectionSeq.php @@ -0,0 +1,40 @@ + + * @author Barry O'Donovan + */ +class ConsoleserverconnectionSeq extends BaseConsoleserverconnectionSeq +{ + +} \ No newline at end of file diff --git a/application/models/ConsoleserverconnectionSeqTable.php b/application/models/ConsoleserverconnectionSeqTable.php new file mode 100644 index 000000000..81f0927b2 --- /dev/null +++ b/application/models/ConsoleserverconnectionSeqTable.php @@ -0,0 +1,36 @@ + + * @author Barry O'Donovan + */ +class ConsoleserverconnectionSeqTable extends Doctrine_Table +{ + +} \ No newline at end of file diff --git a/application/models/ConsoleserverconnectionTable.php b/application/models/ConsoleserverconnectionTable.php new file mode 100644 index 000000000..075aeced9 --- /dev/null +++ b/application/models/ConsoleserverconnectionTable.php @@ -0,0 +1,36 @@ + + * @author Barry O'Donovan + */ +class ConsoleserverconnectionTable extends Doctrine_Table +{ + +} \ No newline at end of file diff --git a/application/models/Contact.php b/application/models/Contact.php new file mode 100644 index 000000000..e41a2a112 --- /dev/null +++ b/application/models/Contact.php @@ -0,0 +1,47 @@ + + * @author Barry O'Donovan + */ +class Contact extends BaseContact +{ + + public function setUp() + { + parent::setUp(); + + $this->hasOne( 'Cust', array( 'local' => 'custid', 'foreign' => 'id') ); + } + +} \ No newline at end of file diff --git a/application/models/ContactSeq.php b/application/models/ContactSeq.php new file mode 100644 index 000000000..0c0ce3ebc --- /dev/null +++ b/application/models/ContactSeq.php @@ -0,0 +1,40 @@ + + * @author Barry O'Donovan + */ +class ContactSeq extends BaseContactSeq +{ + +} \ No newline at end of file diff --git a/application/models/ContactSeqTable.php b/application/models/ContactSeqTable.php new file mode 100644 index 000000000..a024ee1e7 --- /dev/null +++ b/application/models/ContactSeqTable.php @@ -0,0 +1,36 @@ + + * @author Barry O'Donovan + */ +class ContactSeqTable extends Doctrine_Table +{ + +} \ No newline at end of file diff --git a/application/models/ContactTable.php b/application/models/ContactTable.php new file mode 100644 index 000000000..5e4351448 --- /dev/null +++ b/application/models/ContactTable.php @@ -0,0 +1,36 @@ + + * @author Barry O'Donovan + */ +class ContactTable extends Doctrine_Table +{ + +} \ No newline at end of file diff --git a/application/models/Cust.php b/application/models/Cust.php new file mode 100644 index 000000000..5ce4d9333 --- /dev/null +++ b/application/models/Cust.php @@ -0,0 +1,199 @@ + + * @author Barry O'Donovan + */ +class Cust extends BaseCust +{ + + const TYPE_FULL = 1; + const TYPE_ASSOCIATE = 2; + const TYPE_INTERNAL = 3; + const TYPE_PROBONO = 4; + + public static $CUST_TYPES_TEXT = array( + Cust::TYPE_FULL => 'Full', + Cust::TYPE_ASSOCIATE => 'Associate', + Cust::TYPE_INTERNAL => 'Internal', + Cust::TYPE_PROBONO => 'Pro-bono' + ); + + + const STATUS_NORMAL = 1; + const STATUS_NOTCONNECTED = 2; + const STATUS_SUSPENDED = 3; + + public static $CUST_STATUS_TEXT = array( + Cust::STATUS_NORMAL => 'Normal', + Cust::STATUS_NOTCONNECTED => 'Not Connected', + Cust::STATUS_SUSPENDED => 'Suspended', + ); + + + public function setUp() + { + $this->hasMany( + 'User', + array( + 'local' => 'id', + 'foreign' => 'custid' + ) + ); + + $this->hasOne( + 'Irrdbconfig', + array( + 'local' => 'irrdb', + 'foreign' => 'id' + ) + ); + } + + /** + * Turn a type integer into its descriptive string + * + * @param $type int If null, then the type of $this object. + * @return string The descriptive member type + */ + public function getMemberTypeString( $type = null ) + { + return Cust::$CUST_TYPES_TEXT[ ( $type === null ? $this['type'] : $type )]; + } + + /** + * Turn a status integer into its descriptive string + * + * @param $type int If null, then the status of $this object. + * @return string The descriptive member status + */ + public function getMemberStatusString( $status = null ) + { + return Cust::$CUST_STATUS_TEXT[ ( $status === null ? $this['status'] : $status )]; + } + + /** + * Return a Doctrine result of the users IXP connections. + */ + public function getConnections() + { + return Doctrine_Query::create() + ->from( 'Virtualinterface vi' ) + ->leftJoin( 'vi.Cust c' ) + ->leftJoin( 'vi.Physicalinterface pi' ) + ->leftJoin( 'vi.Vlaninterface vli' ) + ->leftJoin( 'vli.Ipv4address v4' ) + ->leftJoin( 'vli.Ipv6address v6' ) + ->leftJoin( 'vli.Vlan v' ) + ->leftJoin( 'pi.Switchport sp' ) + ->leftJoin( 'sp.SwitchTable s' ) + ->leftJoin( 's.Cabinet cb' ) + ->leftJoin( 'cb.Location l' ) + ->where( 'c.id = ?', $this->id ) + ->orderBy( 'pi.monitorindex' ) + ->execute(); + } + + /** + * Method to check if the customer is a route server client. + * + * @return bool True if the customer is a route server client + * @throws INEX_Exception + * + */ + public function isRouteServerClient( $vlan = null ) + { + if( $vlan === null ) + throw new INEX_Exception( 'Cust->isRouteServerClient() needs a VLAN tag' ); + + $rsClient = false; + foreach( $this->getConnections() as $connection ) + { + foreach( $connection->Vlaninterface as $interface ) + { + if( $interface->Vlan->number == $vlan && $interface->rsclient == 1 ) + { + $rsClient = true; + break 2; + } + } + } + + return $rsClient; + } + + + /** + * Method to check is the customer is an AS112 service client. + * + * SHORTCOMING: Only looks at the primary peering LAN + * + * @return bool True if the customer is an As112 client + * + */ + public function isAS112Client() + { + $as112Enabled = true; + foreach( $this->getConnections() as $connection ) + foreach( $connection->Vlaninterface as $interface ) + if( $interface->Vlan->number == 10 && $interface->as112client == 0 ) + { + $as112Enabled = false; + break 2; + } + + return $as112Enabled; + } + + /** + * Method to see if the customer is an associate member or not + * + * @return bool True if the customer is an associate member + */ + public function isAssociateMember() + { + return $this['type'] == self::TYPE_ASSOCIATE; + } + + /** + * Method to see if the customer is a full member or not + * + * @return bool True if the customer is a full member + */ + public function isFullMember() + { + return $this['type'] == self::TYPE_FULL || $this['type'] == self::TYPE_PROBONO; + } + + +} diff --git a/application/models/CustSeq.php b/application/models/CustSeq.php new file mode 100644 index 000000000..bdc6946c0 --- /dev/null +++ b/application/models/CustSeq.php @@ -0,0 +1,40 @@ + + * @author Barry O'Donovan + */ +class CustSeq extends BaseCustSeq +{ + +} \ No newline at end of file diff --git a/application/models/CustSeqTable.php b/application/models/CustSeqTable.php new file mode 100644 index 000000000..f9090187d --- /dev/null +++ b/application/models/CustSeqTable.php @@ -0,0 +1,36 @@ + + * @author Barry O'Donovan + */ +class CustSeqTable extends Doctrine_Table +{ + +} \ No newline at end of file diff --git a/application/models/CustTable.php b/application/models/CustTable.php new file mode 100644 index 000000000..fdaf59d3b --- /dev/null +++ b/application/models/CustTable.php @@ -0,0 +1,56 @@ + + * @author Barry O'Donovan + */ +class CustTable extends Doctrine_Table +{ + + /** + * Return an array of all customer names where the array key is the customer id. + * + * @return array An array of all customer names with the customer id as the key. + */ + public static function getAllNames() + { + $names = Doctrine_Query::create() + ->select( 'id, name' ) + ->from( 'Cust c' ) + ->orderBy( 'name ASC' ) + ->fetchArray(); + + $a = array(); + foreach( $names as $n ) + $a[$n['id']] = $n['name']; + + return $a; + } + +} \ No newline at end of file diff --git a/application/models/Custkit.php b/application/models/Custkit.php new file mode 100644 index 000000000..9468df029 --- /dev/null +++ b/application/models/Custkit.php @@ -0,0 +1,46 @@ + + * @author Barry O'Donovan + */ +class Custkit extends BaseCustkit +{ + public function setUp() + { + parent::setUp(); + + $this->hasOne( 'Cabinet', array( 'local' => 'cabinetid', 'foreign' => 'id') ); + $this->hasOne( 'Cust', array( 'local' => 'custid', 'foreign' => 'id') ); + } +} \ No newline at end of file diff --git a/application/models/CustkitTable.php b/application/models/CustkitTable.php new file mode 100644 index 000000000..060c67070 --- /dev/null +++ b/application/models/CustkitTable.php @@ -0,0 +1,36 @@ + + * @author Barry O'Donovan + */ +class CustkitTable extends Doctrine_Table +{ + +} \ No newline at end of file diff --git a/application/models/History.php b/application/models/History.php new file mode 100644 index 000000000..1d282adda --- /dev/null +++ b/application/models/History.php @@ -0,0 +1,47 @@ + + * @version SVN: $Id: History.php 446 2011-05-26 13:40:19Z barryo $ + */ +/** + * + * Auto-generated Doctrine ORM File + * + * @category ORM + * @package IXP_ORM_Models + * @copyright Copyright 2008 - 2010 Internet Neutral Exchange Association Limited + * @author Barry O'Donovan + */ +class History extends BaseHistory +{ + +} \ No newline at end of file diff --git a/application/models/HistoryTable.php b/application/models/HistoryTable.php new file mode 100644 index 000000000..10b6cd274 --- /dev/null +++ b/application/models/HistoryTable.php @@ -0,0 +1,36 @@ + + * @author Barry O'Donovan + */ +class HistoryTable extends Doctrine_Table +{ + +} \ No newline at end of file diff --git a/application/models/Ipv4address.php b/application/models/Ipv4address.php new file mode 100644 index 000000000..d91d37c62 --- /dev/null +++ b/application/models/Ipv4address.php @@ -0,0 +1,48 @@ + + * @author Barry O'Donovan + */ +class Ipv4address extends BaseIpv4address +{ + public function setUp() + { + parent::setUp(); + + $this->hasOne( 'Vlan', array( 'local' => 'vlanid', 'foreign' => 'id') ); + $this->hasOne( 'Vlaninterface', array( 'local' => 'id', 'foreign' => 'ipv4addressid') ); + } + + +} \ No newline at end of file diff --git a/application/models/Ipv4addressTable.php b/application/models/Ipv4addressTable.php new file mode 100644 index 000000000..bd222248a --- /dev/null +++ b/application/models/Ipv4addressTable.php @@ -0,0 +1,36 @@ + + * @author Barry O'Donovan + */ +class Ipv4addressTable extends Doctrine_Table +{ + +} \ No newline at end of file diff --git a/application/models/Ipv6address.php b/application/models/Ipv6address.php new file mode 100644 index 000000000..32a4dc54c --- /dev/null +++ b/application/models/Ipv6address.php @@ -0,0 +1,47 @@ + + * @author Barry O'Donovan + */ +class Ipv6address extends BaseIpv6address +{ + public function setUp() + { + parent::setUp(); + + $this->hasOne( 'Vlan', array( 'local' => 'vlanid', 'foreign' => 'id') ); + $this->hasOne( 'Vlaninterface', array( 'local' => 'id', 'foreign' => 'ipv6addressid') ); + } + +} \ No newline at end of file diff --git a/application/models/Ipv6addressTable.php b/application/models/Ipv6addressTable.php new file mode 100644 index 000000000..2a2ae779e --- /dev/null +++ b/application/models/Ipv6addressTable.php @@ -0,0 +1,36 @@ + + * @author Barry O'Donovan + */ +class Ipv6addressTable extends Doctrine_Table +{ + +} \ No newline at end of file diff --git a/application/models/Irrdbconfig.php b/application/models/Irrdbconfig.php new file mode 100644 index 000000000..6395702aa --- /dev/null +++ b/application/models/Irrdbconfig.php @@ -0,0 +1,38 @@ + + * @version SVN: $Id: Builder.php 7490 2010-03-29 19:53:27Z jwage $ + */ +class Irrdbconfig extends BaseIrrdbconfig +{ + +} \ No newline at end of file diff --git a/application/models/IrrdbconfigTable.php b/application/models/IrrdbconfigTable.php new file mode 100644 index 000000000..9380dbf97 --- /dev/null +++ b/application/models/IrrdbconfigTable.php @@ -0,0 +1,41 @@ + + * @author Barry O'Donovan + */ +class Location extends BaseLocation +{ + +} \ No newline at end of file diff --git a/application/models/LocationTable.php b/application/models/LocationTable.php new file mode 100644 index 000000000..43934b96c --- /dev/null +++ b/application/models/LocationTable.php @@ -0,0 +1,36 @@ + + * @author Barry O'Donovan + */ +class LocationTable extends Doctrine_Table +{ + +} \ No newline at end of file diff --git a/application/models/LogicalCircuit.php b/application/models/LogicalCircuit.php new file mode 100644 index 000000000..fce5d4de6 --- /dev/null +++ b/application/models/LogicalCircuit.php @@ -0,0 +1,54 @@ + + * @version SVN: $Id: LogicalCircuit.php 446 2011-05-26 13:40:19Z barryo $ + */ +/** + * + * Auto-generated Doctrine ORM File + * + * @category ORM + * @package IXP_ORM_Models + * @copyright Copyright 2008 - 2010 Internet Neutral Exchange Association Limited + * @author Barry O'Donovan + */ +class LogicalCircuit extends BaseLogicalCircuit +{ + + public function setUp() + { + parent::setUp(); + + $this->hasOne( 'Cust', array( 'local' => 'custid', 'foreign' => 'id') ); + } + +} \ No newline at end of file diff --git a/application/models/LogicalCircuitTable.php b/application/models/LogicalCircuitTable.php new file mode 100644 index 000000000..1553cb94d --- /dev/null +++ b/application/models/LogicalCircuitTable.php @@ -0,0 +1,38 @@ + + * @author Barry O'Donovan + */ +class LogicalCircuitTable extends Doctrine_Table +{ + +} \ No newline at end of file diff --git a/application/models/Meeting.php b/application/models/Meeting.php new file mode 100644 index 000000000..a61085a05 --- /dev/null +++ b/application/models/Meeting.php @@ -0,0 +1,65 @@ + + * @version SVN: $Id: Meeting.php 446 2011-05-26 13:40:19Z barryo $ + */ +/** + * + * Auto-generated Doctrine ORM File + * + * @category ORM + * @package IXP_ORM_Models + * @copyright Copyright 2008 - 2010 Internet Neutral Exchange Association Limited + * @author Barry O'Donovan + */ +class Meeting extends BaseMeeting +{ + public function setUp() + { + parent::setUp(); + + $this->actAs( + 'Timestampable' + ); + + $this->hasOne( 'User as CreatedBy', array( 'local' => 'created_by', 'foreign' => 'id' ) ); + $this->hasOne( 'User as UpdatedBy', array( 'local' => 'updated_by', 'foreign' => 'id' ) ); + + $this->hasMany( + 'MeetingItem', array( + 'local' => 'id', + 'foreign' => 'meeting_id' + ) + ); + } + +} \ No newline at end of file diff --git a/application/models/MeetingItem.php b/application/models/MeetingItem.php new file mode 100644 index 000000000..106492233 --- /dev/null +++ b/application/models/MeetingItem.php @@ -0,0 +1,60 @@ + + * @version SVN: $Id: MeetingItem.php 446 2011-05-26 13:40:19Z barryo $ + */ +/** + * + * Auto-generated Doctrine ORM File + * + * @category ORM + * @package IXP_ORM_Models + * @copyright Copyright 2008 - 2010 Internet Neutral Exchange Association Limited + * @author Barry O'Donovan + */ +class MeetingItem extends BaseMeetingItem +{ + + public function setUp() + { + parent::setUp(); + + $this->actAs( + 'Timestampable' + ); + + $this->hasOne( 'Meeting', array( 'local' => 'meeting_id', 'foreign' => 'id' ) ); + $this->hasOne( 'User as CreatedBy', array( 'local' => 'created_by', 'foreign' => 'id' ) ); + $this->hasOne( 'User as UpdatedBy', array( 'local' => 'updated_by', 'foreign' => 'id' ) ); + } + +} \ No newline at end of file diff --git a/application/models/MeetingItemTable.php b/application/models/MeetingItemTable.php new file mode 100644 index 000000000..5856787cd --- /dev/null +++ b/application/models/MeetingItemTable.php @@ -0,0 +1,50 @@ + + * @author Barry O'Donovan + */ +class MeetingItemTable extends Doctrine_Table +{ + /** + * Returns an instance of this class. + * + * @return object MeetingItemTable + */ + public static function getInstance() + { + return Doctrine_Core::getTable('MeetingItem'); + } +} \ No newline at end of file diff --git a/application/models/MeetingTable.php b/application/models/MeetingTable.php new file mode 100644 index 000000000..81909373a --- /dev/null +++ b/application/models/MeetingTable.php @@ -0,0 +1,68 @@ + + * @author Barry O'Donovan + */ +class MeetingTable extends Doctrine_Table +{ + /** + * Returns an instance of this class. + * + * @return object MeetingTable + */ + public static function getInstance() + { + return Doctrine_Core::getTable('Meeting'); + } + + + /** + * Return the futuremost available meeting as an array + * + * This is essentially a search for an upcoming meeting and returns it if found. + * + * @return array|bool The Meeting object array or false + */ + public static function getUpcomingMeeting() + { + return Doctrine_Query::create() + ->from( 'Meeting m' ) + ->where( 'm.date > ?', date( 'Y-m-d' ) ) + ->orderBy( 'm.date DESC' ) + ->setHydrationMode( Doctrine_Core::HYDRATE_ARRAY ) + ->fetchOne(); + } +} \ No newline at end of file diff --git a/application/models/MyPeeringMatrix.php b/application/models/MyPeeringMatrix.php new file mode 100644 index 000000000..d58b42039 --- /dev/null +++ b/application/models/MyPeeringMatrix.php @@ -0,0 +1,160 @@ + + * @version SVN: $Id: MyPeeringMatrix.php 446 2011-05-26 13:40:19Z barryo $ + */ +/** + * + * Auto-generated Doctrine ORM File + * + * @category ORM + * @package IXP_ORM_Models + * @copyright Copyright 2008 - 2010 Internet Neutral Exchange Association Limited + * @author Barry O'Donovan + */ +class MyPeeringMatrix extends BaseMyPeeringMatrix +{ + + const PEERED_STATE_NO = 'NO'; + const PEERED_STATE_YES = 'YES'; + const PEERED_STATE_WAITING = 'WAITING'; + const PEERED_STATE_NEVER = 'NEVER'; + + public static $PEERED_STATES = array( + 0 => MyPeeringMatrix::PEERED_STATE_NO, + 1 => MyPeeringMatrix::PEERED_STATE_YES, + 2 => MyPeeringMatrix::PEERED_STATE_WAITING, + 3 => MyPeeringMatrix::PEERED_STATE_NEVER + ); + + public function setUp() + { + parent::setUp(); + $this->actAs('SoftDelete'); + + $this->hasOne( 'MyPeeringMatrixNotes', array( 'local' => 'notes_id', 'foreign' => 'id' ) ); + // and for convenience: + $this->hasOne( 'MyPeeringMatrixNotes as Notes', array( 'local' => 'notes_id', 'foreign' => 'id' ) ); + } + + + /** + * Add or update notes for a peer. + * + * Note that each peer only has one notes entry so this function will allow + * generic access / creation of that notes entry. + * + * Note that I call the entry plural 'notes' as it can contain many notes but + * there is only one entry for every custid => peerid pair. + * + * @param $notes string The notes to add / update + * @param $prepend bool If true, the existing notes are not overwritten but rather added to by prepended $notes + */ + public function updateNotes( $notes, $prepend = false ) + { + // does a notes entry exist? + if( $this['notes_id'] != null ) + { + if( $prepend ) + $this['Notes']['notes'] = $notes . "\n\n" . $this['Notes']['notes']; + else + $this['Notes']['notes'] = $notes; + + $this->Notes->save(); + return true; + } + + // before creating one, make sure one does not exist for another LAN + $n = Doctrine_Query::create() + ->from( 'MyPeeringMatrixNotes n' ) + ->where( 'n.custid = ? and n.peerid = ?' ) + ->fetchOne( array( $this['custid'], $this['peerid'] ), Doctrine_Core::HYDRATE_RECORD ); + + if( $n ) + { + $this['notes_id'] = $n['id']; + + if( $prepend ) + $n['notes'] = $notes . "\n\n" . $n['notes']; + else + $n['notes'] = $notes; + + $n->save(); + $this->save(); + } + else + { + // otherwise create a notes entry + $n = new MyPeeringMatrixNotes(); + $n['custid'] = $this['custid']; + $n['peerid'] = $this['peerid']; + $n['notes'] = $notes; + $n->save(); + $this['notes_id'] = $n['id']; + $this->save(); + } + + // update the notes of any other LAN also + $records = Doctrine_Query::create() + ->from( 'MyPeeringMatrix m' ) + ->where( 'm.custid = ? and m.peerid = ?' ) + ->execute( array( $this['custid'], $this['peerid'] ), Doctrine_Core::HYDRATE_RECORD ); + + foreach( $records as $r ) + { + if( $r['notes_id'] != $n['id'] ) + { + $r['notes_id'] = $n['id']; + $r->save(); + } + } + + return true; + } + + /** + * Get notes for a peer. + * + * Note that each peer only has one notes entry so this function will allow + * generic access of that notes entry. + * + * Note that I call the entry plural 'notes' as it can contain many notes but + * there is only one entry for every custid => peerid pair. + * + * @return string The notes entry or '' + */ + public function getNotes() + { + return $this['notes_id'] != null ? $this['Notes']['notes'] : ''; + } + +} \ No newline at end of file diff --git a/application/models/MyPeeringMatrixNotes.php b/application/models/MyPeeringMatrixNotes.php new file mode 100644 index 000000000..0981c16de --- /dev/null +++ b/application/models/MyPeeringMatrixNotes.php @@ -0,0 +1,56 @@ + + * @version SVN: $Id: MyPeeringMatrixNotes.php 446 2011-05-26 13:40:19Z barryo $ + */ +/** + * + * Auto-generated Doctrine ORM File + * + * @category ORM + * @package IXP_ORM_Models + * @copyright Copyright 2008 - 2010 Internet Neutral Exchange Association Limited + * @author Barry O'Donovan + */ +class MyPeeringMatrixNotes extends BaseMyPeeringMatrixNotes +{ + + public function setUp() + { + parent::setUp(); + + $this->hasMany( 'MyPeeringMatrix', array( 'local' => 'id', 'foreign' => 'notes_id' ) ); + + $this->actAs('SoftDelete'); + } + +} \ No newline at end of file diff --git a/application/models/MyPeeringMatrixNotesTable.php b/application/models/MyPeeringMatrixNotesTable.php new file mode 100644 index 000000000..f876643a7 --- /dev/null +++ b/application/models/MyPeeringMatrixNotesTable.php @@ -0,0 +1,50 @@ + + * @author Barry O'Donovan + */ +class MyPeeringMatrixNotesTable extends Doctrine_Table +{ + /** + * Returns an instance of this class. + * + * @return object MyPeeringMatrixNotesTable + */ + public static function getInstance() + { + return Doctrine_Core::getTable('MyPeeringMatrixNotes'); + } +} \ No newline at end of file diff --git a/application/models/MyPeeringMatrixTable.php b/application/models/MyPeeringMatrixTable.php new file mode 100644 index 000000000..c0f67d5b6 --- /dev/null +++ b/application/models/MyPeeringMatrixTable.php @@ -0,0 +1,159 @@ + + * @author Barry O'Donovan + */ +class MyPeeringMatrixTable extends Doctrine_Table +{ + /** + * Returns an instance of this class. + * + * @return object MyPeeringMatrixTable + */ + public static function getInstance() + { + return Doctrine_Core::getTable('MyPeeringMatrix'); + } + + + /** + * Calculate the totals for the various states on a per member basis + * + * Returns an array of the type: + * + * Array + * ( + * [YES] => 5 + * [NO] => 32 + * [WAITING] => 3 + * [NEVER] => 5 + * ) + * + * @param int The customer ID to find the statistics for + * @return array The array as above. + */ + public static function getStatesTotal( $custid, $vlan = null ) + { + if( !ctype_digit( $custid ) ) + return array(); + + $q = Doctrine_Query::create() + ->from( 'MyPeeringMatrix mpm' ) + ->select( 'mpm.peered' ) + ->addSelect( 'COUNT( mpm.peered ) as count' ) + ->where( 'mpm.custid = ?', $custid ); + + if( $vlan !== null ) + $q->andWhere( 'mpm.vlan = ?', $vlan ); + + $result = $q->groupBy( 'mpm.peered' ) + ->execute( null, Doctrine_Core::HYDRATE_ARRAY ); + + $totals = array(); + foreach( $result as $r ) + $totals[$r['peered']] = $r['count']; + + return $totals; + } + + /** + * Generates or updates the users My Peering Matrix table + * + * Uses the public peering matrix tables as its source + * + * @param int $custid The customer ID to generate / update for + */ + public function generateOrUpdateMyPeeringMatrix( $custid = false ) + { + if( !$custid ) + throw new INEX_Exception( 'You must provide a customer id!' ); + + // let's create / update the users own peering matrix + // we'll use the potential peers as given the the peering matrix table + + $matrix = Doctrine_Query::create() + ->from( 'PeeringMatrix pm' ) + ->where( 'pm.x_custid = ?', $custid ) + ->fetchArray(); + + $mypeers = Doctrine_Query::create() + ->from( 'MyPeeringMatrix mpm' ) + ->where( 'mpm.custid = ?', $custid ) + ->execute( null, Doctrine_Core::HYDRATE_RECORD ); + + foreach( $matrix as $r ) + { + $found = false; + foreach( $mypeers as $index => $mp ) + { + if( $mp['peerid'] == $r['y_custid'] && $mp['vlan'] == $r['vlan'] ) + { + unset( $mypeers[$index] ); + $found = true; + continue; + } + } + + if( !$found ) + { + $newpeer = new MyPeeringMatrix(); + $newpeer['custid'] = $custid; + $newpeer['peerid'] = $r['y_custid']; + $newpeer['vlan'] = $r['vlan']; + $newpeer['peered'] = 'NO'; + $newpeer['ipv6'] = 0; + $newpeer['updated'] = date( 'Y-m-d H:i:s' ); + $newpeer['created'] = date( 'Y-m-d H:i:s' ); + + // is there a pre-existing notes entry for these peers? + $n = Doctrine_Query::create() + ->from( 'MyPeeringMatrixNotes n' ) + ->where( 'n.custid = ? and n.peerid = ?' ) + ->fetchOne( array( $custid, $r['y_custid'] ), Doctrine_Core::HYDRATE_RECORD ); + + if( $n ) + $newpeer['notes_id'] = $n['id']; + + $newpeer->save(); + } + } + + // let's delete any members that no longer exist + foreach( $mypeers as $mp ) + $mp->delete(); + } + +} \ No newline at end of file diff --git a/application/models/Networkinfo.php b/application/models/Networkinfo.php new file mode 100644 index 000000000..295440dd9 --- /dev/null +++ b/application/models/Networkinfo.php @@ -0,0 +1,105 @@ + + * @author Barry O'Donovan + */ +class Networkinfo extends BaseNetworkinfo +{ + + public function setUp() + { + parent::setUp(); + + $this->hasOne( 'Vlan', array( 'local' => 'vlanid', 'foreign' => 'id') ); + } + + /** + * Returns an array of the network information indexed by Vlan.id + * + * For example (where x us the vlan ID): + * + * [x] => array(2) { + * [4] => array(9) { + * ["id"] => string(1) "1" + * ["vlanid"] => string(1) "2" + * ["protocol"] => string(1) "4" + * ["network"] => string(13) "193.242.111.0" + * ["masklen"] => string(2) "25" + * ["rs1address"] => string(13) "193.242.111.8" + * ["rs2address"] => string(13) "193.242.111.9" + * ["dnsfile"] => string(44) "/opt/bind/zones/reverse-vlan-10-ipv4.include" + * ["Vlan"] => array(5) { + * ["id"] => string(1) "2" + * ["name"] => string(15) "Peering VLAN #1" + * ["number"] => string(2) "10" + * ["rcvrfname"] => string(0) "" + * ["notes"] => string(0) "" + * } + * } + * [6] => array(9) { + * ["id"] => string(1) "2" + * ["vlanid"] => string(1) "2" + * ["protocol"] => string(1) "6" + * ["network"] => string(16) "2001:07F8:0018::" + * ["masklen"] => string(2) "64" + * ["rs1address"] => string(14) "2001:7f8:18::8" + * ["rs2address"] => string(14) "2001:7f8:18::9" + * ["dnsfile"] => string(44) "/opt/bind/zones/reverse-vlan-10-ipv6.include" + * ["Vlan"] => array(5) { + * ["id"] => string(1) "2" + * ["name"] => string(15) "Peering VLAN #1" + * ["number"] => string(2) "10" + * ["rcvrfname"] => string(0) "" + * ["notes"] => string(0) "" + * } + * } + * } + * + */ + public static function toStructuredArray() + { + $networkInfo = Doctrine_Query::create() + ->from( 'Networkinfo n' ) + ->leftJoin( 'n.Vlan vi' ) + ->execute(); + + $data = array(); + foreach( $networkInfo as $ni ) + { + $data[$ni['vlanid']][$ni['protocol']] = $ni->toArray(); + } + + return $data; + } +} \ No newline at end of file diff --git a/application/models/NetworkinfoTable.php b/application/models/NetworkinfoTable.php new file mode 100644 index 000000000..38edc824b --- /dev/null +++ b/application/models/NetworkinfoTable.php @@ -0,0 +1,36 @@ + + * @author Barry O'Donovan + */ +class NetworkinfoTable extends Doctrine_Table +{ + +} \ No newline at end of file diff --git a/application/models/PatchPanel.php b/application/models/PatchPanel.php new file mode 100644 index 000000000..eaf4adf1b --- /dev/null +++ b/application/models/PatchPanel.php @@ -0,0 +1,46 @@ + + * @version SVN: $Id: PatchPanel.php 446 2011-05-26 13:40:19Z barryo $ + */ +/** + * + * Auto-generated Doctrine ORM File + * + * @category ORM + * @package IXP_ORM_Models + * @copyright Copyright 2008 - 2010 Internet Neutral Exchange Association Limited + * @author Barry O'Donovan + */ +class PatchPanel extends BasePatchPanel +{ +} \ No newline at end of file diff --git a/application/models/PatchPanelPort.php b/application/models/PatchPanelPort.php new file mode 100644 index 000000000..f39c07143 --- /dev/null +++ b/application/models/PatchPanelPort.php @@ -0,0 +1,109 @@ + + * @version SVN: $Id: PatchPanelPort.php 446 2011-05-26 13:40:19Z barryo $ + */ +/** + * + * Auto-generated Doctrine ORM File + * + * @category ORM + * @package IXP_ORM_Models + * @copyright Copyright 2008 - 2010 Internet Neutral Exchange Association Limited + * @author Barry O'Donovan + */ +class PatchPanelPort extends BasePatchPanelPort +{ + + /////////////////////////////////////////////// + //// + //// Cable Types + //// + + const CABLE_TYPE_UTP = 1; + const CABLE_TYPE_UTP_5 = 2; + const CABLE_TYPE_UTP_5e = 3; + const CABLE_TYPE_UTP_6 = 4; + + const CABLE_TYPE_SM = 20; + + const CABLE_TYPE_MM = 40; + const CABLE_TYPE_MM_OM1 = 41; // 62.5/125 µm + const CABLE_TYPE_MM_OM2 = 42; // 50/125 µm + + public static $CABLES_TYPES = array( + PatchPanelPort::CABLE_TYPE_UTP => 'UTP', + PatchPanelPort::CABLE_TYPE_UTP_5 => 'UTP Cat5', + PatchPanelPort::CABLE_TYPE_UTP_5e => 'UTP Cat5e', + PatchPanelPort::CABLE_TYPE_UTP_6 => 'UTP Cat6', + PatchPanelPort::CABLE_TYPE_SM => 'SM (Single Mode)', + PatchPanelPort::CABLE_TYPE_MM => 'MM (Multi Mode)', + PatchPanelPort::CABLE_TYPE_MM_OM1 => 'MM OM1 (Multi Mode 62.5/125 µm)', + PatchPanelPort::CABLE_TYPE_MM_OM2 => 'MM OM2 (Multi Mode 50/125 µm)' + ); + + + /////////////////////////////////////////////// + //// + //// Interface Types + //// + + const INTERFACE_TYPE_RJ45 = 1; + + const INTERFACE_TYPE_SC = 10; + const INTERFACE_TYPE_LC = 11; + const INTERFACE_TYPE_MU = 12; + + public static $INTERFACE_TYPES = array( + PatchPanelPort::INTERFACE_TYPE_RJ45 => 'RJ45', + PatchPanelPort::INTERFACE_TYPE_SC => 'SC', + PatchPanelPort::INTERFACE_TYPE_LC => 'LC', + PatchPanelPort::INTERFACE_TYPE_MU => 'MU' + ); + + + + /////////////////////////////////////////////////////////////////// + //// + //// Patch Panels can have two sides: INNER and OUTER + //// + //// If in doubt, inner has more internal cabinet than outer has. + + const SIDE_INNER = 1; + const SIDE_OUTER = 2; + + public static $SIDES = array( + PatchPanelPort::SIDE_INNER => 'Inner (back)', + PatchPanelPort::SIDE_OUTER => 'Outer (front)' + ); + +} \ No newline at end of file diff --git a/application/models/PatchPanelPortTable.php b/application/models/PatchPanelPortTable.php new file mode 100644 index 000000000..055b96d11 --- /dev/null +++ b/application/models/PatchPanelPortTable.php @@ -0,0 +1,36 @@ + + * @author Barry O'Donovan + */ +class PatchPanelPortTable extends Doctrine_Table +{ + +} \ No newline at end of file diff --git a/application/models/PatchPanelTable.php b/application/models/PatchPanelTable.php new file mode 100644 index 000000000..83bde9df7 --- /dev/null +++ b/application/models/PatchPanelTable.php @@ -0,0 +1,36 @@ + + * @author Barry O'Donovan + */ +class PatchPanelTable extends Doctrine_Table +{ + +} \ No newline at end of file diff --git a/application/models/PeeringMatrix.php b/application/models/PeeringMatrix.php new file mode 100644 index 000000000..d2074555e --- /dev/null +++ b/application/models/PeeringMatrix.php @@ -0,0 +1,54 @@ + + * @version SVN: $Id: PeeringMatrix.php 446 2011-05-26 13:40:19Z barryo $ + */ +/** + * + * Auto-generated Doctrine ORM File + * + * @category ORM + * @package IXP_ORM_Models + * @copyright Copyright 2008 - 2010 Internet Neutral Exchange Association Limited + * @author Barry O'Donovan + */ +class PeeringMatrix extends BasePeeringMatrix +{ + public function setUp() + { + parent::setUp(); + + $this->hasOne( 'Cust as X_Cust', array( 'local' => 'x_custid', 'foreign' => 'id') ); + $this->hasOne( 'Cust as Y_Cust', array( 'local' => 'y_custid', 'foreign' => 'id') ); + $this->hasOne( 'MyPeeringMatrix', array( 'local' => 'x_custid', 'foreign' => 'custid') ); + } +} \ No newline at end of file diff --git a/application/models/PeeringMatrixTable.php b/application/models/PeeringMatrixTable.php new file mode 100644 index 000000000..dae0dcbda --- /dev/null +++ b/application/models/PeeringMatrixTable.php @@ -0,0 +1,50 @@ + + * @author Barry O'Donovan + */ +class PeeringMatrixTable extends Doctrine_Table +{ + /** + * Returns an instance of this class. + * + * @return object PeeringMatrixTable + */ + public static function getInstance() + { + return Doctrine_Core::getTable('PeeringMatrix'); + } +} \ No newline at end of file diff --git a/application/models/PhysicalCircuit.php b/application/models/PhysicalCircuit.php new file mode 100644 index 000000000..1e3a7fdee --- /dev/null +++ b/application/models/PhysicalCircuit.php @@ -0,0 +1,56 @@ + + * @version SVN: $Id: PhysicalCircuit.php 446 2011-05-26 13:40:19Z barryo $ + */ +/** + * + * Auto-generated Doctrine ORM File + * + * @category ORM + * @package IXP_ORM_Models + * @copyright Copyright 2008 - 2010 Internet Neutral Exchange Association Limited + * @author Barry O'Donovan + */ +class PhysicalCircuit extends BasePhysicalCircuit +{ + + const TYPE_PATCH_PANEL_PORT = 1; + const TYPE_SWITCH_PORT = 2; + + public static $TYPES_TEXT = array( + PhysicalCircuit::TYPE_PATCH_PANEL_PORT => 'Patch Panel Port', + PhysicalCircuit::TYPE_SWITCH_PORT => 'Switch Port' + ); + + +} \ No newline at end of file diff --git a/application/models/PhysicalCircuitTable.php b/application/models/PhysicalCircuitTable.php new file mode 100644 index 000000000..2cf69b4cb --- /dev/null +++ b/application/models/PhysicalCircuitTable.php @@ -0,0 +1,38 @@ + + * @author Barry O'Donovan + */ +class PhysicalCircuitTable extends Doctrine_Table +{ + +} \ No newline at end of file diff --git a/application/models/Physicalinterface.php b/application/models/Physicalinterface.php new file mode 100644 index 000000000..2e1d0b0e6 --- /dev/null +++ b/application/models/Physicalinterface.php @@ -0,0 +1,83 @@ + + * @author Barry O'Donovan + */ +class Physicalinterface extends BasePhysicalinterface +{ + + const STATUS_CONNECTED = 1; + const STATUS_DISABLED = 2; + const STATUS_NOTCONNECTED = 3; + const STATUS_XCONNECT = 4; + const STATUS_QUARANTINE = 5; + + public static $STATES = array( + 1 => 'STATUS_CONNECTED', + 2 => 'STATUS_DISABLED', + 3 => 'STATUS_NOTCONNECTED', + 4 => 'STATUS_XCONNECT', + 5 => 'STATUS_QUARANTINE' + ); + + public static $STATES_TEXT = array( + 1 => 'Connected', + 2 => 'Disabled', + 3 => 'Not Connected', + 4 => 'Awaiting X-Connect', + 5 => 'Quarantine' + ); + + public static $SPEED = array( + 10 => '10 Mbps', + 100 => '100 Mbps', + 1000 => '1000 Mbps', + 10000 => '10000 Mbps' + ); + + public static $DUPLEX = array( + 'full' => 'full', + 'half' => 'half' + ); + + + public function setUp() + { + parent::setUp(); + + $this->hasOne( 'Switchport', array( 'local' => 'switchportid', 'foreign' => 'id') ); + $this->hasOne( 'Virtualinterface', array( 'local' => 'virtualinterfaceid', 'foreign' => 'id') ); + } + +} \ No newline at end of file diff --git a/application/models/PhysicalinterfaceSeq.php b/application/models/PhysicalinterfaceSeq.php new file mode 100644 index 000000000..a6e375d3e --- /dev/null +++ b/application/models/PhysicalinterfaceSeq.php @@ -0,0 +1,40 @@ + + * @author Barry O'Donovan + */ +class PhysicalinterfaceSeq extends BasePhysicalinterfaceSeq +{ + +} \ No newline at end of file diff --git a/application/models/PhysicalinterfaceSeqTable.php b/application/models/PhysicalinterfaceSeqTable.php new file mode 100644 index 000000000..4fd215663 --- /dev/null +++ b/application/models/PhysicalinterfaceSeqTable.php @@ -0,0 +1,36 @@ + + * @author Barry O'Donovan + */ +class PhysicalinterfaceSeqTable extends Doctrine_Table +{ + +} \ No newline at end of file diff --git a/application/models/PhysicalinterfaceTable.php b/application/models/PhysicalinterfaceTable.php new file mode 100644 index 000000000..2bfa4e8cc --- /dev/null +++ b/application/models/PhysicalinterfaceTable.php @@ -0,0 +1,36 @@ + + * @author Barry O'Donovan + */ +class PhysicalinterfaceTable extends Doctrine_Table +{ + +} \ No newline at end of file diff --git a/application/models/ProvisioningInterface.php b/application/models/ProvisioningInterface.php new file mode 100644 index 000000000..84554ec7f --- /dev/null +++ b/application/models/ProvisioningInterface.php @@ -0,0 +1,95 @@ + + * @version SVN: $Id: ProvisioningInterface.php 446 2011-05-26 13:40:19Z barryo $ + */ +class ProvisioningInterface extends BaseProvisioningInterface +{ + + public function setUp() + { + parent::setUp(); + + $this->hasOne( 'Cust', array( 'local' => 'cust_id', 'foreign' => 'id' ) ); + $this->hasOne( 'User as CreatedBy', array( 'local' => 'created_by', 'foreign' => 'id' ) ); + $this->hasOne( 'Virtualinterface', array( 'local' => 'virtualinterface_id', 'foreign' => 'id' ) ); + $this->hasOne( 'Physicalinterface', array( 'local' => 'physicalinterface_id', 'foreign' => 'id' ) ); + $this->hasOne( 'Vlaninterface', array( 'local' => 'vlaninterface_id', 'foreign' => 'id' ) ); + } + + + + /** + * Override the save() method to calculate whethere we're complete or not + */ + public function save( $conn = null ) + { + if( + $this['cust_id'] + && $this['virtualinterface_id'] + && $this['physicalinterface_id'] + && $this['vlaninterface_id'] + && $this['mail_sent'] + && $this['switch_config'] + && $this['quarantine_start'] != null + && $this['quarantine_end'] != null + ) + { + $this['complete'] = 1; + } + else + { + $this['complete'] = 0; + } + + parent::save( $conn ); + } + + + /** + * Calculate the number of steps completed + */ + public function stepsComplete() + { + $fields = array( 'cust_id', 'virtualinterface_id', 'physicalinterface_id', 'vlaninterface_id', + 'mail_sent', 'switch_config', 'quarantine_start', 'quarantine_end' + ); + + $progress = 0; + foreach( $fields as $f ) + if( $this[$f] ) + $progress += 1; + + return 'X ' . $progress . "/" . count( $fields ); + } + +} \ No newline at end of file diff --git a/application/models/ProvisioningInterfaceTable.php b/application/models/ProvisioningInterfaceTable.php new file mode 100644 index 000000000..734d5bb05 --- /dev/null +++ b/application/models/ProvisioningInterfaceTable.php @@ -0,0 +1,41 @@ + + * @version SVN: $Id: SecEvent.php 446 2011-05-26 13:40:19Z barryo $ + */ +/** + * + * Auto-generated Doctrine ORM File + * + * @category ORM + * @package IXP_ORM_Models + * @copyright Copyright 2008 - 2010 Internet Neutral Exchange Association Limited + * @author Barry O'Donovan + */ +class SecEvent extends BaseSecEvent +{ + + const TYPE_SECURITY_VIOLATION = 'SECURITY_VIOLATION'; + const TYPE_PORT_UPDOWN = 'PORT_UPDOWN'; + const TYPE_LINEPROTO_UPDOWN = 'LINEPROTO_UPDOWN'; + const TYPE_BGP_AUTH = 'BGP_AUTH'; + + public static $TYPES_DEFAULTS = array( + self::TYPE_BGP_AUTH => 1, + self::TYPE_PORT_UPDOWN => 1, + self::TYPE_SECURITY_VIOLATION => 1 + ); + + public function setUp() + { + parent::setUp(); + + $this->hasOne( 'Cust', array( 'local' => 'custid', 'foreign' => 'id' ) ); + $this->hasOne( 'SwitchTable', array( 'local' => 'switchid', 'foreign' => 'id' ) ); + $this->hasOne( 'Switchport', array( 'local' => 'switchportid', 'foreign' => 'id' ) ); + + $timestampable0 = new Doctrine_Template_Timestampable( + array( + 'created' => + array( + 'name' => 'timestamp', + ), + 'updated' => + array( + 'disabled' => true + ) + ) + ); + + $this->actAs( $timestampable0 ); + } + +} \ No newline at end of file diff --git a/application/models/SecEventTable.php b/application/models/SecEventTable.php new file mode 100644 index 000000000..cb876ae6c --- /dev/null +++ b/application/models/SecEventTable.php @@ -0,0 +1,36 @@ + + * @author Barry O'Donovan + */ +class SecEventTable extends Doctrine_Table +{ + +} \ No newline at end of file diff --git a/application/models/Switch.php b/application/models/Switch.php new file mode 100644 index 000000000..7afaba5df --- /dev/null +++ b/application/models/Switch.php @@ -0,0 +1,47 @@ + + * @version SVN: $Id: Switch.php 446 2011-05-26 13:40:19Z barryo $ + */ +/** + * + * Auto-generated Doctrine ORM File + * + * @category ORM + * @package IXP_ORM_Models + * @copyright Copyright 2008 - 2010 Internet Neutral Exchange Association Limited + * @author Barry O'Donovan + */ +class Switch extends BaseSwitch +{ + +} \ No newline at end of file diff --git a/application/models/SwitchSeq.php b/application/models/SwitchSeq.php new file mode 100644 index 000000000..fb45ab902 --- /dev/null +++ b/application/models/SwitchSeq.php @@ -0,0 +1,40 @@ + + * @author Barry O'Donovan + */ +class SwitchSeq extends BaseSwitchSeq +{ + +} \ No newline at end of file diff --git a/application/models/SwitchSeqTable.php b/application/models/SwitchSeqTable.php new file mode 100644 index 000000000..59282dbd6 --- /dev/null +++ b/application/models/SwitchSeqTable.php @@ -0,0 +1,36 @@ + + * @author Barry O'Donovan + */ +class SwitchSeqTable extends Doctrine_Table +{ + +} \ No newline at end of file diff --git a/application/models/SwitchTable.php b/application/models/SwitchTable.php new file mode 100644 index 000000000..6e0572906 --- /dev/null +++ b/application/models/SwitchTable.php @@ -0,0 +1,65 @@ + + * @author Barry O'Donovan + */ +class SwitchTable extends BaseSwitch +{ + + + const SWITCHTYPE_SWITCH = 1; + const SWITCHTYPE_CONSOLESERVER = 2; + + + public static $SWITCHTYPES_TEXT = array( + 1 => 'Switch', + 2 => 'Console Server' + ); + + public function setUp() + { + parent::setUp(); + + $this->hasOne( 'Cabinet', array( 'local' => 'cabinetid', 'foreign' => 'id') ); + $this->hasOne( 'Vendor', array( 'local' => 'vendorid', 'foreign' => 'id') ); + + $this->hasMany( + 'Switchport', array( + 'local' => 'id', + 'foreign' => 'switchid' + ) + ); + } + +} \ No newline at end of file diff --git a/application/models/Switchport.php b/application/models/Switchport.php new file mode 100644 index 000000000..0f1f6723f --- /dev/null +++ b/application/models/Switchport.php @@ -0,0 +1,65 @@ + + * @author Barry O'Donovan + */ +class Switchport extends BaseSwitchport +{ + + const TYPE_UNSET = 0; + const TYPE_PEERING = 1; + const TYPE_MONITOR = 2; + const TYPE_CORE = 3; + const TYPE_OTHER = 4; + const TYPE_MANAGEMENT = 5; + + public static $TYPE_TEXT = array( + Switchport::TYPE_UNSET => 'Unset / Unknown', + Switchport::TYPE_PEERING => 'Peering', + Switchport::TYPE_MONITOR => 'Monitor', + Switchport::TYPE_CORE => 'Core', + Switchport::TYPE_OTHER => 'Other', + Switchport::TYPE_MANAGEMENT => 'Management' + ); + + + public function setUp() + { + parent::setUp(); + + $this->hasOne( 'SwitchTable', array( 'local' => 'switchid', 'foreign' => 'id') ); + $this->hasOne( 'Physicalinterface', array( 'local' => 'id', 'foreign' => 'switchportid') ); + } + +} diff --git a/application/models/SwitchportTable.php b/application/models/SwitchportTable.php new file mode 100644 index 000000000..c58bb80a0 --- /dev/null +++ b/application/models/SwitchportTable.php @@ -0,0 +1,41 @@ + + * @author Barry O'Donovan + */ +class SwitchportTable extends Doctrine_Table +{ + + public static function typeText( $type ) + { + return Switchport::$TYPE_TEXT[$type]; + } + +} \ No newline at end of file diff --git a/application/models/Traffic95th.php b/application/models/Traffic95th.php new file mode 100644 index 000000000..3c1283286 --- /dev/null +++ b/application/models/Traffic95th.php @@ -0,0 +1,47 @@ + + * @version SVN: $Id: Traffic95th.php 446 2011-05-26 13:40:19Z barryo $ + */ +/** + * + * Auto-generated Doctrine ORM File + * + * @category ORM + * @package IXP_ORM_Models + * @copyright Copyright 2008 - 2010 Internet Neutral Exchange Association Limited + * @author Barry O'Donovan + */ +class Traffic95th extends BaseTraffic95th +{ + +} \ No newline at end of file diff --git a/application/models/Traffic95thMonthly.php b/application/models/Traffic95thMonthly.php new file mode 100644 index 000000000..85e81105d --- /dev/null +++ b/application/models/Traffic95thMonthly.php @@ -0,0 +1,54 @@ + + * @version SVN: $Id: Traffic95thMonthly.php 446 2011-05-26 13:40:19Z barryo $ + */ +/** + * + * Auto-generated Doctrine ORM File + * + * @category ORM + * @package IXP_ORM_Models + * @copyright Copyright 2008 - 2010 Internet Neutral Exchange Association Limited + * @author Barry O'Donovan + */ +class Traffic95thMonthly extends BaseTraffic95thMonthly +{ + + public function setUp() + { + parent::setUp(); + + $this->hasOne( 'Cust', array( 'local' => 'cust_id', 'foreign' => 'id') ); + } + +} \ No newline at end of file diff --git a/application/models/Traffic95thMonthlyTable.php b/application/models/Traffic95thMonthlyTable.php new file mode 100644 index 000000000..2852e2cf7 --- /dev/null +++ b/application/models/Traffic95thMonthlyTable.php @@ -0,0 +1,50 @@ + + * @author Barry O'Donovan + */ +class Traffic95thMonthlyTable extends Doctrine_Table +{ + /** + * Returns an instance of this class. + * + * @return object Traffic95thMonthlyTable + */ + public static function getInstance() + { + return Doctrine_Core::getTable('Traffic95thMonthly'); + } +} \ No newline at end of file diff --git a/application/models/Traffic95thTable.php b/application/models/Traffic95thTable.php new file mode 100644 index 000000000..3961b867f --- /dev/null +++ b/application/models/Traffic95thTable.php @@ -0,0 +1,79 @@ + + * @author Barry O'Donovan + */ +class Traffic95thTable extends Doctrine_Table +{ + + /** + * Function to calculate the 95th percentile for a given data range. + * + * @param unknown_type $custid The ID of the customer to calculate for + * @param unknown_type $start Start of period to calculcate for (Y-m-d H:i:s) + * @param unknown_type $end End of period to calculcate for (Y-m-d H:i:s) + * @return int The 95th percentile in bits. + */ + public static function get95thPercentile( $custid, $start, $end ) + { + // how many datapoints do we have? + $count = Doctrine_Query::create() + ->from( 'Traffic95th tm') + ->select( 'COUNT( tm.datetime )' ) + ->where( "tm.datetime >= ?" ) + ->andWhere( "tm.datetime < ?" ) + ->andWhere( 'tm.cust_id = ?' ) + ->execute( array( $start, $end, $custid ), Doctrine_Core::HYDRATE_SINGLE_SCALAR ); + + if( $count > 20 ) + { + // we want the 95% percentile + $index = (int)floor( $count * 0.05 ); + + return Doctrine_Query::create() + ->from( 'Traffic95TH tm' ) + ->select( 'tm.max' ) + ->where( "tm.datetime >= ?", $start ) + ->andWhere( "tm.datetime < ?", $end ) + ->andWhere( 'tm.cust_id = ?', $custid ) + ->limit( 1 ) + ->offset( $index ) + ->orderBy( 'tm.datetime DESC' ) + ->execute( null, Doctrine_Core::HYDRATE_SINGLE_SCALAR ); + + } + else + { + return 0; + } + } + + +} \ No newline at end of file diff --git a/application/models/TrafficDaily.php b/application/models/TrafficDaily.php new file mode 100644 index 000000000..59633d307 --- /dev/null +++ b/application/models/TrafficDaily.php @@ -0,0 +1,54 @@ + + * @version SVN: $Id: TrafficDaily.php 446 2011-05-26 13:40:19Z barryo $ + */ +/** + * + * Auto-generated Doctrine ORM File + * + * @category ORM + * @package IXP_ORM_Models + * @copyright Copyright 2008 - 2010 Internet Neutral Exchange Association Limited + * @author Barry O'Donovan + */ +class TrafficDaily extends BaseTrafficDaily +{ + + public function setUp() + { + parent::setUp(); + + $this->hasOne( 'Cust', array( 'local' => 'cust_id', 'foreign' => 'id') ); + } + +} \ No newline at end of file diff --git a/application/models/TrafficDailyTable.php b/application/models/TrafficDailyTable.php new file mode 100644 index 000000000..3e7073c3c --- /dev/null +++ b/application/models/TrafficDailyTable.php @@ -0,0 +1,36 @@ + + * @author Barry O'Donovan + */ +class TrafficDailyTable extends Doctrine_Table +{ + +} \ No newline at end of file diff --git a/application/models/User.php b/application/models/User.php new file mode 100644 index 000000000..4dab8819a --- /dev/null +++ b/application/models/User.php @@ -0,0 +1,177 @@ + + * @author Barry O'Donovan + */ +class User extends BaseUser +{ + + const AUTH_PUBLIC = 0; + const AUTH_CUSTUSER = 1; + const AUTH_CUSTADMIN = 2; + const AUTH_SUPERUSER = 3; + + public static $PRIVILEGES = array( + User::AUTH_CUSTUSER => 'CUSTUSER', + User::AUTH_CUSTADMIN => 'CUSTADMIN', + User::AUTH_SUPERUSER => 'SUPERUSER' + ); + + public static $PRIVILEGES_TEXT = array( + User::AUTH_CUSTUSER => 'Customer User', + User::AUTH_CUSTADMIN => 'Customer Superuser', + User::AUTH_SUPERUSER => 'Superuser' + ); + + + public function setUp() + { + parent::setUp(); + + $this->hasOne( 'Cust', array( 'local' => 'custid', 'foreign' => 'id') ); + + $this->hasOne( 'User as Parent', array( 'local' => 'parent_id', 'foreign' => 'id' ) ); + } + + /** + * Set (or update) a user preference + * + * @param $attribute string The preference name + * @param $value string The value to assign to the preference + * @param $op string The operand (e.g. = (default), <, <=, :=, etc) + * @return mixed The preference value as supplied + */ + public function setPreference( $attribute, $value, $op = '=' ) + { + if( $pref = $this->loadPreference( $attribute ) ) + { + $pref['value'] = $value; + $pref->save(); + return $value; + } + + $dr = new UserPref(); + $dr['user_id'] = $this['id']; + $dr['attribute'] = $attribute; + $dr['op'] = $op; + $dr['value'] = $value; + $dr->save(); + + return $value; + } + + /** + * Get the named preference + * + * WARNING: Evaluate the return of this function using !== or === as a preference such as '0' + * will evaluate as false otherwise. + * + * @param $attribute string The named attribute / preference to check for + * @return bool|string If the named preference is not defined, returns FALSE; otherwise it returns the preference + */ + public function getPreference( $attribute ) + { + $r = Doctrine_Query::create() + ->select( 'up.value' ) + ->from( 'UserPref up' ) + ->where( 'up.user_id = ?', $this['id'] ) + ->andWhere( 'up.attribute = ?', $attribute ) + ->execute( null, Doctrine_Core::HYDRATE_SINGLE_SCALAR ); + + if( $r === array() ) + return false; + + return $r; + } + + /** + * Load the ORM object of the named preference + * + * @param $attribute string The named attribute / preference to check for + * @return bool|Doctrine_Record If the named preference is not defined, returns FALSE; otherwise it returns the Doctrine_Record + */ + public function loadPreference( $attribute ) + { + return Doctrine_Query::create() + ->from( 'UserPref up' ) + ->where( 'up.user_id = ?', $this['id'] ) + ->andWhere( 'up.attribute = ?', $attribute ) + ->fetchOne( null, Doctrine_Core::HYDRATE_RECORD ); + } + + /** + * See getPreference() + * + * @see getPreference() + */ + public function hasPreference( $attribute ) + { + return $this->getPreference( $attribute ); + } + + /** + * Get a preference if it exists or set it and return if not + * + * A useful function to replace clauses such as: + * + * $pref = $user->getPreference( 'qwerty' ); + * if( $pref === false ) + * { + * $pref = 'default'; + * $user->setPreference( 'qwerty', 'default' ); + * } + * + * with: + * + * $pref = $user->getOrSetGetPreference( 'qwerty', 'default' ); + * + * @param string $attribute The preference to get or get/set + * @param mixed $default The default value to set the preference to and return if not aleady set + * @param string $op The operand for the preference. Defaults to '=' + * @return mixed $default as passed to the function + * @see getPreference() + * @see setPreference() + */ + public function getOrSetGetPreference( $attribute, $default, $op = '=' ) + { + // is the preference already set? + $pref = $this->getPreference( $attribute ); + + if( $pref !== false ) + return $pref; + + return $this->setPreference( $attribute, $default, $op ); + } + +} \ No newline at end of file diff --git a/application/models/UserPref.php b/application/models/UserPref.php new file mode 100644 index 000000000..522bfa6d3 --- /dev/null +++ b/application/models/UserPref.php @@ -0,0 +1,53 @@ + + * @version SVN: $Id: UserPref.php 446 2011-05-26 13:40:19Z barryo $ + */ +/** + * + * Auto-generated Doctrine ORM File + * + * @category ORM + * @package IXP_ORM_Models + * @copyright Copyright 2008 - 2010 Internet Neutral Exchange Association Limited + * @author Barry O'Donovan + */ +class UserPref extends BaseUserPref +{ + public function setUp() + { + parent::setUp(); + + $this->hasOne( 'User', array( 'local' => 'user_id', 'foreign' => 'id') ); + } + +} diff --git a/application/models/UserPrefTable.php b/application/models/UserPrefTable.php new file mode 100644 index 000000000..58a64bbb1 --- /dev/null +++ b/application/models/UserPrefTable.php @@ -0,0 +1,50 @@ + + * @author Barry O'Donovan + */ +class UserPrefTable extends Doctrine_Table +{ + /** + * Returns an instance of this class. + * + * @return object UserPrefTable + */ + public static function getInstance() + { + return Doctrine_Core::getTable('UserPref'); + } +} \ No newline at end of file diff --git a/application/models/UserSeq.php b/application/models/UserSeq.php new file mode 100644 index 000000000..d71ff08ca --- /dev/null +++ b/application/models/UserSeq.php @@ -0,0 +1,40 @@ + + * @author Barry O'Donovan + */ +class UserSeq extends BaseUserSeq +{ + +} \ No newline at end of file diff --git a/application/models/UserSeqTable.php b/application/models/UserSeqTable.php new file mode 100644 index 000000000..d605ab9e5 --- /dev/null +++ b/application/models/UserSeqTable.php @@ -0,0 +1,36 @@ + + * @author Barry O'Donovan + */ +class UserSeqTable extends Doctrine_Table +{ + +} \ No newline at end of file diff --git a/application/models/UserTable.php b/application/models/UserTable.php new file mode 100644 index 000000000..bd586c6f0 --- /dev/null +++ b/application/models/UserTable.php @@ -0,0 +1,60 @@ + + * @author Barry O'Donovan + */ +class UserTable extends Doctrine_Table +{ + + /** + * Creates a random password string of a given length. Not the fastest + * way of generating random passwords, but ensures that it contains + * both lowercase and uppercase letters and digits, so complies with + * our password strength "policy". + * + * Some letters are excluded from the character set: 1, 0, O, I, l + * + * @param int $len The length of the password to be generated. + * @return string The password string. + */ + public static function createRandomPassword( $len = 8 ) + { + $chars = "23456789abcdefghijkmnopqrstuvwxyz23456789ABCDEFGHJKLMNPQRSTUVWXYZ23456789"; + + while( true ) + { + $password = substr( str_shuffle( $chars ), 0, $len ); + + // "/[a-zA-Z0-9]/" is NOT the same! + if( (preg_match("/[a-z]/", $password)) && (preg_match("/[A-Z]/", $password)) && (preg_match("/[0-9]/", $password)) ) + return $password; + } + } +} diff --git a/application/models/Vendor.php b/application/models/Vendor.php new file mode 100644 index 000000000..0114d41c4 --- /dev/null +++ b/application/models/Vendor.php @@ -0,0 +1,40 @@ + + * @author Barry O'Donovan + */ +class Vendor extends BaseVendor +{ + +} \ No newline at end of file diff --git a/application/models/VendorTable.php b/application/models/VendorTable.php new file mode 100644 index 000000000..47724795b --- /dev/null +++ b/application/models/VendorTable.php @@ -0,0 +1,36 @@ + + * @author Barry O'Donovan + */ +class VendorTable extends Doctrine_Table +{ + +} \ No newline at end of file diff --git a/application/models/ViewCustCurrentActive.php b/application/models/ViewCustCurrentActive.php new file mode 100644 index 000000000..a0b53f981 --- /dev/null +++ b/application/models/ViewCustCurrentActive.php @@ -0,0 +1,60 @@ + + * @author Barry O'Donovan + */ +class ViewCustCurrentActive extends BaseViewCustCurrentActive +{ + public function setUp() + { + parent::setUp(); + + $this->hasOne( + 'ViewSwitchDetailsByCustid', + array( + 'local' => 'id', + 'foreign' => 'custid' + ) + ); + + $this->hasOne( + 'ViewVlaninterfaceDetailsByCustid', + array( + 'local' => 'id', + 'foreign' => 'custid' + ) + ); + } + +} diff --git a/application/models/ViewCustCurrentActiveTable.php b/application/models/ViewCustCurrentActiveTable.php new file mode 100644 index 000000000..2e9a28ca1 --- /dev/null +++ b/application/models/ViewCustCurrentActiveTable.php @@ -0,0 +1,36 @@ + + * @author Barry O'Donovan + */ +class ViewCustCurrentActiveTable extends Doctrine_Table +{ + +} \ No newline at end of file diff --git a/application/models/ViewSwitchDetailsByCustid.php b/application/models/ViewSwitchDetailsByCustid.php new file mode 100644 index 000000000..8b73bde69 --- /dev/null +++ b/application/models/ViewSwitchDetailsByCustid.php @@ -0,0 +1,73 @@ + + * @author Barry O'Donovan + */ +class ViewSwitchDetailsByCustid extends BaseViewSwitchDetailsByCustid +{ + public function setUp() + { + parent::setUp(); + + $this->hasOne( + 'ViewVlaninterfaceDetailsByCustid', + array( + 'local' => 'virtualinterfaceid', + 'foreign' => 'virtualinterfaceid' + ) + ); + + $this->hasOne( + 'ViewCustCurrentActive', + array( + 'local' => 'custid', + 'foreign' => 'id' + ) + ); + + } + + /** + * Return the physical port status as defined in the model + * Physicalinterface. + * + * @param $status If null, then the object's own $status property. + * @return string The status of the interface + * @see Physicalinterface + */ + public function getPhysicalInterfaceStatusString( $status = null ) + { + return Physicalinterface::$STATES_TEXT[ ( $status === null ? $this['status'] : $status ) ]; + } +} \ No newline at end of file diff --git a/application/models/ViewSwitchDetailsByCustidTable.php b/application/models/ViewSwitchDetailsByCustidTable.php new file mode 100644 index 000000000..e2fca3ce0 --- /dev/null +++ b/application/models/ViewSwitchDetailsByCustidTable.php @@ -0,0 +1,36 @@ + + * @author Barry O'Donovan + */ +class ViewSwitchDetailsByCustidTable extends Doctrine_Table +{ + +} \ No newline at end of file diff --git a/application/models/ViewVlaninterfaceDetailsByCustid.php b/application/models/ViewVlaninterfaceDetailsByCustid.php new file mode 100644 index 000000000..2a68642cd --- /dev/null +++ b/application/models/ViewVlaninterfaceDetailsByCustid.php @@ -0,0 +1,51 @@ + + * @author Barry O'Donovan + */ +class ViewVlaninterfaceDetailsByCustid extends BaseViewVlaninterfaceDetailsByCustid +{ + public function setUp() + { + parent::setUp(); + + $this->hasOne( + 'ViewCustCurrentActive', + array( + 'local' => 'custid', + 'foreign' => 'id' + ) + ); + } +} \ No newline at end of file diff --git a/application/models/ViewVlaninterfaceDetailsByCustidTable.php b/application/models/ViewVlaninterfaceDetailsByCustidTable.php new file mode 100644 index 000000000..c6819014b --- /dev/null +++ b/application/models/ViewVlaninterfaceDetailsByCustidTable.php @@ -0,0 +1,83 @@ + + * @author Barry O'Donovan + */ +class ViewVlaninterfaceDetailsByCustidTable extends Doctrine_Table +{ + + /** + * Get an array of route server enabled states by customer ID + * + * Returns an array of the form: + * custid -> rsclient + * + * @param $vlan int The VLAN to query + */ + public function getRSClientEnabledPerVLAN( $vlan = null ) + { + // get the member IPv6 enabled states for this VLAN + $_rsclient = Doctrine_Query::create() + ->select( 'custid, rsclient' ) + ->from( 'ViewVlaninterfaceDetailsByCustid' ) + ->where( 'vlan = ?' ) + ->execute( $vlan, Doctrine_Core::HYDRATE_ARRAY ); + + $rsclient = array(); + foreach( $_rsclient as $i ) + $rsclient[$i['custid']] = $i['rsclient']; + + return $rsclient; + } + + /** + * Get an array of IPv6 enabled states by customer ID + * + * Returns an array of the form: + * custid -> ipv6enabled + * + * @param $vlan int The VLAN to query + */ + public function getIPv6EnabledPerVLAN( $vlan = null ) + { + // get the member IPv6 enabled states for this VLAN + $_ipv6 = Doctrine_Query::create() + ->select( 'custid, ipv6enabled' ) + ->from( 'ViewVlaninterfaceDetailsByCustid' ) + ->where( 'vlan = ?' ) + ->execute( $vlan, Doctrine_Core::HYDRATE_ARRAY ); + + $ipv6 = array(); + foreach( $_ipv6 as $i ) + $ipv6[$i['custid']] = $i['ipv6enabled']; + + return $ipv6; + } +} \ No newline at end of file diff --git a/application/models/Virtualinterface.php b/application/models/Virtualinterface.php new file mode 100644 index 000000000..e3fba4519 --- /dev/null +++ b/application/models/Virtualinterface.php @@ -0,0 +1,59 @@ + + * @author Barry O'Donovan + */ +class Virtualinterface extends BaseVirtualinterface +{ + public function setUp() + { + parent::setUp(); + + $this->hasOne( 'Cust', array( 'local' => 'custid', 'foreign' => 'id') ); + + $this->hasMany( + 'Physicalinterface', array( + 'local' => 'id', + 'foreign' => 'virtualinterfaceid' + ) + ); + + $this->hasMany( + 'Vlaninterface', array( + 'local' => 'id', + 'foreign' => 'virtualinterfaceid' + ) + ); + } +} \ No newline at end of file diff --git a/application/models/VirtualinterfaceSeq.php b/application/models/VirtualinterfaceSeq.php new file mode 100644 index 000000000..8b103c9cc --- /dev/null +++ b/application/models/VirtualinterfaceSeq.php @@ -0,0 +1,40 @@ + + * @author Barry O'Donovan + */ +class VirtualinterfaceSeq extends BaseVirtualinterfaceSeq +{ + +} \ No newline at end of file diff --git a/application/models/VirtualinterfaceSeqTable.php b/application/models/VirtualinterfaceSeqTable.php new file mode 100644 index 000000000..d93fc5dfc --- /dev/null +++ b/application/models/VirtualinterfaceSeqTable.php @@ -0,0 +1,36 @@ + + * @author Barry O'Donovan + */ +class VirtualinterfaceSeqTable extends Doctrine_Table +{ + +} \ No newline at end of file diff --git a/application/models/VirtualinterfaceTable.php b/application/models/VirtualinterfaceTable.php new file mode 100644 index 000000000..507f0c797 --- /dev/null +++ b/application/models/VirtualinterfaceTable.php @@ -0,0 +1,36 @@ + + * @author Barry O'Donovan + */ +class VirtualinterfaceTable extends Doctrine_Table +{ + +} \ No newline at end of file diff --git a/application/models/Vlan.php b/application/models/Vlan.php new file mode 100644 index 000000000..065052eb0 --- /dev/null +++ b/application/models/Vlan.php @@ -0,0 +1,46 @@ + + * @author Barry O'Donovan + */ +class Vlan extends BaseVlan +{ + public function setUp() + { + parent::setUp(); + + $this->hasMany( 'Networkinfo', array( 'local' => 'id', 'foreign' => 'vlanid' ) ); + } + +} \ No newline at end of file diff --git a/application/models/VlanSeq.php b/application/models/VlanSeq.php new file mode 100644 index 000000000..58f7f227c --- /dev/null +++ b/application/models/VlanSeq.php @@ -0,0 +1,40 @@ + + * @author Barry O'Donovan + */ +class VlanSeq extends BaseVlanSeq +{ + +} \ No newline at end of file diff --git a/application/models/VlanSeqTable.php b/application/models/VlanSeqTable.php new file mode 100644 index 000000000..6e7f11ceb --- /dev/null +++ b/application/models/VlanSeqTable.php @@ -0,0 +1,36 @@ + + * @author Barry O'Donovan + */ +class VlanSeqTable extends Doctrine_Table +{ + +} \ No newline at end of file diff --git a/application/models/VlanTable.php b/application/models/VlanTable.php new file mode 100644 index 000000000..6fc13d506 --- /dev/null +++ b/application/models/VlanTable.php @@ -0,0 +1,36 @@ + + * @author Barry O'Donovan + */ +class VlanTable extends Doctrine_Table +{ + +} \ No newline at end of file diff --git a/application/models/Vlaninterface.php b/application/models/Vlaninterface.php new file mode 100644 index 000000000..b52a782c7 --- /dev/null +++ b/application/models/Vlaninterface.php @@ -0,0 +1,48 @@ + + * @author Barry O'Donovan + */ +class Vlaninterface extends BaseVlaninterface +{ + public function setUp() + { + parent::setUp(); + + $this->hasOne( 'Ipv4address', array( 'local' => 'ipv4addressid', 'foreign' => 'id') ); + $this->hasOne( 'Ipv6address', array( 'local' => 'ipv6addressid', 'foreign' => 'id') ); + $this->hasOne( 'Vlan', array( 'local' => 'vlanid', 'foreign' => 'id') ); + $this->hasOne( 'Virtualinterface', array( 'local' => 'virtualinterfaceid', 'foreign' => 'id') ); + } +} diff --git a/application/models/VlaninterfaceSeq.php b/application/models/VlaninterfaceSeq.php new file mode 100644 index 000000000..ecbb35e2d --- /dev/null +++ b/application/models/VlaninterfaceSeq.php @@ -0,0 +1,40 @@ + + * @author Barry O'Donovan + */ +class VlaninterfaceSeq extends BaseVlaninterfaceSeq +{ + +} \ No newline at end of file diff --git a/application/models/VlaninterfaceSeqTable.php b/application/models/VlaninterfaceSeqTable.php new file mode 100644 index 000000000..662559ea2 --- /dev/null +++ b/application/models/VlaninterfaceSeqTable.php @@ -0,0 +1,36 @@ + + * @author Barry O'Donovan + */ +class VlaninterfaceSeqTable extends Doctrine_Table +{ + +} \ No newline at end of file diff --git a/application/models/VlaninterfaceTable.php b/application/models/VlaninterfaceTable.php new file mode 100644 index 000000000..939c95a8a --- /dev/null +++ b/application/models/VlaninterfaceTable.php @@ -0,0 +1,36 @@ + + * @author Barry O'Donovan + */ +class VlaninterfaceTable extends Doctrine_Table +{ + +} \ No newline at end of file diff --git a/application/models/generated/BaseBgpsessiondata.php b/application/models/generated/BaseBgpsessiondata.php new file mode 100644 index 000000000..5c49e528f --- /dev/null +++ b/application/models/generated/BaseBgpsessiondata.php @@ -0,0 +1,84 @@ + + * @version SVN: $Id: BaseBgpsessiondata.php 414 2011-04-13 14:05:13Z barryo $ + */ +abstract class BaseBgpsessiondata extends Doctrine_Record +{ + public function setTableDefinition() + { + $this->setTableName('bgpsessiondata'); + $this->hasColumn('id', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => true, + 'autoincrement' => true, + )); + $this->hasColumn('srcipv4addressid', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('dstipv4addressid', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('packetcount', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('timestamp', 'timestamp', null, array( + 'type' => 'timestamp', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('source', 'string', 40, array( + 'type' => 'string', + 'length' => 40, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + } + + public function setUp() + { + parent::setUp(); + + } +} \ No newline at end of file diff --git a/application/models/generated/BaseCabinet.php b/application/models/generated/BaseCabinet.php new file mode 100644 index 000000000..5d79969ed --- /dev/null +++ b/application/models/generated/BaseCabinet.php @@ -0,0 +1,102 @@ + + * @version SVN: $Id: BaseCabinet.php 130 2010-03-23 16:50:54Z barryo $ + */ +abstract class BaseCabinet extends Doctrine_Record +{ + public function setTableDefinition() + { + $this->setTableName('cabinet'); + $this->hasColumn('id', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => true, + 'autoincrement' => true, + )); + $this->hasColumn('locationid', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'default' => '0', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('name', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('cololocation', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('height', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '0', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('type', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('notes', 'string', null, array( + 'type' => 'string', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + } + + public function setUp() + { + parent::setUp(); + $this->hasMany('PatchPanel', array( + 'local' => 'id', + 'foreign' => 'cabinetid')); + } +} \ No newline at end of file diff --git a/application/models/generated/BaseChangeLog.php b/application/models/generated/BaseChangeLog.php new file mode 100644 index 000000000..03ec42d6e --- /dev/null +++ b/application/models/generated/BaseChangeLog.php @@ -0,0 +1,92 @@ + + * @version SVN: $Id: BaseChangeLog.php 300 2010-07-01 15:10:52Z barryo $ + */ +abstract class BaseChangeLog extends Doctrine_Record +{ + public function setTableDefinition() + { + $this->setTableName('change_log'); + $this->hasColumn('id', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => true, + 'autoincrement' => true, + )); + $this->hasColumn('title', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('details', 'blob', null, array( + 'type' => 'blob', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('visibility', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('livedate', 'date', null, array( + 'type' => 'date', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('created_by', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('created_at', 'timestamp', null, array( + 'type' => 'timestamp', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + } + + public function setUp() + { + parent::setUp(); + + } +} \ No newline at end of file diff --git a/application/models/generated/BaseConsoleserverconnection.php b/application/models/generated/BaseConsoleserverconnection.php new file mode 100644 index 000000000..759d222fc --- /dev/null +++ b/application/models/generated/BaseConsoleserverconnection.php @@ -0,0 +1,134 @@ + + * @version SVN: $Id: BaseConsoleserverconnection.php 114 2010-03-15 12:49:13Z barryo $ + */ +abstract class BaseConsoleserverconnection extends Doctrine_Record +{ + public function setTableDefinition() + { + $this->setTableName('consoleserverconnection'); + $this->hasColumn('id', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => true, + 'autoincrement' => true, + )); + $this->hasColumn('description', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('custid', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('port', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('switchid', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('speed', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('parity', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('stopbits', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('flowcontrol', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('autobaud', 'integer', 1, array( + 'type' => 'integer', + 'length' => 1, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('notes', 'string', null, array( + 'type' => 'string', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + } + + public function setUp() + { + parent::setUp(); + + } +} \ No newline at end of file diff --git a/application/models/generated/BaseConsoleserverconnectionSeq.php b/application/models/generated/BaseConsoleserverconnectionSeq.php new file mode 100644 index 000000000..733df461d --- /dev/null +++ b/application/models/generated/BaseConsoleserverconnectionSeq.php @@ -0,0 +1,35 @@ + + * @version SVN: $Id: BaseConsoleserverconnectionSeq.php 114 2010-03-15 12:49:13Z barryo $ + */ +abstract class BaseConsoleserverconnectionSeq extends Doctrine_Record +{ + public function setTableDefinition() + { + $this->setTableName('consoleserverconnection_seq'); + $this->hasColumn('id', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => true, + 'autoincrement' => true, + )); + } + + public function setUp() + { + parent::setUp(); + + } +} \ No newline at end of file diff --git a/application/models/generated/BaseContact.php b/application/models/generated/BaseContact.php new file mode 100644 index 000000000..51ec67ff8 --- /dev/null +++ b/application/models/generated/BaseContact.php @@ -0,0 +1,148 @@ + + * @version SVN: $Id: BaseContact.php 114 2010-03-15 12:49:13Z barryo $ + */ +abstract class BaseContact extends Doctrine_Record +{ + public function setTableDefinition() + { + $this->setTableName('contact'); + $this->hasColumn('custid', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'default' => '0', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('name', 'string', 64, array( + 'type' => 'string', + 'length' => 64, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('email', 'string', 64, array( + 'type' => 'string', + 'length' => 64, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('phone', 'string', 32, array( + 'type' => 'string', + 'length' => 32, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('mobile', 'string', 32, array( + 'type' => 'string', + 'length' => 32, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('facilityaccess', 'integer', 1, array( + 'type' => 'integer', + 'length' => 1, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'default' => '1', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('mayauthorize', 'integer', 1, array( + 'type' => 'integer', + 'length' => 1, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'default' => '0', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('lastupdated', 'timestamp', null, array( + 'type' => 'timestamp', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('lastupdatedby', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('creator', 'string', 32, array( + 'type' => 'string', + 'length' => 32, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => 'Operations', + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('created', 'timestamp', null, array( + 'type' => 'timestamp', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('id', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => true, + 'autoincrement' => true, + )); + } + + public function setUp() + { + parent::setUp(); + + } +} \ No newline at end of file diff --git a/application/models/generated/BaseContactSeq.php b/application/models/generated/BaseContactSeq.php new file mode 100644 index 000000000..922be1beb --- /dev/null +++ b/application/models/generated/BaseContactSeq.php @@ -0,0 +1,35 @@ + + * @version SVN: $Id: BaseContactSeq.php 114 2010-03-15 12:49:13Z barryo $ + */ +abstract class BaseContactSeq extends Doctrine_Record +{ + public function setTableDefinition() + { + $this->setTableName('contact_seq'); + $this->hasColumn('id', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => true, + 'autoincrement' => true, + )); + } + + public function setUp() + { + parent::setUp(); + + } +} \ No newline at end of file diff --git a/application/models/generated/BaseCust.php b/application/models/generated/BaseCust.php new file mode 100644 index 000000000..ff27699bf --- /dev/null +++ b/application/models/generated/BaseCust.php @@ -0,0 +1,338 @@ + + * @version SVN: $Id: BaseCust.php 114 2010-03-15 12:49:13Z barryo $ + */ +abstract class BaseCust extends Doctrine_Record +{ + public function setTableDefinition() + { + $this->setTableName('cust'); + $this->hasColumn('name', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('type', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('shortname', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('autsys', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'default' => '0', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('maxprefixes', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('peeringemail', 'string', 64, array( + 'type' => 'string', + 'length' => 64, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('nocphone', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('noc24hphone', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('nocfax', 'string', 40, array( + 'type' => 'string', + 'length' => 40, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('nocemail', 'string', 40, array( + 'type' => 'string', + 'length' => 40, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('nochours', 'string', 40, array( + 'type' => 'string', + 'length' => 40, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '24x7', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('nocwww', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('irrdb', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('peeringmacro', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('peeringpolicy', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('billingContact', 'string', 64, array( + 'type' => 'string', + 'length' => 64, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('billingAddress1', 'string', 64, array( + 'type' => 'string', + 'length' => 64, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('billingAddress2', 'string', 64, array( + 'type' => 'string', + 'length' => 64, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('billingCity', 'string', 64, array( + 'type' => 'string', + 'length' => 64, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('billingCountry', 'string', 2, array( + 'type' => 'string', + 'length' => 2, + 'fixed' => true, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('corpwww', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('datejoin', 'date', null, array( + 'type' => 'date', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('dateleave', 'date', null, array( + 'type' => 'date', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('status', 'integer', 1, array( + 'type' => 'integer', + 'length' => 1, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('activepeeringmatrix', 'integer', 1, array( + 'type' => 'integer', + 'length' => 1, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '1', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('notes', 'string', null, array( + 'type' => 'string', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('lastupdated', 'timestamp', null, array( + 'type' => 'timestamp', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('lastupdatedby', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('creator', 'string', 32, array( + 'type' => 'string', + 'length' => 32, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => 'Operations', + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('created', 'timestamp', null, array( + 'type' => 'timestamp', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('id', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => true, + 'autoincrement' => true, + )); + } + + public function setUp() + { + parent::setUp(); + + } +} \ No newline at end of file diff --git a/application/models/generated/BaseCustSeq.php b/application/models/generated/BaseCustSeq.php new file mode 100644 index 000000000..d8d10fa01 --- /dev/null +++ b/application/models/generated/BaseCustSeq.php @@ -0,0 +1,35 @@ + + * @version SVN: $Id: BaseCustSeq.php 114 2010-03-15 12:49:13Z barryo $ + */ +abstract class BaseCustSeq extends Doctrine_Record +{ + public function setTableDefinition() + { + $this->setTableName('cust_seq'); + $this->hasColumn('id', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => true, + 'autoincrement' => true, + )); + } + + public function setUp() + { + parent::setUp(); + + } +} \ No newline at end of file diff --git a/application/models/generated/BaseCustkit.php b/application/models/generated/BaseCustkit.php new file mode 100644 index 000000000..c7a9fbad2 --- /dev/null +++ b/application/models/generated/BaseCustkit.php @@ -0,0 +1,77 @@ + + * @version SVN: $Id: BaseCustkit.php 114 2010-03-15 12:49:13Z barryo $ + */ +abstract class BaseCustkit extends Doctrine_Record +{ + public function setTableDefinition() + { + $this->setTableName('custkit'); + $this->hasColumn('id', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => true, + 'autoincrement' => true, + )); + $this->hasColumn('name', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('custid', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'default' => '0', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('cabinetid', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'default' => '0', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('descr', 'string', null, array( + 'type' => 'string', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + } + + public function setUp() + { + parent::setUp(); + + } +} \ No newline at end of file diff --git a/application/models/generated/BaseHistory.php b/application/models/generated/BaseHistory.php new file mode 100644 index 000000000..d22720ea3 --- /dev/null +++ b/application/models/generated/BaseHistory.php @@ -0,0 +1,132 @@ + + * @version SVN: $Id: BaseHistory.php 114 2010-03-15 12:49:13Z barryo $ + */ +abstract class BaseHistory extends Doctrine_Record +{ + public function setTableDefinition() + { + $this->setTableName('history'); + $this->hasColumn('id', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => true, + 'autoincrement' => true, + )); + $this->hasColumn('custid', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('tablename', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('tableid', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('tablefield', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('oldval', 'string', null, array( + 'type' => 'string', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('newval', 'string', null, array( + 'type' => 'string', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('uuid', 'string', 36, array( + 'type' => 'string', + 'length' => 36, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('username', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('eventtime', 'timestamp', null, array( + 'type' => 'timestamp', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('eventtype', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + } + + public function setUp() + { + parent::setUp(); + + } +} \ No newline at end of file diff --git a/application/models/generated/BaseIpv4address.php b/application/models/generated/BaseIpv4address.php new file mode 100644 index 000000000..c5af6c4ff --- /dev/null +++ b/application/models/generated/BaseIpv4address.php @@ -0,0 +1,55 @@ + + * @version SVN: $Id: BaseIpv4address.php 114 2010-03-15 12:49:13Z barryo $ + */ +abstract class BaseIpv4address extends Doctrine_Record +{ + public function setTableDefinition() + { + $this->setTableName('ipv4address'); + $this->hasColumn('id', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => true, + 'autoincrement' => true, + )); + $this->hasColumn('address', 'string', 16, array( + 'type' => 'string', + 'length' => 16, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('vlanid', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + } + + public function setUp() + { + parent::setUp(); + + } +} \ No newline at end of file diff --git a/application/models/generated/BaseIpv6address.php b/application/models/generated/BaseIpv6address.php new file mode 100644 index 000000000..6e16efa6e --- /dev/null +++ b/application/models/generated/BaseIpv6address.php @@ -0,0 +1,55 @@ + + * @version SVN: $Id: BaseIpv6address.php 114 2010-03-15 12:49:13Z barryo $ + */ +abstract class BaseIpv6address extends Doctrine_Record +{ + public function setTableDefinition() + { + $this->setTableName('ipv6address'); + $this->hasColumn('id', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => true, + 'autoincrement' => true, + )); + $this->hasColumn('address', 'string', 40, array( + 'type' => 'string', + 'length' => 40, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('vlanid', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + } + + public function setUp() + { + parent::setUp(); + + } +} \ No newline at end of file diff --git a/application/models/generated/BaseIrrdbconfig.php b/application/models/generated/BaseIrrdbconfig.php new file mode 100644 index 000000000..4faa25390 --- /dev/null +++ b/application/models/generated/BaseIrrdbconfig.php @@ -0,0 +1,74 @@ + + * @version SVN: $Id: Builder.php 7490 2010-03-29 19:53:27Z jwage $ + */ +abstract class BaseIrrdbconfig extends Doctrine_Record +{ + public function setTableDefinition() + { + $this->setTableName('irrdbconfig'); + $this->hasColumn('id', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => true, + 'autoincrement' => true, + )); + $this->hasColumn('host', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('protocol', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('source', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('notes', 'string', null, array( + 'type' => 'string', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + } + + public function setUp() + { + parent::setUp(); + + } +} \ No newline at end of file diff --git a/application/models/generated/BaseLocation.php b/application/models/generated/BaseLocation.php new file mode 100644 index 000000000..86765c789 --- /dev/null +++ b/application/models/generated/BaseLocation.php @@ -0,0 +1,152 @@ + + * @version SVN: $Id: BaseLocation.php 114 2010-03-15 12:49:13Z barryo $ + */ +abstract class BaseLocation extends Doctrine_Record +{ + public function setTableDefinition() + { + $this->setTableName('location'); + $this->hasColumn('id', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => true, + 'autoincrement' => true, + )); + $this->hasColumn('name', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('shortname', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('tag', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('address', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('nocphone', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('nocfax', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('nocemail', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('officephone', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('officefax', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('officeemail', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('notes', 'blob', null, array( + 'type' => 'blob', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + } + + public function setUp() + { + parent::setUp(); + + } +} \ No newline at end of file diff --git a/application/models/generated/BaseLogicalCircuit.php b/application/models/generated/BaseLogicalCircuit.php new file mode 100644 index 000000000..de7ca1939 --- /dev/null +++ b/application/models/generated/BaseLogicalCircuit.php @@ -0,0 +1,82 @@ + + * @version SVN: $Id: BaseLogicalCircuit.php 138 2010-04-13 15:10:40Z barryo $ + */ +abstract class BaseLogicalCircuit extends Doctrine_Record +{ + public function setTableDefinition() + { + $this->setTableName('logical_circuit'); + $this->hasColumn('id', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => true, + 'autoincrement' => true, + )); + $this->hasColumn('our_ref', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('installed', 'timestamp', null, array( + 'type' => 'timestamp', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('removed', 'timestamp', null, array( + 'type' => 'timestamp', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('custid', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('notes', 'blob', null, array( + 'type' => 'blob', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + } + + public function setUp() + { + parent::setUp(); + + } +} \ No newline at end of file diff --git a/application/models/generated/BaseMeeting.php b/application/models/generated/BaseMeeting.php new file mode 100644 index 000000000..5b26f5e86 --- /dev/null +++ b/application/models/generated/BaseMeeting.php @@ -0,0 +1,148 @@ + + * @version SVN: $Id: BaseMeeting.php 341 2010-08-18 09:42:41Z barryo $ + */ +abstract class BaseMeeting extends Doctrine_Record +{ + public function setTableDefinition() + { + $this->setTableName('meeting'); + $this->hasColumn('id', 'integer', 8, array( + 'type' => 'integer', + 'length' => 8, + 'fixed' => false, + 'unsigned' => true, + 'primary' => true, + 'autoincrement' => true, + )); + $this->hasColumn('title', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('before_text', 'string', null, array( + 'type' => 'string', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('after_text', 'string', null, array( + 'type' => 'string', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('date', 'date', null, array( + 'type' => 'date', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('time', 'time', null, array( + 'type' => 'time', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('venue', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('venue_url', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('created_at', 'timestamp', null, array( + 'type' => 'timestamp', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('created_by', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('updated_at', 'timestamp', null, array( + 'type' => 'timestamp', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('updated_by', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + } + + public function setUp() + { + parent::setUp(); + $this->hasOne('User', array( + 'local' => 'created_by', + 'foreign' => 'id')); + + $this->hasOne('User as User_2', array( + 'local' => 'updated_by', + 'foreign' => 'id')); + } +} \ No newline at end of file diff --git a/application/models/generated/BaseMeetingItem.php b/application/models/generated/BaseMeetingItem.php new file mode 100644 index 000000000..d72a0ed7f --- /dev/null +++ b/application/models/generated/BaseMeetingItem.php @@ -0,0 +1,194 @@ + + * @version SVN: $Id: BaseMeetingItem.php 360 2010-08-19 10:19:24Z barryo $ + */ +abstract class BaseMeetingItem extends Doctrine_Record +{ + public function setTableDefinition() + { + $this->setTableName('meeting_item'); + $this->hasColumn('id', 'integer', 8, array( + 'type' => 'integer', + 'length' => 8, + 'fixed' => false, + 'unsigned' => true, + 'primary' => true, + 'autoincrement' => true, + )); + $this->hasColumn('meeting_id', 'integer', 8, array( + 'type' => 'integer', + 'length' => 8, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('title', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('name', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('role', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('email', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('company', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('company_url', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('summary', 'string', null, array( + 'type' => 'string', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('presentation', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('filename', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('video_url', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('other_content', 'integer', 1, array( + 'type' => 'integer', + 'length' => 1, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '0', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('created_by', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('created_at', 'timestamp', null, array( + 'type' => 'timestamp', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('updated_by', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('updated_at', 'timestamp', null, array( + 'type' => 'timestamp', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + } + + public function setUp() + { + parent::setUp(); + + } +} \ No newline at end of file diff --git a/application/models/generated/BaseMyPeeringMatrix.php b/application/models/generated/BaseMyPeeringMatrix.php new file mode 100644 index 000000000..9fec70338 --- /dev/null +++ b/application/models/generated/BaseMyPeeringMatrix.php @@ -0,0 +1,130 @@ + + * @version SVN: $Id: BaseMyPeeringMatrix.php 301 2010-07-01 15:26:21Z barryo $ + */ +abstract class BaseMyPeeringMatrix extends Doctrine_Record +{ + public function setTableDefinition() + { + $this->setTableName('my_peering_matrix'); + $this->hasColumn('id', 'integer', 8, array( + 'type' => 'integer', + 'length' => 8, + 'fixed' => false, + 'unsigned' => true, + 'primary' => true, + 'autoincrement' => true, + )); + $this->hasColumn('custid', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('peerid', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('vlan', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('peered', 'enum', 7, array( + 'type' => 'enum', + 'length' => 7, + 'fixed' => false, + 'unsigned' => false, + 'values' => + array( + 0 => 'YES', + 1 => 'NO', + 2 => 'WAITING', + 3 => 'NEVER', + ), + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('ipv6', 'integer', 1, array( + 'type' => 'integer', + 'length' => 1, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '0', + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('notes_id', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('deleted_at', 'timestamp', null, array( + 'type' => 'timestamp', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('updated', 'timestamp', null, array( + 'type' => 'timestamp', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('created', 'timestamp', null, array( + 'type' => 'timestamp', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + } + + public function setUp() + { + parent::setUp(); + + } +} \ No newline at end of file diff --git a/application/models/generated/BaseMyPeeringMatrixNotes.php b/application/models/generated/BaseMyPeeringMatrixNotes.php new file mode 100644 index 000000000..cf2d5f0c1 --- /dev/null +++ b/application/models/generated/BaseMyPeeringMatrixNotes.php @@ -0,0 +1,73 @@ + + * @version SVN: $Id: BaseMyPeeringMatrixNotes.php 288 2010-06-24 08:18:19Z barryo $ + */ +abstract class BaseMyPeeringMatrixNotes extends Doctrine_Record +{ + public function setTableDefinition() + { + $this->setTableName('my_peering_matrix_notes'); + $this->hasColumn('id', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => true, + 'autoincrement' => true, + )); + $this->hasColumn('custid', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('peerid', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('notes', 'blob', null, array( + 'type' => 'blob', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('deleted_at', 'timestamp', null, array( + 'type' => 'timestamp', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + } + + public function setUp() + { + parent::setUp(); + + } +} \ No newline at end of file diff --git a/application/models/generated/BaseNetworkinfo.php b/application/models/generated/BaseNetworkinfo.php new file mode 100644 index 000000000..9e29e999b --- /dev/null +++ b/application/models/generated/BaseNetworkinfo.php @@ -0,0 +1,105 @@ + + * @version SVN: $Id: BaseNetworkinfo.php 114 2010-03-15 12:49:13Z barryo $ + */ +abstract class BaseNetworkinfo extends Doctrine_Record +{ + public function setTableDefinition() + { + $this->setTableName('networkinfo'); + $this->hasColumn('id', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => true, + 'autoincrement' => true, + )); + $this->hasColumn('vlanid', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('protocol', 'integer', 1, array( + 'type' => 'integer', + 'length' => 1, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('network', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('masklen', 'integer', 1, array( + 'type' => 'integer', + 'length' => 1, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('rs1address', 'string', 40, array( + 'type' => 'string', + 'length' => 40, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('rs2address', 'string', 40, array( + 'type' => 'string', + 'length' => 40, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('dnsfile', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + } + + public function setUp() + { + parent::setUp(); + + } +} \ No newline at end of file diff --git a/application/models/generated/BasePatchPanel.php b/application/models/generated/BasePatchPanel.php new file mode 100644 index 000000000..52fbb95d7 --- /dev/null +++ b/application/models/generated/BasePatchPanel.php @@ -0,0 +1,112 @@ + + * @version SVN: $Id: BasePatchPanel.php 131 2010-03-23 17:08:09Z barryo $ + */ +abstract class BasePatchPanel extends Doctrine_Record +{ + public function setTableDefinition() + { + $this->setTableName('patch_panel'); + $this->hasColumn('id', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => true, + 'autoincrement' => true, + )); + $this->hasColumn('cabinetid', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('name', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('colo_ref', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('cable_type', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('interface_type', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('allow_duplex', 'integer', 1, array( + 'type' => 'integer', + 'length' => 1, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('notes', 'string', null, array( + 'type' => 'string', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + } + + public function setUp() + { + parent::setUp(); + $this->hasOne('Cabinet', array( + 'local' => 'cabinetid', + 'foreign' => 'id')); + + $this->hasMany('PatchPanelPort', array( + 'local' => 'id', + 'foreign' => 'patch_panel_id')); + } +} \ No newline at end of file diff --git a/application/models/generated/BasePatchPanelPort.php b/application/models/generated/BasePatchPanelPort.php new file mode 100644 index 000000000..b284ac331 --- /dev/null +++ b/application/models/generated/BasePatchPanelPort.php @@ -0,0 +1,110 @@ + + * @version SVN: $Id: BasePatchPanelPort.php 130 2010-03-23 16:50:54Z barryo $ + */ +abstract class BasePatchPanelPort extends Doctrine_Record +{ + public function setTableDefinition() + { + $this->setTableName('patch_panel_port'); + $this->hasColumn('id', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => true, + 'autoincrement' => true, + )); + $this->hasColumn('patch_panel_id', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('port', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('side', 'integer', 2, array( + 'type' => 'integer', + 'length' => 2, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'default' => '0', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('type', 'integer', 2, array( + 'type' => 'integer', + 'length' => 2, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'default' => '0', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('colo_ref', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('cable_type', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('duplex', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + } + + public function setUp() + { + parent::setUp(); + $this->hasOne('PatchPanel', array( + 'local' => 'patch_panel_id', + 'foreign' => 'id')); + } +} \ No newline at end of file diff --git a/application/models/generated/BasePeeringMatrix.php b/application/models/generated/BasePeeringMatrix.php new file mode 100644 index 000000000..1b0d703fa --- /dev/null +++ b/application/models/generated/BasePeeringMatrix.php @@ -0,0 +1,111 @@ + + * @version SVN: $Id: BasePeeringMatrix.php 232 2010-05-28 13:37:39Z barryo $ + */ +abstract class BasePeeringMatrix extends Doctrine_Record +{ + public function setTableDefinition() + { + $this->setTableName('peering_matrix'); + $this->hasColumn('id', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => true, + 'autoincrement' => true, + )); + $this->hasColumn('vlan', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('x_as', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('x_custid', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('y_as', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('y_custid', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('peering_status', 'enum', 14, array( + 'type' => 'enum', + 'length' => 14, + 'fixed' => false, + 'unsigned' => false, + 'values' => + array( + 0 => 'YES', + 1 => 'NO', + 2 => 'INCONSISTENT_X', + 3 => 'INCONSISTENT_Y', + ), + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('updated', 'timestamp', null, array( + 'type' => 'timestamp', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + } + + public function setUp() + { + parent::setUp(); + + } +} \ No newline at end of file diff --git a/application/models/generated/BasePhysicalCircuit.php b/application/models/generated/BasePhysicalCircuit.php new file mode 100644 index 000000000..69d164dce --- /dev/null +++ b/application/models/generated/BasePhysicalCircuit.php @@ -0,0 +1,142 @@ + + * @version SVN: $Id: BasePhysicalCircuit.php 138 2010-04-13 15:10:40Z barryo $ + */ +abstract class BasePhysicalCircuit extends Doctrine_Record +{ + public function setTableDefinition() + { + $this->setTableName('physical_circuit'); + $this->hasColumn('id', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => true, + 'autoincrement' => true, + )); + $this->hasColumn('logical_circuit_id', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('our_ref', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('colo_ref', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('installed', 'timestamp', null, array( + 'type' => 'timestamp', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('removed', 'timestamp', null, array( + 'type' => 'timestamp', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('a_type', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('a_id', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('b_type', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('b_id', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('next_physical_circuit', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('notes', 'blob', null, array( + 'type' => 'blob', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + } + + public function setUp() + { + parent::setUp(); + + } +} \ No newline at end of file diff --git a/application/models/generated/BasePhysicalinterface.php b/application/models/generated/BasePhysicalinterface.php new file mode 100644 index 000000000..377654ce2 --- /dev/null +++ b/application/models/generated/BasePhysicalinterface.php @@ -0,0 +1,104 @@ + + * @version SVN: $Id: BasePhysicalinterface.php 114 2010-03-15 12:49:13Z barryo $ + */ +abstract class BasePhysicalinterface extends Doctrine_Record +{ + public function setTableDefinition() + { + $this->setTableName('physicalinterface'); + $this->hasColumn('id', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => true, + 'autoincrement' => true, + )); + $this->hasColumn('switchportid', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('virtualinterfaceid', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('status', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('speed', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('duplex', 'string', 16, array( + 'type' => 'string', + 'length' => 16, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('monitorindex', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('notes', 'string', null, array( + 'type' => 'string', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + } + + public function setUp() + { + parent::setUp(); + + } +} \ No newline at end of file diff --git a/application/models/generated/BasePhysicalinterfaceSeq.php b/application/models/generated/BasePhysicalinterfaceSeq.php new file mode 100644 index 000000000..905b5947d --- /dev/null +++ b/application/models/generated/BasePhysicalinterfaceSeq.php @@ -0,0 +1,35 @@ + + * @version SVN: $Id: BasePhysicalinterfaceSeq.php 114 2010-03-15 12:49:13Z barryo $ + */ +abstract class BasePhysicalinterfaceSeq extends Doctrine_Record +{ + public function setTableDefinition() + { + $this->setTableName('physicalinterface_seq'); + $this->hasColumn('id', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => true, + 'autoincrement' => true, + )); + } + + public function setUp() + { + parent::setUp(); + + } +} \ No newline at end of file diff --git a/application/models/generated/BaseProvisioningInterface.php b/application/models/generated/BaseProvisioningInterface.php new file mode 100644 index 000000000..f1a84892d --- /dev/null +++ b/application/models/generated/BaseProvisioningInterface.php @@ -0,0 +1,158 @@ + + * @version SVN: $Id: BaseProvisioningInterface.php 364 2010-09-16 18:47:19Z barryo $ + */ +abstract class BaseProvisioningInterface extends Doctrine_Record +{ + public function setTableDefinition() + { + $this->setTableName('provisioning_interface'); + $this->hasColumn('id', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => true, + 'autoincrement' => true, + )); + $this->hasColumn('cust_id', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'default' => '0', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('virtualinterface_id', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'default' => '0', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('physicalinterface_id', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'default' => '0', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('vlaninterface_id', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'default' => '0', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('mail_sent', 'integer', 1, array( + 'type' => 'integer', + 'length' => 1, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '0', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('switch_config', 'integer', 1, array( + 'type' => 'integer', + 'length' => 1, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '0', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('quarantine_start', 'timestamp', null, array( + 'type' => 'timestamp', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('quarantine_end', 'timestamp', null, array( + 'type' => 'timestamp', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('complete', 'integer', 1, array( + 'type' => 'integer', + 'length' => 1, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '0', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('created_by', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('created_at', 'timestamp', null, array( + 'type' => 'timestamp', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('completed_at', 'timestamp', null, array( + 'type' => 'timestamp', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + } + + public function setUp() + { + parent::setUp(); + + } +} \ No newline at end of file diff --git a/application/models/generated/BaseSecEvent.php b/application/models/generated/BaseSecEvent.php new file mode 100644 index 000000000..ba4141a34 --- /dev/null +++ b/application/models/generated/BaseSecEvent.php @@ -0,0 +1,111 @@ + + * @version SVN: $Id: BaseSecEvent.php 114 2010-03-15 12:49:13Z barryo $ + */ +abstract class BaseSecEvent extends Doctrine_Record +{ + public function setTableDefinition() + { + $this->setTableName('sec_event'); + $this->hasColumn('id', 'integer', 8, array( + 'type' => 'integer', + 'length' => 8, + 'fixed' => false, + 'unsigned' => true, + 'primary' => true, + 'autoincrement' => true, + )); + $this->hasColumn('custid', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('switchid', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('switchportid', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('type', 'enum', 18, array( + 'type' => 'enum', + 'length' => 18, + 'fixed' => false, + 'unsigned' => false, + 'values' => + array( + 0 => 'SECURITY_VIOLATION', + 1 => 'PORT_UPDOWN', + 2 => 'LINEPROTO_UPDOWN', + 3 => 'BGP_AUTH', + ), + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('message', 'string', null, array( + 'type' => 'string', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('recorded_date', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('timestamp', 'timestamp', null, array( + 'type' => 'timestamp', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + } + + public function setUp() + { + parent::setUp(); + + } +} \ No newline at end of file diff --git a/application/models/generated/BaseSwitch.php b/application/models/generated/BaseSwitch.php new file mode 100644 index 000000000..c2365b9dc --- /dev/null +++ b/application/models/generated/BaseSwitch.php @@ -0,0 +1,151 @@ + + * @version SVN: $Id: BaseSwitch.php 113 2010-03-15 12:48:27Z barryo $ + */ +abstract class BaseSwitch extends Doctrine_Record +{ + public function setTableDefinition() + { + $this->setTableName('switch'); + $this->hasColumn('id', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => true, + 'autoincrement' => true, + )); + $this->hasColumn('name', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('cabinetid', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'default' => '0', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('ipv4addr', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('ipv6addr', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('snmppasswd', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('infrastructure', 'integer', 1, array( + 'type' => 'integer', + 'length' => 1, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('switchtype', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('vendorid', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'default' => '0', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('model', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('active', 'integer', 1, array( + 'type' => 'integer', + 'length' => 1, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('notes', 'string', null, array( + 'type' => 'string', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + } + + public function setUp() + { + parent::setUp(); + + } +} \ No newline at end of file diff --git a/application/models/generated/BaseSwitchSeq.php b/application/models/generated/BaseSwitchSeq.php new file mode 100644 index 000000000..0ce6a493b --- /dev/null +++ b/application/models/generated/BaseSwitchSeq.php @@ -0,0 +1,35 @@ + + * @version SVN: $Id: BaseSwitchSeq.php 114 2010-03-15 12:49:13Z barryo $ + */ +abstract class BaseSwitchSeq extends Doctrine_Record +{ + public function setTableDefinition() + { + $this->setTableName('switch_seq'); + $this->hasColumn('id', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => true, + 'autoincrement' => true, + )); + } + + public function setUp() + { + parent::setUp(); + + } +} \ No newline at end of file diff --git a/application/models/generated/BaseSwitchTable.php b/application/models/generated/BaseSwitchTable.php new file mode 100644 index 000000000..f09cd314f --- /dev/null +++ b/application/models/generated/BaseSwitchTable.php @@ -0,0 +1,125 @@ + + * @version SVN: $Id: BaseSwitchTable.php 53 2010-02-08 11:49:49Z barryo $ + */ +abstract class BaseSwitchTable extends Doctrine_Record +{ + public function setTableDefinition() + { + $this->setTableName('switch'); + $this->hasColumn('id', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'unsigned' => 1, + 'primary' => true, + 'autoincrement' => true, + )); + $this->hasColumn('name', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'primary' => false, + 'default' => '', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('cabinetid', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'unsigned' => 1, + 'primary' => false, + 'default' => '0', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('ipv4addr', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'primary' => false, + 'default' => '', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('ipv6addr', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'primary' => false, + 'default' => '', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('snmppasswd', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'primary' => false, + 'default' => '', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('switchtype', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'unsigned' => 1, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('vendorid', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'unsigned' => 1, + 'primary' => false, + 'default' => '0', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('model', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'primary' => false, + 'default' => '', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('active', 'integer', 1, array( + 'type' => 'integer', + 'length' => 1, + 'unsigned' => 1, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('notes', 'string', null, array( + 'type' => 'string', + 'fixed' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + } + +} \ No newline at end of file diff --git a/application/models/generated/BaseSwitchport.php b/application/models/generated/BaseSwitchport.php new file mode 100644 index 000000000..2b0857bf9 --- /dev/null +++ b/application/models/generated/BaseSwitchport.php @@ -0,0 +1,68 @@ + + * @version SVN: $Id: BaseSwitchport.php 114 2010-03-15 12:49:13Z barryo $ + */ +abstract class BaseSwitchport extends Doctrine_Record +{ + public function setTableDefinition() + { + $this->setTableName('switchport'); + $this->hasColumn('id', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => true, + 'autoincrement' => true, + )); + $this->hasColumn('switchid', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'default' => '0', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('type', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'default' => '0', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('name', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '', + 'notnull' => true, + 'autoincrement' => false, + )); + } + + public function setUp() + { + parent::setUp(); + + } +} \ No newline at end of file diff --git a/application/models/generated/BaseTraffic95th.php b/application/models/generated/BaseTraffic95th.php new file mode 100644 index 000000000..3f0986578 --- /dev/null +++ b/application/models/generated/BaseTraffic95th.php @@ -0,0 +1,74 @@ + + * @version SVN: $Id: BaseTraffic95th.php 114 2010-03-15 12:49:13Z barryo $ + */ +abstract class BaseTraffic95th extends Doctrine_Record +{ + public function setTableDefinition() + { + $this->setTableName('traffic_95th'); + $this->hasColumn('id', 'integer', 8, array( + 'type' => 'integer', + 'length' => 8, + 'fixed' => false, + 'unsigned' => true, + 'primary' => true, + 'autoincrement' => true, + )); + $this->hasColumn('cust_id', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('datetime', 'timestamp', null, array( + 'type' => 'timestamp', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('average', 'integer', 8, array( + 'type' => 'integer', + 'length' => 8, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('max', 'integer', 8, array( + 'type' => 'integer', + 'length' => 8, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + } + + public function setUp() + { + parent::setUp(); + + } +} \ No newline at end of file diff --git a/application/models/generated/BaseTraffic95thMonthly.php b/application/models/generated/BaseTraffic95thMonthly.php new file mode 100644 index 000000000..897bd98f2 --- /dev/null +++ b/application/models/generated/BaseTraffic95thMonthly.php @@ -0,0 +1,64 @@ + + * @version SVN: $Id: BaseTraffic95thMonthly.php 143 2010-04-28 10:54:56Z barryo $ + */ +abstract class BaseTraffic95thMonthly extends Doctrine_Record +{ + public function setTableDefinition() + { + $this->setTableName('traffic_95th_monthly'); + $this->hasColumn('id', 'integer', 8, array( + 'type' => 'integer', + 'length' => 8, + 'fixed' => false, + 'unsigned' => true, + 'primary' => true, + 'autoincrement' => true, + )); + $this->hasColumn('cust_id', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('month', 'date', null, array( + 'type' => 'date', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('max_95th', 'integer', 8, array( + 'type' => 'integer', + 'length' => 8, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + } + + public function setUp() + { + parent::setUp(); + + } +} \ No newline at end of file diff --git a/application/models/generated/BaseTrafficDaily.php b/application/models/generated/BaseTrafficDaily.php new file mode 100644 index 000000000..125c4c986 --- /dev/null +++ b/application/models/generated/BaseTrafficDaily.php @@ -0,0 +1,311 @@ + + * @version SVN: $Id: BaseTrafficDaily.php 114 2010-03-15 12:49:13Z barryo $ + */ +abstract class BaseTrafficDaily extends Doctrine_Record +{ + public function setTableDefinition() + { + $this->setTableName('traffic_daily'); + $this->hasColumn('id', 'integer', 8, array( + 'type' => 'integer', + 'length' => 8, + 'fixed' => false, + 'unsigned' => true, + 'primary' => true, + 'autoincrement' => true, + )); + $this->hasColumn('cust_id', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('day', 'date', null, array( + 'type' => 'date', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('category', 'enum', 5, array( + 'type' => 'enum', + 'length' => 5, + 'fixed' => false, + 'unsigned' => false, + 'values' => + array( + 0 => 'bits', + 1 => 'pkts', + 2 => 'errs', + 3 => 'discs', + ), + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('day_avg_in', 'integer', 8, array( + 'type' => 'integer', + 'length' => 8, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('day_avg_out', 'integer', 8, array( + 'type' => 'integer', + 'length' => 8, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('day_max_in', 'integer', 8, array( + 'type' => 'integer', + 'length' => 8, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('day_max_out', 'integer', 8, array( + 'type' => 'integer', + 'length' => 8, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('day_tot_in', 'integer', 8, array( + 'type' => 'integer', + 'length' => 8, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('day_tot_out', 'integer', 8, array( + 'type' => 'integer', + 'length' => 8, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('week_avg_in', 'integer', 8, array( + 'type' => 'integer', + 'length' => 8, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('week_avg_out', 'integer', 8, array( + 'type' => 'integer', + 'length' => 8, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('week_max_in', 'integer', 8, array( + 'type' => 'integer', + 'length' => 8, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('week_max_out', 'integer', 8, array( + 'type' => 'integer', + 'length' => 8, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('week_tot_in', 'integer', 8, array( + 'type' => 'integer', + 'length' => 8, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('week_tot_out', 'integer', 8, array( + 'type' => 'integer', + 'length' => 8, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('month_avg_in', 'integer', 8, array( + 'type' => 'integer', + 'length' => 8, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('month_avg_out', 'integer', 8, array( + 'type' => 'integer', + 'length' => 8, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('month_max_in', 'integer', 8, array( + 'type' => 'integer', + 'length' => 8, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('month_max_out', 'integer', 8, array( + 'type' => 'integer', + 'length' => 8, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('month_tot_in', 'integer', 8, array( + 'type' => 'integer', + 'length' => 8, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('month_tot_out', 'integer', 8, array( + 'type' => 'integer', + 'length' => 8, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('year_avg_in', 'integer', 8, array( + 'type' => 'integer', + 'length' => 8, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('year_avg_out', 'integer', 8, array( + 'type' => 'integer', + 'length' => 8, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('year_max_in', 'integer', 8, array( + 'type' => 'integer', + 'length' => 8, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('year_max_out', 'integer', 8, array( + 'type' => 'integer', + 'length' => 8, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('year_tot_in', 'integer', 8, array( + 'type' => 'integer', + 'length' => 8, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('year_tot_out', 'integer', 8, array( + 'type' => 'integer', + 'length' => 8, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + } + + public function setUp() + { + parent::setUp(); + + } +} \ No newline at end of file diff --git a/application/models/generated/BaseUser.php b/application/models/generated/BaseUser.php new file mode 100644 index 000000000..fd59f1bb5 --- /dev/null +++ b/application/models/generated/BaseUser.php @@ -0,0 +1,178 @@ + + * @version SVN: $Id: BaseUser.php 324 2010-07-21 07:38:01Z barryo $ + */ +abstract class BaseUser extends Doctrine_Record +{ + public function setTableDefinition() + { + $this->setTableName('user'); + $this->hasColumn('username', 'string', 30, array( + 'type' => 'string', + 'length' => 30, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('password', 'string', 30, array( + 'type' => 'string', + 'length' => 30, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('email', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('authorisedMobile', 'string', 30, array( + 'type' => 'string', + 'length' => 30, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('uid', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('custid', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'default' => '0', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('privs', 'integer', 1, array( + 'type' => 'integer', + 'length' => 1, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '0', + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('disabled', 'integer', 1, array( + 'type' => 'integer', + 'length' => 1, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '0', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('lastupdated', 'timestamp', null, array( + 'type' => 'timestamp', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('lastupdatedby', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('creator', 'string', 32, array( + 'type' => 'string', + 'length' => 32, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => 'Manager', + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('created', 'timestamp', null, array( + 'type' => 'timestamp', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('id', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => true, + 'autoincrement' => true, + )); + $this->hasColumn('parent_id', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + } + + public function setUp() + { + parent::setUp(); + $this->hasMany('Meeting', array( + 'local' => 'id', + 'foreign' => 'created_by')); + + $this->hasMany('Meeting as Meeting_2', array( + 'local' => 'id', + 'foreign' => 'updated_by')); + } +} \ No newline at end of file diff --git a/application/models/generated/BaseUserPref.php b/application/models/generated/BaseUserPref.php new file mode 100644 index 000000000..a1e409a48 --- /dev/null +++ b/application/models/generated/BaseUserPref.php @@ -0,0 +1,74 @@ + + * @version SVN: $Id: BaseUserPref.php 288 2010-06-24 08:18:19Z barryo $ + */ +abstract class BaseUserPref extends Doctrine_Record +{ + public function setTableDefinition() + { + $this->setTableName('user_pref'); + $this->hasColumn('id', 'integer', 8, array( + 'type' => 'integer', + 'length' => 8, + 'fixed' => false, + 'unsigned' => true, + 'primary' => true, + 'autoincrement' => true, + )); + $this->hasColumn('user_id', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('attribute', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('op', 'string', 2, array( + 'type' => 'string', + 'length' => 2, + 'fixed' => true, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('value', 'string', null, array( + 'type' => 'string', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + } + + public function setUp() + { + parent::setUp(); + + } +} \ No newline at end of file diff --git a/application/models/generated/BaseUserSeq.php b/application/models/generated/BaseUserSeq.php new file mode 100644 index 000000000..99fab6b6d --- /dev/null +++ b/application/models/generated/BaseUserSeq.php @@ -0,0 +1,35 @@ + + * @version SVN: $Id: BaseUserSeq.php 114 2010-03-15 12:49:13Z barryo $ + */ +abstract class BaseUserSeq extends Doctrine_Record +{ + public function setTableDefinition() + { + $this->setTableName('user_seq'); + $this->hasColumn('id', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => true, + 'autoincrement' => true, + )); + } + + public function setUp() + { + parent::setUp(); + + } +} \ No newline at end of file diff --git a/application/models/generated/BaseVendor.php b/application/models/generated/BaseVendor.php new file mode 100644 index 000000000..43a25f2c5 --- /dev/null +++ b/application/models/generated/BaseVendor.php @@ -0,0 +1,46 @@ + + * @version SVN: $Id: BaseVendor.php 114 2010-03-15 12:49:13Z barryo $ + */ +abstract class BaseVendor extends Doctrine_Record +{ + public function setTableDefinition() + { + $this->setTableName('vendor'); + $this->hasColumn('id', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => true, + 'autoincrement' => true, + )); + $this->hasColumn('name', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '', + 'notnull' => true, + 'autoincrement' => false, + )); + } + + public function setUp() + { + parent::setUp(); + + } +} \ No newline at end of file diff --git a/application/models/generated/BaseViewCustCurrentActive.php b/application/models/generated/BaseViewCustCurrentActive.php new file mode 100644 index 000000000..6c26d0f59 --- /dev/null +++ b/application/models/generated/BaseViewCustCurrentActive.php @@ -0,0 +1,340 @@ + + * @version SVN: $Id: BaseViewCustCurrentActive.php 114 2010-03-15 12:49:13Z barryo $ + */ +abstract class BaseViewCustCurrentActive extends Doctrine_Record +{ + public function setTableDefinition() + { + $this->setTableName('view_cust_current_active'); + $this->hasColumn('name', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('type', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('shortname', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('autsys', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'default' => '0', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('maxprefixes', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('peeringemail', 'string', 64, array( + 'type' => 'string', + 'length' => 64, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('nocphone', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('noc24hphone', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('nocfax', 'string', 40, array( + 'type' => 'string', + 'length' => 40, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('nocemail', 'string', 40, array( + 'type' => 'string', + 'length' => 40, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('nochours', 'string', 40, array( + 'type' => 'string', + 'length' => 40, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '24x7', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('nocwww', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('irrdb', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('peeringmacro', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('peeringpolicy', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('billingContact', 'string', 64, array( + 'type' => 'string', + 'length' => 64, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('billingAddress1', 'string', 64, array( + 'type' => 'string', + 'length' => 64, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('billingAddress2', 'string', 64, array( + 'type' => 'string', + 'length' => 64, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('billingCity', 'string', 64, array( + 'type' => 'string', + 'length' => 64, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('billingCountry', 'string', 2, array( + 'type' => 'string', + 'length' => 2, + 'fixed' => true, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('corpwww', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('datejoin', 'date', null, array( + 'type' => 'date', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('dateleave', 'date', null, array( + 'type' => 'date', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('status', 'integer', 1, array( + 'type' => 'integer', + 'length' => 1, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('activepeeringmatrix', 'integer', 1, array( + 'type' => 'integer', + 'length' => 1, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '1', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('notes', 'string', null, array( + 'type' => 'string', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('lastupdated', 'timestamp', null, array( + 'type' => 'timestamp', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('lastupdatedby', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('creator', 'string', 32, array( + 'type' => 'string', + 'length' => 32, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => 'Operations', + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('created', 'timestamp', null, array( + 'type' => 'timestamp', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('id', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'default' => '0', + 'notnull' => true, + 'autoincrement' => false, + )); + } + + public function setUp() + { + parent::setUp(); + + } +} \ No newline at end of file diff --git a/application/models/generated/BaseViewSwitchDetailsByCustid.php b/application/models/generated/BaseViewSwitchDetailsByCustid.php new file mode 100644 index 000000000..058217000 --- /dev/null +++ b/application/models/generated/BaseViewSwitchDetailsByCustid.php @@ -0,0 +1,225 @@ + + * @version SVN: $Id: BaseViewSwitchDetailsByCustid.php 414 2011-04-13 14:05:13Z barryo $ + */ +abstract class BaseViewSwitchDetailsByCustid extends Doctrine_Record +{ + public function setTableDefinition() + { + $this->setTableName('view_switch_details_by_custid'); + $this->hasColumn('id', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'default' => '0', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('custid', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('virtualinterfaceid', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('status', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('speed', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('duplex', 'string', 16, array( + 'type' => 'string', + 'length' => 16, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('monitorindex', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('notes', 'string', null, array( + 'type' => 'string', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('switchport', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('switchportid', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'default' => '0', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('switch', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('switchid', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'default' => '0', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('vendorid', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'default' => '0', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('snmppasswd', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('infrastructure', 'integer', 1, array( + 'type' => 'integer', + 'length' => 1, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('cabinet', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('colocabinet', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('locationname', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('locationshortname', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + } + + public function setUp() + { + parent::setUp(); + + } +} \ No newline at end of file diff --git a/application/models/generated/BaseViewVlaninterfaceDetailsByCustid.php b/application/models/generated/BaseViewVlaninterfaceDetailsByCustid.php new file mode 100644 index 000000000..baa7f1ef9 --- /dev/null +++ b/application/models/generated/BaseViewVlaninterfaceDetailsByCustid.php @@ -0,0 +1,293 @@ + + * @version SVN: $Id: BaseViewVlaninterfaceDetailsByCustid.php 114 2010-03-15 12:49:13Z barryo $ + */ +abstract class BaseViewVlaninterfaceDetailsByCustid extends Doctrine_Record +{ + public function setTableDefinition() + { + $this->setTableName('view_vlaninterface_details_by_custid'); + $this->hasColumn('id', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'default' => '0', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('custid', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('virtualinterfaceid', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('monitorindex', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('virtualinterfacename', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('vlan', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'default' => '0', + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('vlanname', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '', + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('vlanid', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'default' => '0', + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('rcvrfname', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('ipv4enabled', 'integer', 1, array( + 'type' => 'integer', + 'length' => 1, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('ipv4hostname', 'string', 64, array( + 'type' => 'string', + 'length' => 64, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('ipv4canping', 'integer', 1, array( + 'type' => 'integer', + 'length' => 1, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('ipv4monitorrcbgp', 'integer', 1, array( + 'type' => 'integer', + 'length' => 1, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('ipv6enabled', 'integer', 1, array( + 'type' => 'integer', + 'length' => 1, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('ipv6hostname', 'string', 64, array( + 'type' => 'string', + 'length' => 64, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('ipv6canping', 'integer', 1, array( + 'type' => 'integer', + 'length' => 1, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('ipv6monitorrcbgp', 'integer', 1, array( + 'type' => 'integer', + 'length' => 1, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('as112client', 'integer', 1, array( + 'type' => 'integer', + 'length' => 1, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('mcastenabled', 'integer', 1, array( + 'type' => 'integer', + 'length' => 1, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('ipv4bgpmd5secret', 'string', 64, array( + 'type' => 'string', + 'length' => 64, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('ipv6bgpmd5secret', 'string', 64, array( + 'type' => 'string', + 'length' => 64, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('rsclient', 'integer', 1, array( + 'type' => 'integer', + 'length' => 1, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '0', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('busyhost', 'integer', 1, array( + 'type' => 'integer', + 'length' => 1, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '0', + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('notes', 'string', null, array( + 'type' => 'string', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('ipv4address', 'string', 16, array( + 'type' => 'string', + 'length' => 16, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('ipv6address', 'string', 40, array( + 'type' => 'string', + 'length' => 40, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + } + + public function setUp() + { + parent::setUp(); + + } +} \ No newline at end of file diff --git a/application/models/generated/BaseVirtualinterface.php b/application/models/generated/BaseVirtualinterface.php new file mode 100644 index 000000000..7ed7cf6c8 --- /dev/null +++ b/application/models/generated/BaseVirtualinterface.php @@ -0,0 +1,95 @@ + + * @version SVN: $Id: BaseVirtualinterface.php 114 2010-03-15 12:49:13Z barryo $ + */ +abstract class BaseVirtualinterface extends Doctrine_Record +{ + public function setTableDefinition() + { + $this->setTableName('virtualinterface'); + $this->hasColumn('id', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => true, + 'autoincrement' => true, + )); + $this->hasColumn('custid', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('name', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('description', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('mtu', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('trunk', 'integer', 1, array( + 'type' => 'integer', + 'length' => 1, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('channelgroup', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + } + + public function setUp() + { + parent::setUp(); + + } +} \ No newline at end of file diff --git a/application/models/generated/BaseVirtualinterfaceSeq.php b/application/models/generated/BaseVirtualinterfaceSeq.php new file mode 100644 index 000000000..efb1c0236 --- /dev/null +++ b/application/models/generated/BaseVirtualinterfaceSeq.php @@ -0,0 +1,35 @@ + + * @version SVN: $Id: BaseVirtualinterfaceSeq.php 114 2010-03-15 12:49:13Z barryo $ + */ +abstract class BaseVirtualinterfaceSeq extends Doctrine_Record +{ + public function setTableDefinition() + { + $this->setTableName('virtualinterface_seq'); + $this->hasColumn('id', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => true, + 'autoincrement' => true, + )); + } + + public function setUp() + { + parent::setUp(); + + } +} \ No newline at end of file diff --git a/application/models/generated/BaseVlan.php b/application/models/generated/BaseVlan.php new file mode 100644 index 000000000..527ef36e4 --- /dev/null +++ b/application/models/generated/BaseVlan.php @@ -0,0 +1,76 @@ + + * @version SVN: $Id: BaseVlan.php 114 2010-03-15 12:49:13Z barryo $ + */ +abstract class BaseVlan extends Doctrine_Record +{ + public function setTableDefinition() + { + $this->setTableName('vlan'); + $this->hasColumn('id', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => true, + 'autoincrement' => true, + )); + $this->hasColumn('name', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('number', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'default' => '0', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('rcvrfname', 'string', 255, array( + 'type' => 'string', + 'length' => 255, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('notes', 'string', null, array( + 'type' => 'string', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + } + + public function setUp() + { + parent::setUp(); + + } +} \ No newline at end of file diff --git a/application/models/generated/BaseVlanSeq.php b/application/models/generated/BaseVlanSeq.php new file mode 100644 index 000000000..9cb7b9a35 --- /dev/null +++ b/application/models/generated/BaseVlanSeq.php @@ -0,0 +1,35 @@ + + * @version SVN: $Id: BaseVlanSeq.php 114 2010-03-15 12:49:13Z barryo $ + */ +abstract class BaseVlanSeq extends Doctrine_Record +{ + public function setTableDefinition() + { + $this->setTableName('vlan_seq'); + $this->hasColumn('id', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => true, + 'autoincrement' => true, + )); + } + + public function setUp() + { + parent::setUp(); + + } +} \ No newline at end of file diff --git a/application/models/generated/BaseVlaninterface.php b/application/models/generated/BaseVlaninterface.php new file mode 100644 index 000000000..69bf13e39 --- /dev/null +++ b/application/models/generated/BaseVlaninterface.php @@ -0,0 +1,248 @@ + + * @version SVN: $Id: BaseVlaninterface.php 114 2010-03-15 12:49:13Z barryo $ + */ +abstract class BaseVlaninterface extends Doctrine_Record +{ + public function setTableDefinition() + { + $this->setTableName('vlaninterface'); + $this->hasColumn('virtualinterfaceid', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('vlanid', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('ipv4enabled', 'integer', 1, array( + 'type' => 'integer', + 'length' => 1, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('ipv4addressid', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('ipv4hostname', 'string', 64, array( + 'type' => 'string', + 'length' => 64, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('ipv6enabled', 'integer', 1, array( + 'type' => 'integer', + 'length' => 1, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('ipv6addressid', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('ipv6hostname', 'string', 64, array( + 'type' => 'string', + 'length' => 64, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('mcastenabled', 'integer', 1, array( + 'type' => 'integer', + 'length' => 1, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('bgpmd5secret', 'string', 64, array( + 'type' => 'string', + 'length' => 64, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('ipv4bgpmd5secret', 'string', 64, array( + 'type' => 'string', + 'length' => 64, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('ipv6bgpmd5secret', 'string', 64, array( + 'type' => 'string', + 'length' => 64, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('maxbgpprefix', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('rsclient', 'integer', 1, array( + 'type' => 'integer', + 'length' => 1, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '0', + 'notnull' => true, + 'autoincrement' => false, + )); + $this->hasColumn('ipv4canping', 'integer', 1, array( + 'type' => 'integer', + 'length' => 1, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('ipv6canping', 'integer', 1, array( + 'type' => 'integer', + 'length' => 1, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('ipv4monitorrcbgp', 'integer', 1, array( + 'type' => 'integer', + 'length' => 1, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('ipv6monitorrcbgp', 'integer', 1, array( + 'type' => 'integer', + 'length' => 1, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('as112client', 'integer', 1, array( + 'type' => 'integer', + 'length' => 1, + 'fixed' => false, + 'unsigned' => true, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('busyhost', 'integer', 1, array( + 'type' => 'integer', + 'length' => 1, + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'default' => '0', + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('notes', 'string', null, array( + 'type' => 'string', + 'fixed' => false, + 'unsigned' => false, + 'primary' => false, + 'notnull' => false, + 'autoincrement' => false, + )); + $this->hasColumn('id', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => true, + 'autoincrement' => true, + )); + } + + public function setUp() + { + parent::setUp(); + + } +} \ No newline at end of file diff --git a/application/models/generated/BaseVlaninterfaceSeq.php b/application/models/generated/BaseVlaninterfaceSeq.php new file mode 100644 index 000000000..5a41e5c06 --- /dev/null +++ b/application/models/generated/BaseVlaninterfaceSeq.php @@ -0,0 +1,35 @@ + + * @version SVN: $Id: BaseVlaninterfaceSeq.php 114 2010-03-15 12:49:13Z barryo $ + */ +abstract class BaseVlaninterfaceSeq extends Doctrine_Record +{ + public function setTableDefinition() + { + $this->setTableName('vlaninterface_seq'); + $this->hasColumn('id', 'integer', 4, array( + 'type' => 'integer', + 'length' => 4, + 'fixed' => false, + 'unsigned' => true, + 'primary' => true, + 'autoincrement' => true, + )); + } + + public function setUp() + { + parent::setUp(); + + } +} \ No newline at end of file diff --git a/application/views/admin/static/instructions-meetings.tpl b/application/views/admin/static/instructions-meetings.tpl new file mode 100644 index 000000000..a62ae1233 --- /dev/null +++ b/application/views/admin/static/instructions-meetings.tpl @@ -0,0 +1,171 @@ +{include file="header.tpl" pageTitle="IXP Manager :: Member Dashboard"} + +
+ +
+ + + + + +
+ Instructions for Adding Meetings +
+ +

+
+To add new meetings, you must do two things: +

+ +
    +
  • add a new meeting via the menu Admin->Meetings->Add / Edit; and then
  • +
  • add all the meeting presentations via the menu Admin->Meetings->Presentations.
  • +
+ +

+You can view how the meeting entries look by accessing the meeting page via either of +Admin -> Meetings -> Member View or Member Information -> Meetings. +

+ +

Adding a New Meeting

+ +

+The general layout of a meeting entry is shown below. In square brackets I have identified the +entires required in the Add New meeting form to show how and where they are used. +

+ +
+ +
+

[Title] – [Date]

+

In [Venue] at [Time]

+
+ +

[Preamble]

+ +

+List of Presentations +

+ +

+Other meeting content also includes: +

+ +

+List of Other Presentations +

+ +

[Postamble]

+ +
+ + +

+Note that [Date] should be selected from the pop up and is entered as YYYY-MM-DD but +is formatted on the page to something such as: Thursday, June 24, 2010. +

+ +

+When entering the venue, note that it will be preseeded by In. +

+ +

+Look at existing entries as an example. To see the form for an existing entry, right +click on its table row and select Edit. +

+ + + +

Adding Meeting Items

+ +The general format for a meeting item / presentation is shown below detailing how the entry is made up +from the form. + +
+ +
+
+
+ + + +

+ [Title] – [Name (with link to email address if provided] +

+ +

+ [Role], [Company with link to site of URL provided] +

+
+
+
+[Summary, if provided] +
+ +
+ +
+ +

+Note the following: +

+ +
    +
  • If an email is provided, the presenter's name will be an email link;
  • +
  • If a company URL is provided (such as http://www.inex.ie/), the company name will link to the company site;
  • +
  • If a video link is provided, the video camera icon will be visable and link to the video;
  • +
  • If the Other Content? box is ticked, the presentation is shown under the Other meeting content text; +
  • If a presentation is uploaded, the projector icon will allow a user to download it.
  • +
+ +

+Again, the best way to fully understand this is to look at entries for existing presentations. +

+ + +

Viewing Meeting Information for Members

+ +

+Members can view meeting details including links to presentations, videos and speaker email addresses through the IXP Manager at +Member Information -> Meetings. This page is automatically generated +based on the entries above. +

+ + + +

Viewing Meeting Information for the Public

+ +

+There is a publically access HTML feed of the meetings at https://www.inex.ie/ixp/meeting/simple. +This feed is then included in an iframe on the main INEX website at https://www.inex.ie/media/meetings-public. +Again, this page is automatically generated from the entries above but links to presentations, video and email addresses of speakers are not included. +

+ +

Composing Meeting Information Emails

+ +

+One is often required to send information of a meeting to someone by email. There is now an email composition feature available which will also +automatically generate the email content based on the entries above. In the Admin -> Meetings -> Add / Edit section, +right click on the meeting you wish to compose a mail about and select Compose mail for this meeting.... +

+ + + + + + + +
+ +
+ +{include file="footer.tpl"} diff --git a/application/views/auth/drupal-login.tpl b/application/views/auth/drupal-login.tpl new file mode 100644 index 000000000..d7833f359 --- /dev/null +++ b/application/views/auth/drupal-login.tpl @@ -0,0 +1,47 @@ +{include file="header.tpl" pageTitle="IXP Manager :: Drupal Login"} + +
+ + + + + +
+ Drupal Login +
+ +{include file="message.tpl"} + +
+ + + + +
+ + +{include file="footer.tpl"} diff --git a/application/views/auth/footer.tpl b/application/views/auth/footer.tpl new file mode 100644 index 000000000..3ff4ed877 --- /dev/null +++ b/application/views/auth/footer.tpl @@ -0,0 +1,22 @@ + + + + +
+ + + +
+ + + + + + diff --git a/application/views/auth/forgotten-password.tpl b/application/views/auth/forgotten-password.tpl new file mode 100644 index 000000000..cbfb1424e --- /dev/null +++ b/application/views/auth/forgotten-password.tpl @@ -0,0 +1,36 @@ +{include file="auth/header.tpl"} + +{include file="message.tpl"} + + + + + +{include file="auth/footer.tpl"} diff --git a/application/views/auth/header.tpl b/application/views/auth/header.tpl new file mode 100644 index 000000000..82583ad26 --- /dev/null +++ b/application/views/auth/header.tpl @@ -0,0 +1,55 @@ + + + + + + + + + {$pageTitle|default:"IXP Manager"} + + + + + + + + + + + + + + + + + + +
+ + + +
+ +
+ + + + + + + +
  + + INEX Logo + +
+ +
+ +
+ + +
+ + diff --git a/application/views/auth/login.tpl b/application/views/auth/login.tpl new file mode 100644 index 000000000..dab12da91 --- /dev/null +++ b/application/views/auth/login.tpl @@ -0,0 +1,33 @@ +{include file="auth/header.tpl"} + +{include file="message.tpl"} + + + + + +{include file="auth/footer.tpl"} diff --git a/application/views/change-log/addEdit-preamble.tpl b/application/views/change-log/addEdit-preamble.tpl new file mode 100644 index 000000000..3df931603 --- /dev/null +++ b/application/views/change-log/addEdit-preamble.tpl @@ -0,0 +1,16 @@ + + + + + diff --git a/application/views/change-log/entries.tpl b/application/views/change-log/entries.tpl new file mode 100644 index 000000000..c00934d59 --- /dev/null +++ b/application/views/change-log/entries.tpl @@ -0,0 +1,50 @@ +{include file="header.tpl" pageTitle="IXP Manager :: Member Dashboard"} + +
+ + + + + +
IXP Manager Change Log
+ +

+This page details updates to the IXP Manager. When you first log in, we'll also alert you +to any new changes since the last time you opened this page by marking the Change +Log link as updated. +

+ +{if $newOnly neq false} +

+ NB: We are only showing new entries since your last visit. Please + click here to view all entries. +

+{/if} + +
+ +{foreach from=$entries item=e} + +
+ + + + + + + + +
+ {$e.livedate} ({$e.User.username}): {$e.title} +
+ {$e.details} +
+ +
+ +{/foreach} + +
+ + +{include file="footer.tpl"} diff --git a/application/views/cli/nagios/switch-definitions.tpl b/application/views/cli/nagios/switch-definitions.tpl new file mode 100644 index 000000000..8ef5911be --- /dev/null +++ b/application/views/cli/nagios/switch-definitions.tpl @@ -0,0 +1,77 @@ +# +# This file contains static definitions for use with the IXP Manager +# Nagios configuration templates and is following by dynamic host +# configurations. +# +# To edit the static definitions, edit: +# applicationviews/cli/nagios/switch-definitions.tpl +# rather than this file directly as it is automatically generated. +# + +define host{ldelim} + name inex-production-switch + notifications_enabled 1 ; Host notifications are enabled + event_handler_enabled 0 ; Host event handler is enabled + flap_detection_enabled 1 ; Flap detection is enabled + process_perf_data 1 ; Process performance data + retain_status_information 1 ; Retain status information across program restarts + retain_nonstatus_information 1 ; Retain non-status information across program restarts + + checks_enabled 1 + check_command check-host-alive + max_check_attempts 3 ; number of not 'UP' checks to register as hard + check_interval 5 ; time between checks + retry_interval 1 ; time between checks if host is not 'UP' + + check_period 24x7 + + notification_interval 60 + notification_period 24x7 + notification_options u,d,r + + low_flap_threshold 0 + high_flap_threshold 0 + + register 0 ; DONT REGISTER THIS DEFINITION - ITS NOT A REAL HOST, JUST A TEMPLATE! + + contact_groups inex-operations +{rdelim} + + +define service{ldelim} + name inex-production-switch-service ; The 'name' of this service template, referenced in other service definitions + active_checks_enabled 1 ; Active service checks are enabled + passive_checks_enabled 1 ; Passive service checks are enabled/accepted + parallelize_check 1 ; Active service checks should be parallelized (disabling this can lead to major performance problems) + obsess_over_service 1 ; We should obsess over this service (if necessary) + check_freshness 0 ; Default is to NOT check service 'freshness' + notifications_enabled 1 ; Service notifications are enabled + event_handler_enabled 0 ; Service event handler is enabled + flap_detection_enabled 1 ; Flap detection is enabled + process_perf_data 1 ; Process performance data + retain_status_information 1 ; Retain status information across program restarts + retain_nonstatus_information 1 ; Retain non-status information across program restarts + contact_groups inex-operations + + max_check_attempts 3 + normal_check_interval 5 + retry_check_interval 1 + check_period 24x7 + + notification_interval 60 + notification_period 24x7 + notification_options w,u,c,r + + low_flap_threshold 0 + high_flap_threshold 0 + + is_volatile 0 + + register 0 ; DONT REGISTER THIS DEFINITION - ITS NOT A REAL SERVICE, JUST A TEMPLATE! +{rdelim} + + +# +# Dynamically generated configurations follow: +# + diff --git a/application/views/cli/nagios/switch-hosts.tpl b/application/views/cli/nagios/switch-hosts.tpl new file mode 100644 index 000000000..f71415602 --- /dev/null +++ b/application/views/cli/nagios/switch-hosts.tpl @@ -0,0 +1,12 @@ +# +# {$sw.name} - {$sw.Cabinet.cololocation}, {$sw.Cabinet.Location.name} +# + +define host {ldelim} + use inex-production-switch + host_name {$sw.name} + alias {$sw.name} + address {$sw.ipv4addr} +{rdelim} + + diff --git a/application/views/cli/nagios/switch-templates.tpl b/application/views/cli/nagios/switch-templates.tpl new file mode 100644 index 000000000..11c850dda --- /dev/null +++ b/application/views/cli/nagios/switch-templates.tpl @@ -0,0 +1,76 @@ + +{foreach from=$locations item=loc key=name} + +define hostgroup {ldelim} + hostgroup_name INEX-Switches-{$name} + alias INEX Switches at {$name} + members {php}echo implode( ', ', $this->get_template_vars( 'loc') );{/php} + +{rdelim} + +{/foreach} + + +define hostgroup {ldelim} + hostgroup_name INEX-Production-Switches + alias INEX Production Switches (all) + members {php}echo implode( ', ', $this->get_template_vars( 'all') );{/php} + +{rdelim} + + +define hostgroup {ldelim} + hostgroup_name INEX-Switches-Brocade + alias INEX Brocade Switches + members {php}echo implode( ', ', $this->get_template_vars( 'vendor_brocade') );{/php} + +{rdelim} + + +define hostgroup {ldelim} + hostgroup_name INEX-Switches-Cisco + alias INEX Cisco Switches + members {php}echo implode( ', ', $this->get_template_vars( 'vendor_cisco') );{/php} + +{rdelim} + + +define hostgroup {ldelim} + hostgroup_name INEX-Switches-MRV + alias INEX MRV Switches + members {php}echo implode( ', ', $this->get_template_vars( 'vendor_mrv') );{/php} + +{rdelim} + + + +define service{ldelim} + use inex-production-switch-service + hostgroup_name INEX-Switches-Brocade + service_description Chassis + check_command check_foundry_chassis!fjvrGzHqr +{rdelim} + +define service {ldelim} + use inex-production-switch-service + service_description Temperature + hostgroup_name INEX-Switches-Cisco + check_command check_cisco_temperature!fjvrGzHqr!32!38 +{rdelim} + + + +define service{ldelim} + use inex-production-switch-service + hostgroup_name INEX-Production-Switches + service_description ping - IPv4 + check_command check_ping_ipv4!10!100.0,10%!200.0,20% +{rdelim} + +define service {ldelim} + use inex-production-switch-service + service_description SSH + hostgroup_name INEX-Production-Switches + check_command check_ssh +{rdelim} + diff --git a/application/views/cust-admin/add-edit.tpl b/application/views/cust-admin/add-edit.tpl new file mode 100644 index 000000000..659a20a0a --- /dev/null +++ b/application/views/cust-admin/add-edit.tpl @@ -0,0 +1,45 @@ +{include file="header.tpl"} + + + + + +
+ User Admin for {$customer.name} +
+ + +{include file="message.tpl"} + +
+ +
+ +{if $isEdit} +

Edit User

+ +

+Please edit your users email address and mobile number below. +

+ +{else} +

Add New User

+ +

+Please complete the form below to add a new user to your account. +

+ +

+Your new user's password will be sent by SMS to the mobile +number provided and they will receive a welcome email to the email address provided. +

+ +{/if} + + +{$form} + +
+ +{include file="footer.tpl"} + diff --git a/application/views/cust-admin/list.tpl b/application/views/cust-admin/list.tpl new file mode 100644 index 000000000..09bcb17c0 --- /dev/null +++ b/application/views/cust-admin/list.tpl @@ -0,0 +1,153 @@ +{include file="header.tpl" pageTitle="IXP Manager :: "|cat:$frontend.pageTitle} + +
+ + + + + +
+ User Admin for {$customer.name} +
+ + +{include file="message.tpl"} + +
+ +
+ + + + + + + + + + + + + + + + +{foreach from=$users item=u} + + + + + + + + + + +{/foreach} + + + +
UsernameE-MailMobileCreatedEnabledEdit?
{$u->username}{$u->email}{$u->authorisedMobile}{$u->created} + id}"> + {if $u->disabled} + [DISABLED] + {else} + [ENABLED] + {/if} + + + id}"> + [EDIT] + +
+ +
+ +

+

+ +
+

+ +
+ + + + + +
+ +{include file="footer.tpl"} diff --git a/application/views/cust-admin/mail/welcome.tpl b/application/views/cust-admin/mail/welcome.tpl new file mode 100644 index 000000000..636f7d268 --- /dev/null +++ b/application/views/cust-admin/mail/welcome.tpl @@ -0,0 +1,131 @@ + + + Welcome to INEX's IXP Manager + + + + + + + +
+ + + + + +
+

Welcome to INEX's IXP Manager

+
+ [IXP Logo] +
+
+ +

+A new user account has been created for you on the INEX IXP Management system. +

+ +

+You can login to it using the following details: +

+ + + + + + + + + + + + + + + + + + + + +
URL:https://www.inex.ie/ixp/
Username:{$u->username}
Password:(sent to {$u->authorisedMobile} by SMS)
+ +

+Once logged in, you will have access to a number of features including: +

+ +
    +
  • list of IXP members and peering contact details;
  • +
  • your traffic graphs;
  • +
  • ability to view and edit your company details;
  • +
  • your INEX port configuration details;
  • +
  • peering matrix;
  • +
  • route server, AS112 and other service information.
  • +
+ +

+If you require any assistance, please contact INEX Operations on operations@inex.ie. +

+ +

Additional/Miscellaneous Benefits

+ +

Route Collector

+ +

+INEX runs a route collector, whose purpose is to allow exchange members to debug routing issues. +While there is public access to the route collector available on the INEX looking glass, INEX +members have CLI access to the route-collector. +

+ +

+It can be accessed via SSH to route-collector.inex.ie using your new username and password. +

+ + +

IRC Channel

+ +

+Members of the INEX operations team, along with many NOC personnel from INEX member +organisations can often be found on the #inex-ops IRC channel. This facility +has proved itself to be a useful communications medium for operational matters. The +#inex-ops IRC channel is password protected and access to the server is +encrypted using SSL. +

+ + + + + + + + + + + + + + + + + + + + +
Server name:irc.inex.ie, port 6697, SSL enabled
Channel:#inex-ops
Password:pixiedust
+ + + +

+Thanks and kind reagrds,
+The INEX Operations Team.
+operations@inex.ie. +

+ + + diff --git a/application/views/customer/addEdit.tpl b/application/views/customer/addEdit.tpl new file mode 100644 index 000000000..a5ae24332 --- /dev/null +++ b/application/views/customer/addEdit.tpl @@ -0,0 +1,62 @@ +{include file="header.tpl"} + + + + + + + + + + + + + +
+ +{if $isEdit} +

Customer :: Editing {$cust->name}

+{else} +

Customer :: Add New

+{/if} + +{$form} + +
+ +{include file="footer.tpl"} + diff --git a/application/views/customer/leagueTable.tpl b/application/views/customer/leagueTable.tpl new file mode 100644 index 000000000..17ecdb47a --- /dev/null +++ b/application/views/customer/leagueTable.tpl @@ -0,0 +1,316 @@ +{include file="header.tpl"} + + + + + + + +
+ IXP Members :: League Table ({foreach from=$categories key=cname item=cvalue}{if $category eq $cvalue}{$cname}{/if}{/foreach}) +
+ + +{include file="message.tpl"} + +
+ +

+

+ + + + + + + + + + + + +
Metric: + + Statistics Type: + + Day: + +
+
+

+ +
+ + + + + + + + + + + + + + + + + + + +{foreach from=$trafficDaily item=td} + +{if $metric eq 'max'} + + + + + + + + + + + + + + + + +{elseif $metric eq 'average'} + + + + + + + + + + + + + + + + +{else} + + + + + + + + + + + + + + + + +{/if} + +{/foreach} + + +
MemberA InA OutA TotalM InM OutM TotalT InT OutT Total
{$td.Cust.shortname}{$td.Cust.name}{$td.day_max_in}{$td.day_max_out}{$td.day_max_in+$td.day_max_out}{$td.week_max_in}{$td.week_max_out}{$td.week_max_in+$td.week_max_out}{$td.month_max_in}{$td.month_max_out}{$td.month_max_in+$td.month_max_out}{$td.year_max_in}{$td.year_max_out}{$td.year_max_in+$td.year_max_out}
{$td.Cust.shortname}{$td.Cust.name}{$td.day_avg_in}{$td.day_avg_out}{$td.day_avg_in+$td.day_avg_out}{$td.week_avg_in}{$td.week_avg_out}{$td.week_avg_in+$td.week_avg_out}{$td.month_avg_in}{$td.month_avg_out}{$td.month_avg_in+$td.month_avg_out}{$td.year_avg_in}{$td.year_avg_out}{$td.year_avg_in+$td.year_avg_out}
{$td.Cust.shortname}{$td.Cust.name}{$td.day_tot_in}{$td.day_tot_out}{$td.day_tot_in+$td.day_tot_out}{$td.week_tot_in}{$td.week_tot_out}{$td.week_tot_in+$td.week_tot_out}{$td.month_tot_in}{$td.month_tot_out}{$td.month_tot_in+$td.month_tot_out}{$td.year_tot_in}{$td.year_tot_out}{$td.year_tot_in+$td.year_tot_out}
+ +
+ +
+ +{if $metric eq 'max'} + {assign var='scalefn' value='myScale'} +{elseif $metric eq 'average'} + {assign var='scalefn' value='myScale'} +{else} + {assign var='scalefn' value='myScaleTotal'} +{/if} + + +{literal} + + +{/literal} + + +{include file="footer.tpl"} \ No newline at end of file diff --git a/application/views/customer/list.tpl b/application/views/customer/list.tpl new file mode 100644 index 000000000..e6f13b8f0 --- /dev/null +++ b/application/views/customer/list.tpl @@ -0,0 +1,263 @@ +{include file="header.tpl"} + +
+ + + + + + + +
+ IXP Members +
+ + +{include file="message.tpl"} + + +{literal} + +{/literal} + + + + + + + +
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+ +

+

+

+ +
+
+ +
+ + + +{literal} + +{/literal} + + + +{include file="footer.tpl"} + + + diff --git a/application/views/customer/mail/diff-footer.tpl b/application/views/customer/mail/diff-footer.tpl new file mode 100644 index 000000000..96ac65701 --- /dev/null +++ b/application/views/customer/mail/diff-footer.tpl @@ -0,0 +1,9 @@ + +{if $numWithExceededThreshold eq 0} +

+There were no members with unusual traffic growth yesterday. +

+{/if} + + + diff --git a/application/views/customer/mail/diff-header.tpl b/application/views/customer/mail/diff-header.tpl new file mode 100644 index 000000000..8b5891841 --- /dev/null +++ b/application/views/customer/mail/diff-header.tpl @@ -0,0 +1,12 @@ + + + INEX Traffic Differentials + + + + +

INEX Member Traffic Differentials

+ + + + diff --git a/application/views/customer/mail/diff-member.tpl b/application/views/customer/mail/diff-member.tpl new file mode 100644 index 000000000..fcd016c89 --- /dev/null +++ b/application/views/customer/mail/diff-member.tpl @@ -0,0 +1,41 @@ + + +

{$cust.name}

+ +{if $dIn gt $threasholdIn} +

+INBOUND: + + {if $percentIn neq 'NONE'} + There has been a {$percentIn}% {$sIn} is this + member's traffic as recorded yesterday ({mrtgScale value=$in}) + compared to the average over the past {$days} days + ({mrtgScale value=$meanIn}). (Standard deviation: {mrtgScale value=$stddevIn}). + {else} + No previous records - possibly a new connection brought live? + {/if} + +

+{/if} + +{if $dOut gt $threasholdOut} +

+OUTBOUND: + + {if $percentIn neq 'NONE'} + There has been a {$percentOut}% {$sOut} is this member's + traffic as recorded yesterday ({mrtgScale value=$out}) compared to the + average over the past {$days} days ({mrtgScale value=$meanOut}). (Standard + deviation: {mrtgScale value=$stddevOut}). + {else} + No previous records - possibly a new connection brought live? + {/if} +

+{/if} + +

+ + [{$cust.shortname}] + +

+ diff --git a/application/views/customer/mail/util-footer.tpl b/application/views/customer/mail/util-footer.tpl new file mode 100644 index 000000000..3e5ff2598 --- /dev/null +++ b/application/views/customer/mail/util-footer.tpl @@ -0,0 +1,9 @@ + +{if $numWithExcessUtil eq 0} +

+No ports were found with excess utilisation over the past week. +

+{/if} + + + diff --git a/application/views/customer/mail/util-header.tpl b/application/views/customer/mail/util-header.tpl new file mode 100644 index 000000000..47a8bcfbd --- /dev/null +++ b/application/views/customer/mail/util-header.tpl @@ -0,0 +1,15 @@ + + + Port Utilisation Report + + + + +

Port Utilisation Report

+ +

+The following ports are at or have exceeded {$threshold*100|string_format:"%.1f"}% utilisation. +

+ + + diff --git a/application/views/customer/mail/util-member.tpl b/application/views/customer/mail/util-member.tpl new file mode 100644 index 000000000..ba68193a4 --- /dev/null +++ b/application/views/customer/mail/util-member.tpl @@ -0,0 +1,22 @@ + + +

{$cust.name} :: {$switchport}

+ +{if $utilIn gt $threshold} +

+INBOUND: Traffic inbound on this port reached a maximum of {$utilIn*100|string_format:"%.2f"}%. +

+{/if} + +{if $utilOut gt $threshold} +

+OUTBOUND: Traffic outbound on this port reached a maximum of {$utilOut*100|string_format:"%.2f"}%. +

+{/if} + +

+ + [{$cust.shortname}] + +

+ diff --git a/application/views/customer/ninety-fifth.tpl b/application/views/customer/ninety-fifth.tpl new file mode 100644 index 000000000..2c821280f --- /dev/null +++ b/application/views/customer/ninety-fifth.tpl @@ -0,0 +1,212 @@ +{include file="header.tpl"} + + + + + + + +
+ IXP Members :: Traffic Usage as 95th Percentile +
+ + +{include file="message.tpl"} + +
+ +

+

+ + + + + + + + + + +
Month: + + Cost / Mbps: + € + + +
+
+

+ + + + + + + + +
+ +
+ + + + + + + + + + + + {foreach from=$traffic95thMonthly item=td} + + + + + + + + + {/foreach} + + +
Member95th Percentile
{$td.Cust.shortname}{$td.Cust.name}{$td.max_95th}{$td.cost}
+ +
+ +
+

Notes

+ +

+ Click on any row in the table on the right for traffic graphs. +

+ +

+ Only values for May at the end of May should be considered completely accurate. +

+ +

+ Transit costs vary greatly from supplier to supplier and the more you commit to, the cheaper it gets. + Ask Barry / Nick for sensible values. Different members should not be compared by cost. +

+ +

+ The 95th Percentile is the standard way that IP transit providers measure and bill + customers for traffic. +

+ +

+ E.g. As an IP transit customer, I may contract to commit to purchasing 100Mbps @ €5/Mb and + then pay €7 for every Mbps burst above that. If on any given month, my traffic is 80Mbps as measured + by the 95th percentile, my invoice will be 100Mbps x €5 = €500. But if it were 120Mbps, the + invoice would be 100Mbps x €5 + 20Mbps x €7 = €640. +

+ +

+ For INEX, by calculating the 95th percentile of our members' traffic, we can better evaluate the cost / + benefit ratio of INEX membership versus transit. +

+ +

+ The 95th percentile is calculated by sampling maximum value of the member's traffic (the great of traffic + in and out) every five minutes. The then order these by value and throw away the top 5%. The greatest + value remaining in then the 95th percentile. +

+
+ +
+ +{literal} + + +{/literal} + + +{include file="footer.tpl"} \ No newline at end of file diff --git a/application/views/customer/sendWelcomeEmail.tpl b/application/views/customer/sendWelcomeEmail.tpl new file mode 100644 index 000000000..cb4624c45 --- /dev/null +++ b/application/views/customer/sendWelcomeEmail.tpl @@ -0,0 +1,22 @@ +{include file="header.tpl"} + + + + + + + +
+ IXP Members :: Send Welcome E-mail +
+ + +{include file="message.tpl"} + +
+ +{$form} + +
+ +{include file="footer.tpl"} \ No newline at end of file diff --git a/application/views/customer/statistics-by-lan.tpl b/application/views/customer/statistics-by-lan.tpl new file mode 100644 index 000000000..ed5a59181 --- /dev/null +++ b/application/views/customer/statistics-by-lan.tpl @@ -0,0 +1,105 @@ +{include file="header.tpl"} + + + + + + + +
+ IXP Members :: Statistics for {$lan.name} + ( + {foreach from=$categories key=cname item=cvalue}{if $category eq $cvalue}{$cname}{/if}{/foreach} + / + {foreach from=$periods key=cname item=cvalue}{if $period eq $cvalue}{$cname}{/if}{/foreach} + ) +
+ + +{include file="message.tpl"} + +
+ +

+

+ + + + + + + + + + + + +
Graph Type: + + Period: + + LAN: + +
+
+

+ + + + + +{assign var='count' value=0} +{foreach from=$ints item=int} + +{foreach from=$int.Virtualinterface.Physicalinterface item=pi} + + + +{assign var='count' value="`$count+1`"} + +{if $count%3 eq 0} + +{/if} + +{/foreach} + +{/foreach} + +{if $count%3 neq 0} + + {assign var='count' value="`$count+1`"} + {if $count%3 neq 0} + + {/if} +{/if} + + + +
+ +

{$int.Virtualinterface.Cust.name}

+ +

{$pi.Switchport.SwitchTable.name} {$pi.Switchport.name} ({$pi.speed}/{$pi.duplex})

+ + + + + +
+ +{include file="footer.tpl"} \ No newline at end of file diff --git a/application/views/customer/statistics-list.tpl b/application/views/customer/statistics-list.tpl new file mode 100644 index 000000000..c2a9aee7b --- /dev/null +++ b/application/views/customer/statistics-list.tpl @@ -0,0 +1,32 @@ +{include file="header.tpl"} + + + + + + + +
+ IXP Members :: Statistics +
+ + +{include file="message.tpl"} + +
+ + + +{include file="footer.tpl"} \ No newline at end of file diff --git a/application/views/customer/statistics-overview.tpl b/application/views/customer/statistics-overview.tpl new file mode 100644 index 000000000..673d5af75 --- /dev/null +++ b/application/views/customer/statistics-overview.tpl @@ -0,0 +1,91 @@ +{include file="header.tpl"} + + + + + + + +
+ IXP Members :: Statistics Overview + ( + {foreach from=$categories key=cname item=cvalue}{if $category eq $cvalue}{$cname}{/if}{/foreach} + / + {foreach from=$periods key=cname item=cvalue}{if $period eq $cvalue}{$cname}{/if}{/foreach} + ) +
+ + +{include file="message.tpl"} + +
+ +

+

+ + + + + + + + + +
Graph Type: + + Period: + +
+
+

+ + + + + +{assign var='count' value=0} +{foreach from=$custs item=cust} + + + + +{assign var='count' value="`$count+1`"} + +{if $count%3 eq 0} + +{/if} + +{/foreach} + +{if $count%3 neq 0} + + {assign var='count' value="`$count+1`"} + {if $count%3 neq 0} + + {/if} +{/if} + + + +
+ +

{$cust.name}

+ + + + + +
+ +{include file="footer.tpl"} \ No newline at end of file diff --git a/application/views/customer/welcomeEmail.tpl b/application/views/customer/welcomeEmail.tpl new file mode 100644 index 000000000..554688b8d --- /dev/null +++ b/application/views/customer/welcomeEmail.tpl @@ -0,0 +1,308 @@ + +Dear New INEX Member, + +Firstly, welcome to INEX! This is your INEX operations welcome e-mail. + +Please take some time to read this email -- it contains important information concerning your INEX membership. + +Several sections of this email require your input; these are all clearly marked by the heading "Your Input". We would appreciate if you could provide us with all the details requested as this will allow us to provide you and other INEX members with a better quality of service. + + +Connection Details +================== + +You have opted to connect to INEX using {$connections|@count} Ethernet ports. + +INEX operates multiple peering LANs (e.g. our primary LANs, dedicated VoIP peering LANs, etc). Unless you have been advised otherwise, you have been assigned an untagged port on the primary peering LAN(s). Please contact us for more information on the other LANs. + +We have assigned the following IP addresses and switch-ports for your exclusive use: + +{foreach from=$connections item=connection} +Connection {counter name=numconnections} +------------ + +Switch Port: {$connection.Physicalinterface.0.Switchport.SwitchTable.name}.inex.ie, {$connection.Physicalinterface.0.Switchport.name} +Speed: {$connection.Physicalinterface.0.speed}Mbps +Duplex: {$connection.Physicalinterface.0.duplex} +Location: {$connection.Physicalinterface.0.Switchport.SwitchTable.Cabinet.Location.name} +Colo Cabinet ID: {$connection.Physicalinterface.0.Switchport.SwitchTable.Cabinet.name} + + +{foreach from=$connection.Vlaninterface item=interface} +{assign var='vlanid' value=$interface.vlanid} +{$interface.Vlan.name}: + +IPv4 Address: {$interface.Ipv4address.address}/{$networkInfo.$vlanid.4.masklen} +IPv4 Hostname: {$interface.ipv4hostname} +IPv6 Address: {if $interface.Ipv6address.address}{$interface.Ipv6address.address}/{$networkInfo.$vlanid.6.masklen}{else}(please contact us to enable IPv6){/if} + +IPv6 Hostname: {$interface.ipv6hostname} +{/foreach} + + +{/foreach} + +Your Input +---------- + +As a matter of policy, INEX hard-wires all switch ports to a specific speed and duplex setting. Should you require a different duplex setting to the one specified above, or should you require your reverse DNS hostnames changed for either IPv4 or IPv6, please contact operations@inex.ie + + +Route Servers +============= + +INEX operates a Route Server cluster; this facility allows all members who connect to the cluster to see all routing prefixes sent to the cluster by any other member. I.e. it provides an quick, safe and easy way to peer with any other route server user. + +The INEX route server cluster is aimed at: + +o small to medium sized members of the exchange who don't have the time or resources to aggressively manage their peering relationships. + +o larger members of the exchange who have an open peering policy, but where it may not be worth their while managing peering relationships with smaller members of the exchange. + +If you don't have any good reasons not to use the route server cluster, you should probably use it. + +The service is designed to be reliable. It operates on two physical servers, each located in a different data centre. The service is available on all INEX networks (public peering lans #1 and #2, and voip peering lans #1 and #2), on both ipv4 and ipv6. The route servers also filter inbound routing prefixes based on published RIPE IRR policies, which means that using the route servers for peering is generally much safer than peering directly with other members. + + +Your Input +---------- + +If you wish to use the INEX route server system, please email operations@inex.ie. + + +Hosting Routers in the INEX Cage +================================ + +If your company does not have a presence in any of the INEX's co-location facilities, INEX can provide rack space for the purpose of housing routers, NTU's and other equipment whose purpose is to facilitate the transmission of IP packets through the exchange. INEX also permits its members to install modems for the purpose of out-of-band access to their equipment. Each member is assigned 4U of cabinet space by default. If your company needs more space than this, INEX needs to know about it. + + +Your Input +---------- + +If you wish to house router equipment in the INEX cage, please inform INEX operations immediately and provide full details on all the equipment you intend to house in the facility. We can liaise with you directly to get your equipment installed safely. + +If you wish to bring a PSTN phone line into the INEX cage to connect a modem to your routing equipment, please let INEX Operations know immediately. + +----------- + + +External Connections to the INEX Infrastructure +=============================================== + +Many INEX members already have a presence in the co-location facilities which house INEX points of presence. If you are such a member and wish to keep your routing equipment in your own cabinet space, INEX is happy to accept cross-connects from your cabinet to the INEX cage. Please note that all connections into the INEX cage are paid for directly by INEX members, not by INEX itself. + +INEX considers metro ethernet connections as standard external connections. When ordering your metro ethernet circuit, please specify the correct INEX termination point to your provider. + +Cross-connect cabinet termination points are provided in the "Connection Details" section above. + + +Your Input +---------- + +If you want to connect to INEX using a cross-connect, you must order it directly from your co-lo / metro ethernet provider and inform INEX Operations immediately. Please ensure that you include full details on the connection type and termination cabinet when ordering the cross-connect from your co-lo provider. + +---------- + + +Mailing Lists +============= + +To encourage co-operation between INEX members, INEX provides mailing list services. There are currently three mailing lists: + +Name: tech@inex.ie +Purpose: INEX technical discussion +Subscription URL: https://www.inex.ie/mailman/listinfo/tech/ +Subscription Policy: individuals, roles, aliases, + no limit per organisation +Distribution: private + +Name: committee@inex.ie +Purpose: The INEX Executive Committee +Subscription URL: https://www.inex.ie/mailman/listinfo/committee/ +Subscription Policy: elected committee members only +Distribution: private & confidential + +Name: members@inex.ie +Purpose: Non-technical discussions relevant to INEX +Subscription URL: https://www.inex.ie/mailman/listinfo/members/ +Subscription Policy: individuals only, no limit per organisation +Distribution: private & confidential + + +Your Input +---------- + +Should you wish to subscribe to either or both mailing lists, please use the subscription URLs listed above. Alternatively, please email operations@inex.ie with any change / addition / removal requests. + +---------- + + +INEX Operations +=============== + +Technical Operations for INEX are provided by Network Ability Ltd (with additional support from Open Source Solutions Ltd). Technical support contact details for INEX can be found at: + + https://www.inex.ie/members/support + +In general, the best way to contact INEX operations is by email at: operations@inex.ie. If there is an emergency requiring immediate assistance, please contact one of us on the mobile phones listed on the web page. + + +Peering +======= + +INEX facilitates peering between its members, but other than the minimum current peering requirements (4 members or 10%, whichever is larger) does not mandate peering with any particular member apart from INEX itself. + +You will find a full list of members on the INEX members web page, along with the correct email addresses to use for peering requests. + +When emailing other INEX members about peering requests, please include all technical details relevant to the peering session, including your IP address, your AS number, and an estimate of the number of prefixes you intend to announce to that candidate peer. Several members require written legal contracts to be signed as a part of their peering procedures. If you require a written contract, please specify this on your peering request; similarly, it may be often useful to indicate your willingness (or otherwise) to sign legal contracts when approaching other members about peering. + +Please note that INEX members are required to reply to peering requests within a reasonable time frame. If your emails to other INEX members about peering go unanswered, please let us know and we will do what we can. + +INEX requires that all new members peer and share routes with the INEX route collectors for administrative purposes. We would be obliged if you could set up your router(s) and make the necessary arrangements for this as soon as possible. + +INEX's details are: + +remote-as: AS2128 +AS Macro: AS-INEXIE + +Peering VLAN #1 + IPv4 address: 193.242.111.126 + IPv4 session MD5: {$connections.0.Vlaninterface.0.ipv4bgpmd5secret} + + IPv6 address: 2001:7F8:18::F:0:1 + IPv4 session MD5: {$connections.0.Vlaninterface.0.ipv6bgpmd5secret} + +Peering VLAN #2 + IPv4 address : 194.88.240.126 + IPv4 session MD5: {$connections.0.Vlaninterface.0.ipv4bgpmd5secret} + + IPv6 address: 2001:7F8:18:12::F:0:1 + IPv4 session MD5: {$connections.0.Vlaninterface.0.ipv6bgpmd5secret} + + +INEX currently announces two prefixes over IPv4 and one prefix over IPv6 from AS2128: + + 193.242.111.0/24 + 194.88.240.0/23 + + 2001:7F8:18::/48 + + +NOC Details +=========== + +For the convenience of its members, INEX maintains a list of NOC and peering contact details for its members. These details are held on a private INEX database, and are available only from the following URL: + + https://www.inex.ie/members/memberlist + +This area of the INEX website is password protected and SSL secured. Passwords are only provided to current INEX members. This information is considered private and will not be passed on to other third parties by INEX. + +We would appreciate if you could take the time to ensure that the following details we hold on file are correct: + +Your Input +---------- + +Member name: {$connections.0.Cust.name} +Primary corporate web page: {$connections.0.Cust.corpwww} +Peering Email Address: {$connections.0.Cust.peeringemail} +NOC Phone number: {$connections.0.Cust.nocphone} +NOC Fax number: {$connections.0.Cust.nocfax} +General NOC email address: {$connections.0.Cust.nocemail} +NOC Hours: {$connections.0.Cust.nochours} +Dedicated NOC web page: {$connections.0.Cust.nocwww} +AS Number: {$connections.0.Cust.autsys} + +---------- + + +Router Configuration +==================== + +If you are new to internet exchanges, we would ask you to note that all members are expected to adhere to the technical requirements of the INEX MoU. In particular, we would draw your attention to section 2 of these requirements which outline what types of traffic may and may not be forwarded to the INEX peering LAN. + +For Cisco IOS based routers, we recommend the following interface configuration commands: + + no ip redirects + no ip proxy-arp + no ip directed-broadcast + no mop enabled + no cdp enable + udld port disable + +If you intend to use IPv6 with a Cisco IOS based router, please also consider the following interface commands: + + no ipv6 redirects + ipv6 nd suppress-ra + + +Connecting Switches to INEX +=========================== + +Many members choose to connect their INEX port to a layer 2 switch and then forward their peering traffic to a router virtual interface hosted elsewhere on their network. While connecting layer 2 switches to the INEX peering LAN is not actively discouraged, incorrect configuration can cause serious and unexpected connectivity problems. + +The primary concern is to ensure that only traffic from the router subinterface is presented to the INEX port. INEX implements per port mac address counting: if more than 1 mac address is seen on any switch port at any time, that port will automatically be disabled for a cooling off period, and your connectivity to INEX will temporarily be lost. + +This policy prevents two potential problems: firstly, it ensures that layer 2 traffic loops are prevented and secondly, it ensures that no other traffic escapes to the INEX peering LAN which shouldn't be seen there. + +If you choose to connect your INEX port or ports to a switch, it is critically important to assign one unique vlan for each INEX connection. If you share an INEX facing VLAN between multiple INEX ports or share a INEX-facing VLAN with any other network, your connection will automatically be shut down due to the security mechanisms implemented by INEX. + +Please also note that by default, several switch models send link-local traffic to all ports. On Cisco switches, this can be disabled using the following interface commands: + +interface GigabitEthernetx/x + spanning-tree bpdufilter enable + no keepalive + no cdp enable + udld port disable + +For further details please see the following URL: + + https://www.inex.ie/members/connectingswitches + + +Monitoring +========== + +By default, INEX actively monitors all ports on its peering LANs using ICMP PING for both connectivity and host latency. This monitoring causes about 25 PING packets to be sent to each IP address on the peering LAN every 5 minutes. If you do not wish for your router to be actively monitored, please mail operations@inex.ie and we can disable this facility. + + +IRC +=== + +INEX member staff and other INEX member employees may regularly be seen on irc.inex.ie (port 6697, SSL only), channel #inex-ops. This channel is password protected; the password for the channel may be found on the following web page: + + https://www.inex.ie/members/miscbenefits + +Although this IRC server is secured with SSL, INEX does not recommend swapping passwords or any other private / confidential information on this facility. + + +AS112 Service +============= + +For the benefit of its members, INEX hosts an AS112 nameserver which answers bogus requests to private IP address space. This service is available as a regular peering host on both INEX peering LANs. Its IP addreses are: 193.242.111.6 and 194.88.240.6. Should you wish to peer directly with the AS112 server, please contact INEX operations, and we can set up a peering session on the unit. Otherwise, AS112 is also visible on the INEX route server system. + + +Access to INEX Web Site Members Area +==================================== + +INEX provides usernames and passwords to enable access to the members area of the INEX web site. Your username is: "{$custdetails.shortname}". + +Please contact operations@inex.ie to securely obtain your password. Our preferred communications medium for exchanging passwords is PGP email. However, if you do not support PGP, then SMS may also be used. + + +PeeringDB +========= + +PeeringDB ( http://www.peeringdb.com/ ) facilitates the exchange of information related to peering. Specifically, what networks are peering, where they are peering, and if they are likely to peer with you. + +More and more organisations are using PeeringDB to make decisions on where they should open POPs, provision new links, etc. + +We would very much appreciate it if you could mark your new INEX peering under the "Public Peering Locations" section of your PeeringDB page. We are listed as 'INEX'. If you do not yet have a PeeringDB account, we would suggest that you register for one on their site. + + +Welcome to INEX, Ireland's Internet hub. + + +INEX Operations +INEX - Internet Neutral Exchange Association + + diff --git a/application/views/dashboard/as112.tpl b/application/views/dashboard/as112.tpl new file mode 100644 index 000000000..ad2da878d --- /dev/null +++ b/application/views/dashboard/as112.tpl @@ -0,0 +1,123 @@ +{include file="header.tpl" pageTitle="IXP Manager :: Member Dashboard"} + +
+ +
+ + + + + +
+ Details of the INEX AS112 Service +
+ +{include file="message.tpl"} + +
+ +
+ {if isset( $as112JustEnabled ) and $as112JustEnabled} +
+ New sessions for INEX's AS112 service will be enabled for you within the next 12 hours. + Please see configuration details below. +
+ {elseif $as112Enabled} +
+ You are enabled to use INEX's AS112 service. Please see configuration details below. +
+ {elseif $rsEnabled and not $as112Enabled} +
+ There are no bilateral BGP sessions configured for you on the AS112 server. However, as + you have route server sessions, you receive the AS112 prefixes via this. If you would like + to additionally enable bilateral peering, please + click here to have + our provisioning system create the sessions for you. +
+ {else} *} +
+ You are not enabled to use INEX's AS112 service. Please + click here to have + our provisioning system create the sessions for you. +
+ {/if} +
+ + + +

Overview

+ +

+From http://public.as112.net/: +

+ +
+ +

+Because most answers generated by the Internet's root name server system are negative, +and many of those negative answers are in response to PTR queries for RFC1918, dynamic +DNS updates and other ambiguous addresses, as follows: +

+ +
    +
  • 10.0.0.0/8
  • +
  • 172.16.0.0/12
  • +
  • 169.254.0.0/16
  • +
  • 192.168.0.0/16
  • +
+ +

+There are now separate (non-root) servers for these queries [such as INEX's AS112 service]. +

+ +

+As a way to distribute the load across the Internet for RFC1918-related queries, we use +IPv4 anycast addressing. The address block is 192.175.48.0/24 and its origin AS is 112. +This address block is advertised from multiple points around the Internet, and these +distributed servers coordinate their responses and back end statistical analyses. +

+
+ +

+For the benefit of its members, INEX hosts an AS112 nameserver which answers bogus +requests to private IP address space. This service is available as a regular peering +host on both INEX peering LANs. Its IP addreses are: 193.242.111.6 and +194.88.240.6. +

+ +

Configuration Details

+ +

+For Cisco routers, you will need something like the following example BGP configuration for peering LAN #1: +

+ +
+    router bgp 99999
+
+     ! INEX Peering LAN #1
+
+     neighbor 193.242.111.6 remote-as 112
+     neighbor 193.242.111.6 description INEX AS112 Service
+     address-family ipv4
+     neighbor 193.242.111.6 password s00persekr1t
+     neighbor 193.242.111.6 activate
+     neighbor 193.242.111.6 filter-list 100 out
+
+
+ +

+You should also use route-maps (or distribute-lists) to control +outgoing prefix announcements to allow only the prefixes which you indend to announce. +

+ +

More Information on the AS112 Project

+ +

+Please see http://public.as112.net/ for more information +on the AS112 project, The Nameservers at the End of the Universe. +

+ +
+
+ +{include file="footer.tpl"} diff --git a/application/views/dashboard/email/peering-request.tpl b/application/views/dashboard/email/peering-request.tpl new file mode 100644 index 000000000..07dba9b4a --- /dev/null +++ b/application/views/dashboard/email/peering-request.tpl @@ -0,0 +1,61 @@ + +Dear {$bcust.name} Peering Team, + +We are {$customer.name} ({$customer.corpwww}). + +We would like to arrange peering session(s) with you on the +following interface(s) at INEX: + +{foreach from=$pp item=p} + +{$p.a.vlanname|underline} + + +{if $p.a.ipv4enabled and $p.b.ipv4enabled} +Our IPv4 Address: {$p.a.ipv4address} +Our AS Number: {$customer.autsys} +Our AS Macro: {$customer.peeringmacro} + +Your IPv4 Address: {$p.b.ipv4address} +Your AS Number: {$bcust.autsys} + +{/if} + +{if $p.a.ipv6enabled and $p.b.ipv6enabled} +Our IPv6 Address: {$p.a.ipv6address} +Our AS Number: {$customer.autsys} +Our AS Macro: {$customer.peeringmacro} + +Your IPv6 Address: {$p.b.ipv6address} +Your AS Number: {$bcust.autsys} + +{/if} + + +{"NOC Details for "|cat:$customer.name|underline:"="} + +The following are our NOC details for your reference: + +NOC Hours: {$customer.nochours} +NOC Phone: {$customer.nocphone} +{if $customer.noc24hphone}NOC 24h Phone: {$customer.noc24hphone}{/if} + +NOC Fax: {$customer.nocfax} +NOC Email: {$customer.nocemail} +{if $customer.nocwww}NOC WWW: {$customer.nocwww}{/if} + + + + +Kind regards, +The {$customer.name} Peering Team + + +-- + +INEX (http://www.inex.ie/) is Ireland's neutral exchange association. This +email was composed with the assistance of INEX's Peering Manager which is +part of your member area at: {$config.identity.ixp.url}. + +{/foreach} + diff --git a/application/views/dashboard/index-tab-connections.tpl b/application/views/dashboard/index-tab-connections.tpl new file mode 100644 index 000000000..dc9525e6d --- /dev/null +++ b/application/views/dashboard/index-tab-connections.tpl @@ -0,0 +1,104 @@ + +{foreach from=$connections item=connection} + +

Connection #{counter}

+ + + + + + + + + + + + + + + + +
+ Switch + + + + Switch Port + + +
+ Speed + + + + Duplex + + +
+ + + {foreach from=$connection.Vlaninterface item=interface} + + {assign var='vlanid' value=$interface.vlanid} + +
+ +

Port {$connection.Physicalinterface.0.Switchport.SwitchTable.name}:{$connection.Physicalinterface.0.Switchport.name} - {$interface.Vlan.name}

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ IPv4 Address + + + + IPv6 Address + + +
+ Multicast Enabled + + + + IPv6 Enabled + + +
+ Route Server Client? + + + + AS112 Client? + + +
+ +
+ + {/foreach} + + +{/foreach} diff --git a/application/views/dashboard/index-tab-details.tpl b/application/views/dashboard/index-tab-details.tpl new file mode 100644 index 000000000..151e1c6cb --- /dev/null +++ b/application/views/dashboard/index-tab-details.tpl @@ -0,0 +1,244 @@ +

NOC Details

+ + + +
+
+
+ + + + + + + +

Billing Details

+ + + +
+
+
diff --git a/application/views/dashboard/index-tab-overview.tpl b/application/views/dashboard/index-tab-overview.tpl new file mode 100644 index 000000000..af8d95779 --- /dev/null +++ b/application/views/dashboard/index-tab-overview.tpl @@ -0,0 +1,160 @@ + + + {if $customer->isFullMember()} + {assign var='skipRSCheck' value='0'} + {assign var='skipAS112Check' value='0'} + {if not $skipRSCheck and not $rsEnabled} +
+
+ You are not using INEX's robust route server cluster. Please click here for more information. +
+
+ + {* AS112 is available over the route servers so only show this if the user is no an RS client *} + {if not $skipAS112Check and not $as112Enabled} +
+
+ You are not using INEX's AS112 service. Please click here for more information. +
+
+ {/if} + {/if} + + + +

My Peering Overview

+ +

+ As per your peering + manager settings (under the member column), the following is your peering + overview: +

+ +
+ + + + + + + + + + + + + {foreach from=$peering_stats key=name item=peerings} + + + + + + + + {/foreach} + + +
PeeredNot PeeredAwaiting ReplyWon't Peer
{$name}{if isset( $peerings.YES )}{$peerings.YES}{else}0{/if}{if isset( $peerings.NO )}{$peerings.NO}{else}0{/if}{if isset( $peerings.WAITING )}{$peerings.WAITING}{else}0{/if}{if isset( $peerings.NEVER )}{$peerings.NEVER}{else}0{/if}
+
+ + + + + {/if} {* END: if $customer->isFullMember() *} + + +

Recent Members

+ +

Our three most recent members are listed below. {if $customer->isFullMember()}Have you arranged peering with them yet?{/if}

+ +
+ + + + + + + {if $customer->isFullMember()} + + {/if} + + + + + {foreach from=$recentMembers item=member} + + + + + {if $customer->isFullMember()} + + {/if} + + {/foreach} + + +
NameAS NumberDate JoinedPeering Contact
{$member.name}{$member.autsys|asnumber}{$member.datejoin}{$member.peeringemail}
+
+ + + + + {if $customer->isFullMember()} + +

Aggregate Traffic Statistics

+ +

+ + {genMrtgImgUrlTag shortname=$customer.shortname category='bits' monitorindex='aggregate'} + +

+ + {/if} diff --git a/application/views/dashboard/index-tab-statistics.tpl b/application/views/dashboard/index-tab-statistics.tpl new file mode 100644 index 000000000..e3f7d47ea --- /dev/null +++ b/application/views/dashboard/index-tab-statistics.tpl @@ -0,0 +1,51 @@ + +

+ Please see the Statistics menu above right for more graphs and options. +

+ + +

+ +

+ + + + + + +
Graph Type: + +
+
+

+ +

Aggregate Traffic Statistics

+ +

+ + {genMrtgImgUrlTag shortname=$customer.shortname category='bits' monitorindex='aggregate'} + +

+ + +{foreach from=$connections item=connection} + +

+ Connection: + {$connection.Physicalinterface.0.Switchport.SwitchTable.Cabinet.Location.name} + / {$connection.Physicalinterface.0.Switchport.SwitchTable.name} + / {$connection.Physicalinterface.0.Switchport.name} ({$connection.Physicalinterface.0.speed}Mb/s) +

+ + +

+ + {genMrtgImgUrlTag shortname=$customer.shortname monitorindex=$connection.Physicalinterface.0.monitorindex} + +

+ +{/foreach} diff --git a/application/views/dashboard/index.tpl b/application/views/dashboard/index.tpl new file mode 100644 index 000000000..4679a62ce --- /dev/null +++ b/application/views/dashboard/index.tpl @@ -0,0 +1,64 @@ +{include file="header.tpl" pageTitle="IXP Manager :: Member Dashboard"} + +
+ +
+ +{include file="message.tpl"} + +{if $meeting neq false} + {include file="dashboard/popups/meeting.tpl"} +{/if} + +
+ + + + + +
+ + + +
+
+ + + {include file="dashboard/index-tab-overview.tpl"} + +
+ + {if $customer->isFullMember()} +
+ + {include file="dashboard/index-tab-details.tpl"} + +
+
+ + {include file="dashboard/index-tab-connections.tpl"} + +
+
+ + {include file="dashboard/index-tab-statistics.tpl"} + +
+ {/if} +
+
+ +
+ +
+ +{include file="footer.tpl"} diff --git a/application/views/dashboard/member-details.tpl b/application/views/dashboard/member-details.tpl new file mode 100644 index 000000000..72ba03cf0 --- /dev/null +++ b/application/views/dashboard/member-details.tpl @@ -0,0 +1,238 @@ +{include file="header.tpl" pageTitle="IXP Manager :: Member Dashboard"} + +
+ +
+ +{include file="message.tpl"} + +
+ +

Details for INEX Member: {$cust.name}

+ +{literal} + +{/literal} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Member Type:{$cust->getMemberTypeString()}Member Status:{$cust->getMemberStatusString()}
 
AS Number:{$cust.autsys|asnumber}Peering Macro:{$cust.peeringmacro}
Peering Policy:{$cust.peeringpolicy}
 
Peering Email:{$cust.peeringemail}NOC Email{$cust.nocemail}
NOC Phone:{$cust.nocphone}NOC 24 Hour Phone{$cust.noc24hphone}
Dedicated NOC Web:{$cust.nocwww}NOC Fax{$cust.nocfax}
NOC Hours:{$cust.nochours}
 
Corporate Web:{$cust.corpwww}
 
+ + +{foreach from=$connections item=connection} + +
+ +

Connection {counter name=numconnections}

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Switch:{$connection.Physicalinterface.0.Switchport.SwitchTable.name}.inex.ieSwitch Port:{$connection.Physicalinterface.0.Switchport.name}
Speed:{$connection.Physicalinterface.0.speed} MbpsDuplex:{$connection.Physicalinterface.0.duplex}
Location:{$connection.Physicalinterface.0.Switchport.SwitchTable.Cabinet.Location.name}Colo Cabinet ID:{$connection.Physicalinterface.0.Switchport.SwitchTable.Cabinet.name}
 
AS Number:AS{$cust.autsys}Peering Macro:{$cust.peeringmacro}
+ +{foreach from=$connection.Vlaninterface item=interface} +{assign var='vlanid' value=$interface.vlanid} + +

      {$interface.Vlan.name}:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IPv4 Address:{$interface.Ipv4address.address}/{$networkInfo.$vlanid.4.masklen}IPv6 Address:{if $interface.Ipv6address.address}{$interface.Ipv6address.address}/{$networkInfo.$vlanid.6.masklen}{/if}
Multicast Enabled:{if $interface.mcastenabled}Yes{else}No{/if}IPv6 Enabled:{if $interface.ipv6enabled}Yes{else}No{/if}
Route Server Client:{if $interface.rsclient}Yes{else}No{/if}AS112 Client:{if $interface.as112client}Yes{else}No{/if}
+ +{/foreach} + +

+ +{/foreach} + +
+ +
+ +{include file="footer.tpl"} diff --git a/application/views/dashboard/members-details-list.tpl b/application/views/dashboard/members-details-list.tpl new file mode 100644 index 000000000..18d06e1f7 --- /dev/null +++ b/application/views/dashboard/members-details-list.tpl @@ -0,0 +1,76 @@ +{include file="header.tpl" pageTitle="IXP Manager :: Member Dashboard"} + +
+ +{include file="message.tpl"} + +
+ +
+ +
+ + + + + + + + + + + + +{foreach from=$memberDetails item=md} + + + + + + + + + + +{/foreach} + + +
MemberPeering EmailASNNOC PhoneNOC Hours
{$md.name}{$md.peeringemail}{$md.autsys|asnumber}{$md.nocphone}{$md.nochours}view
+
+ +
+ +
+ +{literal} + +{/literal} + +{include file="footer.tpl"} diff --git a/application/views/dashboard/my-peering-matrix.tpl b/application/views/dashboard/my-peering-matrix.tpl new file mode 100644 index 000000000..abf4b94e8 --- /dev/null +++ b/application/views/dashboard/my-peering-matrix.tpl @@ -0,0 +1,528 @@ +{include file="header.tpl" pageTitle="IXP Manager :: My Peering Manager"} + +
+ + + + + +
+ My Peering Manager +
+ +

+

+ + + + + + + + +
Peering VLAN: + + +    [Help] + + + Download as: + ASCII + CSV + PHP +
+
+

+ +{include file="message.tpl"} + +
+ +
+ + + + + + + + + + + + + + + +{foreach from=$matrix item=m} + + + + + + + + {* If I'm IPv6 enabled *} + {if $ipv6[$customer.id]} + + {/if} + + + + + + + + + +{/foreach} + +
MemberVLANNameASNPolicyPeering ContactMember Since
+ +
+ {if $m.MyPeeringMatrix.peered eq 'YES'} + YES + {elseif $m.MyPeeringMatrix.peered eq 'NO'} + NO + {elseif $m.MyPeeringMatrix.peered eq 'WAITING'} + Waiting + {elseif $m.MyPeeringMatrix.peered eq 'NEVER'} + Never + {/if} +
+
+
+ {if $m.peering_status eq 'YES'} + YES + {elseif $m.peering_status eq 'NO'} + NO + {elseif $m.peering_status eq 'INCONSISTENT_X'} + INCONSISTENT_X + {elseif $m.peering_status eq 'YES'} + INCONSISTENT_Y + {/if} + + {if $rsclient[$m.Y_Cust.id]} + Y + {else} + N + {/if} + + {if $ipv6[$m.Y_Cust.id]} + +
+ {if $m.MyPeeringMatrix.ipv6} + PEERED OVER IPv6 + {else} + NOT PEERED OVER IPv6 + {/if} +
+
+ {/if} +
{$m.Y_Cust.name}{$m.y_as|asnumber}{$m.Y_Cust.peeringpolicy} + + {$m.Y_Cust.peeringemail} + + {$m.Y_Cust.datejoin} + +
+ {if $m.MyPeeringMatrix.notes_id neq null} + Notes + {else} + Notes + {/if} +
+
+
+ + +
+ + + + +
+
Member to Member Peering Request
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ From:   + + +
+ To:   + + +
+ BCC:   + + +
+ Subject:   + + +
+ +
+ + +
+
+
+ +
+
Peering Notes Dialog
+
+
+

+

Loading...
+

+

+ + +

+
+
+
+ + + + + + +{include file="footer.tpl"} + + diff --git a/application/views/dashboard/my-peering-matrix/ascii.tpl b/application/views/dashboard/my-peering-matrix/ascii.tpl new file mode 100644 index 000000000..0fd38679a --- /dev/null +++ b/application/views/dashboard/my-peering-matrix/ascii.tpl @@ -0,0 +1,20 @@ +% INEX - My Peering Manager: {$smarty.now|date_format:"%Y-%m-%d %H:%M:%S"} +% +% Copyright (c) Internet Neutral Exchange Association Ltd T/A INEX {$smarty.now|date_format:"%Y"}. All rights reserved. +% +% http://www.inex.ie/ +{foreach from=$matrix item=m} +lan: {$m.vlan} +peered {$m.MyPeeringMatrix.peered} +peering-matrix: {$m.peering_status} +route-server-member: {if $rsclient[$m.Y_Cust.id]}YES{else}NO{/if} + +{if $ipv6[$customer.id]}ipv6: {if $ipv6[$m.Y_Cust.id]}{if $m.MyPeeringMatrix.ipv6}PEERED_IPv6{else}NOT_PEERING_IPv6{/if}{else}N/A{/if}{/if} + +name: {$m.Y_Cust.name} +asn: {$m.y_as} +peering-policy: {$m.Y_Cust.peeringpolicy} +peering-contact: {$m.Y_Cust.peeringemail} +member-since: {$m.Y_Cust.datejoin} + +{/foreach} diff --git a/application/views/dashboard/my-peering-matrix/csv.tpl b/application/views/dashboard/my-peering-matrix/csv.tpl new file mode 100644 index 000000000..d6f4ffe27 --- /dev/null +++ b/application/views/dashboard/my-peering-matrix/csv.tpl @@ -0,0 +1,4 @@ +VLAN,Peered,PeeringMatrix,RouteServerMember,IPv6,Name,ASN,Policy,PeeringContactMemberSince +{foreach from=$matrix item=m} +"{$m.vlan}","{$m.MyPeeringMatrix.peered}","{$m.peering_status}","{if $rsclient[$m.Y_Cust.id]}YES{else}NO{/if}",{if $ipv6[$customer.id]}{if $ipv6[$m.Y_Cust.id]}{if $m.MyPeeringMatrix.ipv6}"PEERED_IPv6",{else}"NOT_PEERING_IPv6",{/if}{else}"N/A",{/if}{/if}"{$m.Y_Cust.name}","{$m.y_as}","{$m.Y_Cust.peeringpolicy}","{$m.Y_Cust.peeringemail}","{$m.Y_Cust.datejoin}" +{/foreach} diff --git a/application/views/dashboard/my-peering-matrix/php.tpl b/application/views/dashboard/my-peering-matrix/php.tpl new file mode 100644 index 000000000..102111a03 --- /dev/null +++ b/application/views/dashboard/my-peering-matrix/php.tpl @@ -0,0 +1,28 @@ + array( + 'lan' => '{$m.vlan}', + 'peered' => '{$m.MyPeeringMatrix.peered}', + 'peering_matrix' => '{$m.peering_status}', + 'route_server' => '{if $rsclient[$m.Y_Cust.id]}YES{else}NO{/if}', + {if $ipv6[$customer.id]}'ipv6' => '{if $ipv6[$m.Y_Cust.id]}{if $m.MyPeeringMatrix.ipv6}PEERED_IPv6{else}NOT_PEERING_IPv6{/if}',{else}N/A',{/if}{/if} + + 'name' => "{$m.Y_Cust.name}", + 'asn' => '{$m.y_as}', + 'peering_policy' => '{$m.Y_Cust.peeringpolicy}', + 'peering_contact' => '{$m.Y_Cust.peeringemail}', + 'member_since' => '{$m.Y_Cust.datejoin}' + ), + +{/foreach} +); diff --git a/application/views/dashboard/peering-matrix.tpl b/application/views/dashboard/peering-matrix.tpl new file mode 100644 index 000000000..465a5ce44 --- /dev/null +++ b/application/views/dashboard/peering-matrix.tpl @@ -0,0 +1,136 @@ +{include file="header-full-width.tpl" pageTitle="IXP Manager :: Member Dashboard"} + +
+ +
+ + + + + +
+ Peering Matrix :: {$config.peering_matrix.public.$lan.name} +
+ +{include file="message.tpl"} + +
+ +
+ +

+Total potential sessions: {$potential}. +Active peering sessions: {$active}. +{assign var=active value=`$active*100`} +Percentage active peering sessions: {$active/$potential|string_format:'%d'}% +

+ + + + + + + + + {foreach from=$matrix key=x_as item=peers} + + + + {/foreach} + + + + +{assign var=outer value=0} + +{foreach from=$matrix key=x_as item=peers} + + + + + + + + {assign var=inner value=0} + + {foreach from=$peers item=y} + + + + {assign var=inner value=`$inner+1`} + + {* for the last cell of the last row, we add a empty cell *} + {if $outer eq $peers|@count and $inner eq $peers|@count} + + {/if} + {/foreach} + + + +{assign var=outer value=`$outer+1`} + +{/foreach} + +
   + {assign var=asn value=$x_as|string_format:'% 5s'} + {php} + $asn = $this->get_template_vars( 'asn' ); + for( $i = 0; $i < 5; $i++ ) + echo substr( $asn, $i, 1 ) . '
'; + {/php} +
{$peers[0].X_Cust.name}  {$peers[0].x_as}  + {if $outer eq $inner} + {* we're at the intersection of our AS on the x and y graph - stick in an empter cell *} + + {/if} + + {if $y.peering_status eq 'YES'} + Y + {else if $row.peering_status eq 'NO'} + N + {/if} +
+ +

Notes on peering matrix

+ +
    +
  • + Where an INEX member is not listed on this peering matrix, it is because they are + currently not actively peering at INEX, or because they have opted out of presenting + their peering information in this database. +
  • +
  • + This peering matrix is based on Netflow traffic accounting data from the INEX peering + LANs. It is significantly more accurate the the old RIPE IRRDB peering matrix, which + is still actively maintained by INEX. +
  • +
  • + This peering matrix only detects if there is bidirectional TCP flow between routers at + INEX. It cannot detect whether there are actually prefixes swapped betwen routers. +
  • +
  • + This peering matrix will indicate that there is active peering between two members, + even if their peering sessions are misconfigured with incorrect BGP MD5 secrets. +
  • +
  • + The peering matrix does not yet support IPv6. +
  • +
+ +
+ +
+ + + +{include file="footer-full-width.tpl"} + diff --git a/application/views/dashboard/popups/meeting.tpl b/application/views/dashboard/popups/meeting.tpl new file mode 100644 index 000000000..bff7d83ef --- /dev/null +++ b/application/views/dashboard/popups/meeting.tpl @@ -0,0 +1,102 @@ + +{literal} + + + +{/literal} diff --git a/application/views/dashboard/rs-info.tpl b/application/views/dashboard/rs-info.tpl new file mode 100644 index 000000000..afac1c867 --- /dev/null +++ b/application/views/dashboard/rs-info.tpl @@ -0,0 +1,312 @@ +{include file="header.tpl" pageTitle="IXP Manager :: Member Dashboard"} + +
+ +
+ + + + + +
+ INEX Route Server Details +
+ +{include file="message.tpl"} + +
+ +
+ {if $rsSessionsEnabled} +
+ You are now enabled to use INEX's robust route server cluster.
+
+ Please note that the provisioning system updates the route servers twice daily + so place allow up to twelve hours for your configuration to become active on + our systems.
+
+ Please see below for configuration details. +
+ {elseif not $rsEnabled} +
+ You are not using INEX's robust route server cluster. Please click here to have our provisioning system create sessions for you. +
+ {else} +
+ You are enabled to use INEX's robust route server cluster. +
+ {/if} +
+ + + +

Overview

+ +

+Normally on a peering exchange, all connected parties will establish bilateral peering relationships +with each other member port connected to the exchange. As the number of connected parties increases, +it becomes increasingly more difficult to manage peering relationships with members of the exchange. +A typical peering exchange full-mesh eBGP configuration might look something similar to the diagram +on the left hand side. +

+ + + + + + + + + + + + +
+ [ IXP full mesh peering relationships ] + + [  IXP route server peering relationships ] +
+ IXP full mesh peering relationships + + IXP route server peering relationships +
+ +

+
+The full-mesh BGP session relationship scenario requires that each BGP speaker configure and manage +BGP sessions to every other BGP speaker on the exchange. In this example, a full-mesh setup requires +7 BGP sessions per member router, and this increases every time a new member connects to the exchange. +

+ +

+However, by using a route server for all peering relationships, the number of BGP sessions per router +stays at two: one for each route server. Clearly this is a more sustainable way of maintaining IXP +peering relationships with a large number of participants. +

+ + +

Should I use this service?

+ +

+The INEX route server cluster is aimed at: +

+ +
    +
  • small to medium sized members of the exchange who don't have the time or resources to + aggressively manage their peering relationships +
  • +
  • larger members of the exchange who have an open peering policy, but where it may not + be worth their while managing peering relationships with smaller members of the exchange. +
  • +
+ +

+As a rule of thumb: If you don't have any good reasons not to use the route server cluster, you should probably use it. +

+ +

+The service is designed to be reliable. It operates on two physical servers, each located in a +different data centre. The service is available on all INEX networks (public peering lans #1 and #2, +and voip peering lans #1 and #2), on both ipv4 and ipv6. Each server runs a separate routing daemon +per vlan and per L3 protocol. Should a single BGP server die for some unlikely reason, no other BGP +server is likely to be affected. If one of the physical servers becomes unavailable, the second server +will continue to provide BGP connectivity. +

+ +

+INEX has also implemented inbound prefix filtering on its route-server cluster. This uses internet +routing registry data from the RIPE IRR database to allow connected members announce only the address +prefixes which they have registered publicly. +

+ +

+INEX uses Quagga running on FreeBSD for its route server cluster. Quagga is widely used at Internet +exchanges for route server clusters (e.g. LINX, AMS-IX, DE-CIX), and has been found to be reliable +in production. +

+ + +

How do I use the service?

+ +

+In order to use the service, you should first instruct the route servers to create sessions for you: +

+ +
+ {if not $rsEnabled} +
+ You are not enabled to use INEX's route server cluster. + Please click here to have our provisioning system create sessions for you. +
+ {else} +
+ You are enabled to use INEX's robust route server cluster. +
+ {/if} +
+ +

+If enabled, the route servers are set up to accept BGP connections from your router. Once this has +been done, you will need to configure a BGP peering session to the correct internet address. The +IP addresses of the route servers are listed as follows: +

+ +
+
+
+
+ + + +

+

+For Cisco routers, you will need something like the following bgp configuration: +

+ +
+    router bgp 99999
+     no bgp enforce-first-as
+
+     ! Route server #1
+
+     neighbor 193.242.111.8 remote-as 43760
+     neighbor 193.242.111.8 description INEX Route Server
+     address-family ipv4
+     neighbor 193.242.111.8 password s00persekr1t
+     neighbor 193.242.111.8 activate
+     neighbor 193.242.111.8 filter-list 100 out
+
+     ! Route server #2
+
+     neighbor 193.242.111.9 remote-as 43760
+     neighbor 193.242.111.9 description INEX Route Server
+     address-family ipv4
+     neighbor 193.242.111.9 password s00persekr1t
+     neighbor 193.242.111.9 activate
+     neighbor 193.242.111.9 filter-list 100 out
+
+ +

+You should also use route-maps (or distribute-lists) to control +outgoing prefix announcements to allow only the prefixes which you indend to announce. +

+ +

+Note that the route server system depends on information in the RIPE IRR database. If you +have not published correct route: and route6: objects in this database, +your prefix announcements will be ignored by the route server and your peers will not route their +traffic to you via the exchange. +

+ +

Community based prefix filtering

+ +

+The INEX route server system also provides well known communities to allow members to +control the distribution of their prefixes. These communities are defined as follows: +

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
DescriptionCommunity
Prevent announcement of a prefix to a peer0:peer-as
Announce a route to a certain peer43760:peer-as
Prevent announcement of a prefix to all peers0:43760
Announce a route to all peers43760:43760
+
+ + + +

+

+So, for example, to instruct the route server to distribute a particular prefix only to +AS64111 and AS64222, the prefix should be tagged with communities: 0:43760, 43760:64111 +and 43760:64222. +

+ +

+Alternatively, to announce a prefix to all INEX members, excluding AS64333, the prefix +should be tagged with community 0:64333. +

+ +
+
+ +{include file="footer.tpl"} diff --git a/application/views/dashboard/sec-event-email-config.tpl b/application/views/dashboard/sec-event-email-config.tpl new file mode 100644 index 000000000..c459db278 --- /dev/null +++ b/application/views/dashboard/sec-event-email-config.tpl @@ -0,0 +1,98 @@ +{include file="header.tpl" pageTitle="IXP Manager :: SEC Event Notification Config"} + +
+ +
+ + + + + +
+ Member Configuration :: SEC Event Notifications +
+ +{include file="message.tpl"} + +
+ + +

About SEC Events

+ +

+At INEX, we use the SEC - simple event correlator to +monitor various logs and feed information that we feel is important into a processor within the IXP Manager. +The processor parses the entry and then correlates that information with our IXP database to match it +to switch ports and INEX members. +

+ +

+We now want to make that information available to our members through email alerts for the follow types +of information. We are enabling all these by default as we feel they are important and should be acted on. +Please feel free to disable these email alerts by unchecking the boxes below. +

+ +

+Note that in all cases, the notification email is sent to your NOC email address. As such, +notifications are not user account specific but apply to the overall member account. +

+ + +
+ +

BGP MD5 Authentication

+ +

+This alert is issued when our monitoring systems record a bad or missing BGP MD5 authentication +with our route collector. As it is a requirement of INEX that all members peer and exchange +routes with the route collector, we'd appreciate it if you could address these alerts at your +earliest convenience. +

+ +

+   Enable notifications for missing or bad +BGP MD5 authentication with the route collector. +

+ + + +

Member Port Up/Down Notification

+ +

+This alert is issued when our monitoring systems find that one of your switch ports has +gone up or down. As a result of a port down notification, your INEX link may be no longer +passing traffic and you should address it immediately. +

+ +

+   Enable notifications for port up/down events. +

+ + + +

Port Security Violation

+ +

+To ensure the stability of our peering LANs, it is a strict requirement at INEX that our members +only present one MAC address per port. You will receive one mail notification per port per day on +any day that we register a security violation and we would kindly ask that you address this issue +at your earliest convenience. +

+ +

+   Enable notifications for port security violations. +

+ +

+
+ +         +

+ +
+ +
+
+ +{include file="footer.tpl"} + diff --git a/application/views/dashboard/static/fees.tpl b/application/views/dashboard/static/fees.tpl new file mode 100644 index 000000000..dc351a927 --- /dev/null +++ b/application/views/dashboard/static/fees.tpl @@ -0,0 +1,153 @@ +{include file="header.tpl" pageTitle="IXP Manager :: Member Dashboard"} + +
+ +
+ + + + + +
+ Membership Fees and Charges +
+ +

+INEX is a member supported organisation and operates on a not-for-profit basis. +Revenue for the organisation comes from two primary sources, membership fees and +port charges. +

+ +

2011 Fees and Charges

+ +

Membership Fees

+ + + + + + + + + + + + + + + + + + + + + +
DescriptionCharge
Associate Membership€1,000 p.a.
Full Membership€2,000 p.a.
Joining FeeNo charge
+ + + + +

Port Charges

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DescriptionFirst PortSecond PortSubsequent Port    Term
10Mbit/s portWaived for 2011 (prev. €3,000 p.a.)     n/an/aper annum
100Mbit/s port€4,500Free     €3,000per annum
1Gbit/s port€6,600€4,400€4,400per annum
10Gbit/s port€18,000€12,000€12,000per annum
+ + + + +

Miscellaneous Charges

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DescriptionCharge
Private Interconnection link within INEX Cage€120 p.a.
Private Interconnection link to external cross-connect€250 p.a.
Installation fee for long-haul (ZX) gigabit optical ethernet link€1,500 once off
Installation fee for long-haul (ZX) ten gigabit optical ethernet link€4,500 once off
Rack space in INEX colocation cages above 3U€250 p.a. per U
Private VLAN between two members€240 p.a. per party
+ + +

Notes

+ +
    +
  • Free second 100Mbps port only applicable to connections to the secondary peering LAN.
  • +
  • Private Interconnections may only be installed between INEX members. Each party is liable to the charge noted in the table above.
  • +
  • Port and private interconnect charges are not applicable to Associate Members, as associate members have no connectivity entitlements.
  • +
  • There is no port connection charge, except for ZX gigabit and ten gigabit links
  • +
  • VAT is charged on invoices to Irish based companies at the prevailing rate at the time of invoice (from January 2010: 21%). +
  • + +
+ +
+ +{include file="footer.tpl"} diff --git a/application/views/dashboard/static/help-my-peering-manager.tpl b/application/views/dashboard/static/help-my-peering-manager.tpl new file mode 100644 index 000000000..8796234e4 --- /dev/null +++ b/application/views/dashboard/static/help-my-peering-manager.tpl @@ -0,0 +1,168 @@ +{include file="header-tiny.tpl" pageTitle="IXP Manager :: Help"} + +
+ + + + + +
+ My Peering Manager :: Instructions +
+ +
+ +

Introduction

+ +

+Welcome to the INEX's Member Peering Manager. This tool will allow existing and new members alike +to manage existing and set-up new peerings with ease. +

+ + +

Features

+ +The features you can avail of in this application include: + +
    +
  • Automatically generate and send peering requests with all relevent information;
  • +
  • See who you are peered with on a per VLAN basis as seen by INEX's flow analysis;
  • +
  • Set your own peering flags on a per member basis;
  • +
  • Record notes to track your discussions with other members.
  • +
+ +

Important Concepts

+ +

+You'll notice four icon columns to the left of the page and it's important to differentaite between +them to make maximum use of this application: +

+ +
+ +
The State Column:
+ +
+

+ This column is for your own benefit and is set per VLAN. + You can change its + status by clicking on the icon. It will rotate through four states as follows (along with + our suggested meanings but you can always apply your own!): +

+ + + + + + + + + + + + + + + + + + + + + + + + + +
+ [NO] + + I have not yet contacted this member in relation to this VLAN. +
+ [YES] + + I am peered with this member on this VLAN. +
+ [WAITING] + + I have contacted this member and I am awaiting a reply. +
+ [NEVER] + + This peer has declined to peer with me or I won't peer with them. +
+ +

+ If you are an existing member you will need to update this to reflect your current status + as they will all be set to I have not yet contacted this member by default. +

+
+ +
The PM (Peering Matrix) Column:
+ +
+

+ This column is based on BGP traffic snooping on the INEX peering LANs for IPv4 and route server states. + It is per peering LAN and will reflect your peering status for the VLAN you have + selected. +

+
+ +
The RS Column:
+ +
+

+ This column indicates whether this member is a route server client or not. +

+ +

+ If both you and the member are route server clients, you may, for example, choose to just + accept the multilateral peering and fore go the effort of setting up bilateral peerings. +

+
+ +
The IPv6 Column:
+ +
+

+ This column will only display if you are IPv6 enabled for the VLAN you are viewing. +

+ +

+ When it is displayed, it will only show an icon for those other members that are IPv6 enabled. There + are only two icons available: a smily face which you can use to indicate that you are peered over + IPv6 with this member or, the fault, a crying face to indicate that you are not. +

+ +

+ Clicking the icon will change it. +

+
+ + +

Sending Peering Requests

+ +

+By clicking on the peering email of a member, a preformatted mail will appear which you are free to +edit. However, you will be unable to change the from or destination email addresses which are +fixed to the peering contact details of each member. +

+ +

+A note is automatically added to your notes for that member's peering record when a mail is sent. +

+ +

Notes

+ +

+The column on the right has a notes icon. It will be gray scale to indicate that no notes are +recorded for that member and, if in colour, it will indicate that notes exist. +

+ +

+You can add any notes you like to track your peering (or other) conversations with that member. The +system will automatically add the date and username to the note to help track which members of +your organisation are working with another member. +

+ +{include file="footer-tiny.tpl"} diff --git a/application/views/dashboard/static/housing.tpl b/application/views/dashboard/static/housing.tpl new file mode 100644 index 000000000..77a27b085 --- /dev/null +++ b/application/views/dashboard/static/housing.tpl @@ -0,0 +1,118 @@ +{include file="header.tpl" pageTitle="IXP Manager :: Member Dashboard"} + +
+ +
+ + + + + +
+ Equipment Housing at INEX Facilities +
+ +

+For members who do not have co-location space in any of INEX's locations and who use +traditional leased circuits for remote connectivity, INEX can host routers / switches +within INEX cages. We provide a number of facilities for members who avail of this option. +

+ +

Inbound Connectivity

+ +

+INEX supports inbound leased circuits which can use either UTP or single mode fibre. +This means that the following circuit types are supported: +

+ +
    +
  • PSTN – regular phone lines for remote console connectivity
  • +
  • E1 – 2Mb circuits
  • +
  • STM-1 – 155Mb/s
  • +
  • STM-4 – 622Mb/s
  • +
  • STM-16 – 2.5Gb/s
  • +
  • Metro Ethernet over UTP – 10Mb/s or 100Mb/s carrier
  • +
  • Metro Ethernet over fibre – 1Gb/s or 10Gb/s carrier
  • +
+ +

+In practice, we do not encourage E1 connections, as there is no logical upgrade path and +they require extra termination equipment. INEX also does not support connections which +require co-axial cabling (i.e. E3). We would encourage members who require connectivity +slower than STM-1 to use metro ethernet connectivity. Fibre cables at INEX cages are +terminated as SC/PC. We support single mode and 50μ multi mode connections. +

+ +

Console Connectivity

+ +

+INEX uses MRV console servers for its own management purposes and if required can +provide password controlled secure access to members' console ports using this equipment. +Should you require this service, please contact operations@inex.ie. +

+ + +

Access to Equipment

+ +

+INEX members who host equipment in INEX cages may nominate up to 5 individuals who will be +given emergency grade 24x7x365 access to INEX facilities without prior notification to INEX +staff. INEX operations can also authorise access to INEX cage facilities on a next-day basis +for non-emergency works. Should you require routine access to an INEX cage, please email +operations@inex.ie. Please note that all INEX +co-location providers require photo identity. Member employees who fail to produce photo ID +will be denied access to the co-location floor. +

+ +

Space Allocation

+ +

+Members who house equipment in INEX cages are allocated 3U by default. More space can be +allocated on request, although this may require moving the equipment to a different rack +location or splitting the equipment between two locations. Please see the INEX pricing +information page for details on pricing for more than 3U. +

+ +

Power Supply

+ +

+INEX provides A+B power at 220VAC, 50Hz, with 13A 3-prong UK+Ireland style sockets. +

+ + +

Private Interconnections

+ + +

+Members who house equipment in INEX cages are entitled to order and use cross-connects +to other INEX members, both inside and outside INEX cages. Please see the INEX pricing +information page for further details. +

+ +

Limitations

+ +

+INEX provides router/switch housing facilities to its members for the purposes of +connecting to the INEX peering LAN. We are unable to permit members to use INEX +housing for: +

+ +
    +
  • + Connecting their customers (unless providing transit over the INEX peering LAN, or + unless using the INEX private interconnection service to another INEX member) +
  • +
  • + Connecting to upstream service providers, where these providers are not members of INEX +
  • +
  • + Hosting general servers (although specific exclusions apply for root, TLD and ENUM tier 1 + DNS servers). +
  • +
+ +
+ +
+ +{include file="footer.tpl"} diff --git a/application/views/dashboard/static/misc-benefits.tpl b/application/views/dashboard/static/misc-benefits.tpl new file mode 100644 index 000000000..58fb365e2 --- /dev/null +++ b/application/views/dashboard/static/misc-benefits.tpl @@ -0,0 +1,163 @@ +{include file="header.tpl" pageTitle="IXP Manager :: Member Dashboard"} + +
+ +
+ + + + + +
+ Miscellaneous Benefits +
+ +

IRC Channel

+ + +

+Members of the INEX operations team, along with many NOC personnel from INEX member organisations +can often be found on the #inex-ops IRC channel. This facility has proved itself to be a useful +communications medium for operational matters. The #inex-ops IRC channel is password protected +and access to the server is encrypted using SSL. +

+ + + + + + + + + + + + + + + + + + + + +
Server name:irc.inex.ie, port 6697, SSL enabled
Channel:#inex-ops
Password:pixiedust
+ + +

Route Collector

+ +

+INEX runs a route collector, whose purpose is to allow exchange members to debug routing issues. +While there is public access to the route collector available on the INEX looking glass, INEX +members have CLI access to the route-collector. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Server name:route-collector.inex.ie
Access protocol:SSH1
Username:Your IXP Manager username
Password:Your IXP Manager password
+ +

+Please note that all commands issued to the INEX route collector are temporarily logged +for security purposes. These logs are not archived into long term storage, but are deleted +after a week or two. +

+ + +

Console Server

+ +

+INEX can provide remote console access services for those members who house equipment +within INEX's facilities. These console servers provide access to housed equipment +using RS-232 serial ports. Access to the servers are provided on a per-port, per-user, +password-authenticated basis, thereby providing secure emergency management access. +

+ +

+Access to the servers is available using the following parameters: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Server name: + conserver-tcy1.inex.ie (Telecity)
+ conserver-deg1.inex.ie (DEG Kilcarbery)
+ conserver-ixdub1-1.inex.ie (Interxion DUB1)
+ conserver-ixdub2-1.inex.ie (Interxion DUB2) +
Access protocol:SSH2
Username:Your IXP Manager username
Password:Your IXP Manager password
+ +

+Only INEX members with equipment hosted at INEX have access to these servers. +

+ +

+When connected to a console server, the commands are: +

+ +

+Menu mode: +

+ +
    +
  • <arrow-up> and <arrow-down> to select which device you want to connect to;
  • +
  • <cr> to connect to your switch;
  • +
  • Q (i.e. upper case q) to disconnect from the console server
  • +
+ +

+When connected to the management port on the hosted device: +

+ +
    +
  • <ctrl-y>, followed by e to go back to menu mode
  • +
+ +
+
+{include file="footer.tpl"} diff --git a/application/views/dashboard/static/port-security.tpl b/application/views/dashboard/static/port-security.tpl new file mode 100644 index 000000000..51257e79c --- /dev/null +++ b/application/views/dashboard/static/port-security.tpl @@ -0,0 +1,131 @@ +{include file="header.tpl" pageTitle="IXP Manager :: Member Dashboard"} + +
+ +
+ + + + + +
INEX Port Security Policies
+ +

For the purposes of ensuring layer 2 stability, INEX implements three +port security policies.

+ +
    + +
  • + Broadcast Traffic Storm Control — INEX restricts + broadcast traffic received on any particular port to be no more than + 0.33% of the total traffic received on that port.
    +
    + While it is normal to see a small amount of Layer 2 broadcast traffic + for certain types of traffic (ARP), large amounts of broadcast traffic + typically indicate a problem with the connecting router or switch, + caused by incorrect configuration, failed hardware or + hardware/microcode bugs. Because broadcast traffic frames are forwarded + to all ports on a flat layer 2 LAN, this sort of traffic could + potentially disrupt service for other connections into the INEX switch + fabric. Beyond the limit of 0.33%, inbound broadcast traffic is simply + dropped, and will not be forwarded to the relevant INEX port. +
    +
    +
  • + +
  • + Multicast Traffic Storm Control — on ports which are + not enabled for multicast traffic, INEX throttles multicast traffic + received on any particular port to be no more than 0.33% of the total + traffic received on that port.
    +
    + It is also normal to see small amounts of inbound multicast + traffic on ports (e.g. IPv6 neighbour discovery), where the port has + not been enabled for regular multicast traffic. However, as with + broadcast traffic, excessive amounts of multicast traffic on a + non-multicast enabled port are indicative of configuration problems. + For this reason, the INEX switches are configured to drop multicast + frames which exceed the 0.33% rate limit. +
    +
    +
  • + +
  • + One MAC Address per Port — INEX expects that all traffic + coming in from a particular port will all + be configured with the same source MAC address, which INEX switches + will then dynamically associate with that port.
    +
    + If frames are seen on a + port with a source MAC address which differs from the dynamically + learned address, then the port will either shut the port down + automatically or else drop frames with the unknown MAC address. If the + port is shut down, it will automatically be re-enabled after 300 + seconds (5 minutes). INEX ports will relearn a new dynamic MAC + addresses after 5 minutes of inactivity, allowing scheduled maintenance + with relatively little interruption.
    +
    + INEX provides access to a range of + flat layer 2 networks, over which providers may run IP traffic. Because + of this, there is no reason to allow more than a single MAC address per + configured port. When multiple MAC addresses are seen on a particular + port, it generally means one of the following things: + +
      +
    • the connected router or switch has been misconfigured to forward link-local frames to + the INEX peering +
    • +
    • LAN member has accidentally set up a traffic loop + between two INEX switch ports +
    • +
    • a metro ethernet provider has + accidentally leaked bogus frames into a member's connection link +
    • +
    • the member is using faulty hardware +
    • +
    + + Because several of these possibilities + could cause catastrophic layer 2 network instability affecting all INEX + members on a particular peering LAN, and because all of them can be + obviated by using a one MAC-address per port policy, INEX aggressively + implements and polices this policy. + +
  • +
+ + +

Multicast PIM / IGMP snooping

+ +

+In order not to flood 3rd party ports with unnecessary multicast traffic, +INEX implements both PIM and IGMP snooping. This procedure ensures that +only ports which issue PIM or IGMP join or leave messages will actually +receive specific multicast traffic flows. This policy increases both +port security and link utilisation efficiency. +

+ +

Broadcast Traffic Monitoring

+ +

+For the purposes of ensuring that no unnecessary broadcast +traffic is forwarded to an INEX peering LAN, INEX monitors all peering +LANs for broadcast traffic, and archives this data. +

+ +

+This data consists purely of traffic which is broadcast to all INEX peering LAN ports. +Whenever unauthorised traffic is detected, the INEX operations team is +notified, who will normally follow the issue up with the source of the +traffic. +

+ +

+Traffic monitoring is implemented using ixpwatch, a program +designed and coded by the London Internet Exchange (LINX). +

+ +
+
+ +{include file="footer.tpl"} \ No newline at end of file diff --git a/application/views/dashboard/static/support.tpl b/application/views/dashboard/static/support.tpl new file mode 100644 index 000000000..9b6ce6c87 --- /dev/null +++ b/application/views/dashboard/static/support.tpl @@ -0,0 +1,73 @@ +{include file="header.tpl" pageTitle="IXP Manager :: Member Dashboard"} + +
+ +
+ + + + + +
+ Technical Support +
+ +

+Regular technical support at INEX is provided on an office hours basis from 09:00 to 18:00 GMT, +Monday through Friday. The normal communications channel for technical support is email to +operations@inex.ie. INEX aims for 4 hour turnaround on all +email support requests. INEX operations staff are available by telephone on +353 1 6169698. +

+ +

Emergency 24x7x365 Support

+ +

+An 24-hour support hotline is available on +353 86 8229854 or +353 86 8017669 for emergency +calls which fall outside normal office hours. This support facility is intended for emergencies +only, including: +

+ +
    +
  • INEX critical system failures causing loss of service to members
  • +
  • Emergency out-of-hours access to INEX cages for members who house routers there
  • +
+ +

+If there is no immediate answer from this phone, please leave a message and it will be +attended to immediately. +

+ + +

Support Summary

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Email:operations@inex.ie
Phone:+353 1 616 9698 or +353 1 685 4220
Hours:09:00 to 18:00 GMT, Monday to Friday
24h Emergency:+353 86 8229854 and/or +353 86 8017669
+ +
+
+ +{include file="footer.tpl"} diff --git a/application/views/dashboard/static/switches.tpl b/application/views/dashboard/static/switches.tpl new file mode 100644 index 000000000..492f2c510 --- /dev/null +++ b/application/views/dashboard/static/switches.tpl @@ -0,0 +1,130 @@ +{include file="header.tpl" pageTitle="IXP Manager :: Member Dashboard"} + +
+ +
+ + + + + +
+ Connecting Switches to INEX +
+ +

+Many members choose to connect their INEX port to a layer 2 switch and then forward their peering +traffic to a router virtual interface hosted elsewhere on their network. While connecting layer +2 switches to the INEX peering LAN is not actively discouraged, incorrect configuration can cause +serious and unexpected connectivity problems. +

+ +

+The primary concern is to ensure that only traffic from the router subinterface is presented to +the INEX port. INEX implements per port mac address counting: if more than 1 mac address is seen +on any switch port at any time, that port will automatically be disabled for a cooling off period, +and your connectivity to INEX will temporarily be lost. +

+ +

+This policy prevents two potential problems: firstly, it ensures that layer 2 traffic loops are +prevented and secondly, it ensures that no other traffic escapes to the INEX peering LAN which +shouldn't be seen there. +

+ +

+If you choose to connect your INEX port or ports to a switch, it is critically important to assign +one unique vlan for each INEX connection. If you share an INEX facing VLAN between multiple INEX +ports or share a INEX-facing VLAN with any other network, your connection may automatically be shut +down due to the security mechanisms implemented by INEX. +

+ +

+It is also important to disable all switch-generated link-local traffic on your switch port. +Typical link-local traffic will include spanning tree BPDUs, keepalive packets and discovery +protocols. This traffic is particular problematic because these packets are typically forwarded +on a port when the link is first brought up. +

+ +

+If multiple mac addresses are seen on any particular port, one of two things will happen. +Either the switch port will shut down for a cooling-down period of 5 minutes, or else the equiment +on the client-side of the switch port will have very poor quality connectivity, where arbitrary +packets will appear to be dropped without any apparent reason. +

+ +

Recommended Cisco Configuration

+ +

+By default, all Cisco switches will broadcast CDP, Spanning Tree Protocol and keepalive packets +on all ports. In addition, higher speed switches can default to using UDLD (unidirectional link +detection). On IOS-enabled switches, these packets can be disabled using the following commands: +

+ +

+

+  interface GigabitEthernetx/x
+    spanning-tree bpdufilter enable
+    no keepalive
+    no cdp enable
+    udld port disable
+    no lldp transmit
+
+

+ +

+Some older Cisco switches do not support the "spanning-tree bpdufilter enable" command. On these +units, it may be necessary to specify the following command: +

+ +

+

+spanning-tree bpduguard enable
+
+

+ +

Recommended Extreme Configuration

+ +

+By default, Extreme switches will broadcast EDP on all ports. These packets can be disabled +using the following commands: +

+ +

+

+  disable edp ports <portname>
+
+

+ +

+If Spanning Tree Protocol is enabled on a particular port, it can be disabled using: +

+ +

+

+  disable stpd <stpd_name> ports <portname>
+
+

+ +

Recommended Foundry Configuration

+ +

+On trunk ports, Foundry switches will broadcast FDP (Foundry Discovery protocol) and by +default on all ports, Foundry switches will broadcast Spanning Tree BPDUs. These packets +can be disabled on a per-interface basis using the following command: +

+ +

+

+  no link-keepalive ethernet x/y
+  interface ethernet x/y
+    no fdp enable
+    no spanning-tree
+
+

+ + +
+
+ +{include file="footer.tpl"} diff --git a/application/views/dashboard/statistics-drilldown-mini.tpl b/application/views/dashboard/statistics-drilldown-mini.tpl new file mode 100644 index 000000000..b93493396 --- /dev/null +++ b/application/views/dashboard/statistics-drilldown-mini.tpl @@ -0,0 +1,37 @@ + + + + + + + + + + + + + +
+

IXP Interface Statistics :: {$customer.name} :: {foreach from=$categories key=cname item=cvalue}{if $category eq $cvalue}{$cname}{/if}{/foreach}

+ +{foreach from=$periods key=pname item=pvalue} + +

{$pname} Graph

+ +

+ {genMrtgGraphBox + shortname=$customer->shortname + category=$category + monitorindex=$monitorindex + period=$pvalue + values=$stats.$pvalue + } +

+ + +{/foreach} + +
+ + + diff --git a/application/views/dashboard/statistics-drilldown.tpl b/application/views/dashboard/statistics-drilldown.tpl new file mode 100644 index 000000000..d98fdf68e --- /dev/null +++ b/application/views/dashboard/statistics-drilldown.tpl @@ -0,0 +1,65 @@ +{include file="header.tpl" pageTitle="IXP Manager :: Member Dashboard"} + +
+ + + + + +
+ IXP Interface Statistics :: {$customer.name} :: Drilldown ({foreach from=$categories key=cname item=cvalue}{if $category eq $cvalue}{$cname}{/if}{/foreach}) +
+ +{include file="message.tpl"} + +
+ +
+ +{if $switchname eq ''} +

Aggregate Statistics for All Ports

+{else} +

Switch: {$switchname}    -    Port: {$portname}

+{/if} + +

+

+ + + + + + +
Graph Type: + +
+
+

+ +{foreach from=$periods key=pname item=pvalue} + +

{$pname} Graph

+ +

+ {genMrtgGraphBox + shortname=$customer->shortname + category=$category + monitorindex=$monitorindex + period=$pvalue + values=$stats.$pvalue + } +

+ + +{/foreach} + +
+ +
+ +{include file="footer.tpl"} + diff --git a/application/views/dashboard/statistics-peering-graphs.tpl b/application/views/dashboard/statistics-peering-graphs.tpl new file mode 100644 index 000000000..18a08d812 --- /dev/null +++ b/application/views/dashboard/statistics-peering-graphs.tpl @@ -0,0 +1,70 @@ +{include file="header.tpl" pageTitle="IXP Manager :: Member Dashboard"} + +
+ +
+ + + + + +
+ INEX Public Traffic Statistics +
+ +

{$graphs.$graph} :: {foreach from=$categories key=cname item=cvalue}{if $category eq $cvalue}{$cname}{/if}{/foreach}

+ +{include file="message.tpl"} + +
+ +

+

+ + + + + + + + + +
Select Infrastructure: + + Category: + +
+
+

+ +{foreach from=$periods key=pname item=pvalue} + +

{$pname} Graph

+ +

+ {genMrtgGraphBox + shortname='X_Peering' + period=$pvalue + category=$category + values=$stats.$pvalue + graph=$graph + } +

+ + +{/foreach} + + +
+
+ +{include file="footer.tpl"} + diff --git a/application/views/dashboard/statistics-switch-graphs.tpl b/application/views/dashboard/statistics-switch-graphs.tpl new file mode 100644 index 000000000..73d60bc21 --- /dev/null +++ b/application/views/dashboard/statistics-switch-graphs.tpl @@ -0,0 +1,68 @@ +{include file="header.tpl" pageTitle="IXP Manager :: Member Dashboard"} + +
+ +
+ + + + + +
+ Switch Aggregate Graphs :: {$switches.$switch.name} :: {foreach from=$categories key=cname item=cvalue}{if $category eq $cvalue}{$cname}{/if}{/foreach} +
+ +{include file="message.tpl"} + +
+ +

+

+ + + + + + + + + +
Select Switch: + + Category: + +
+
+

+ +{foreach from=$periods key=pname item=pvalue} + +

{$pname} Graph

+ +

+ {genMrtgGraphBox + shortname='X_SwitchAggregate' + period=$pvalue + category=$category + values=$stats.$pvalue + graph=$switches.$switch.name + } +

+ + +{/foreach} + + +
+
+ +{include file="footer.tpl"} + diff --git a/application/views/dashboard/statistics-trunk-graphs.tpl b/application/views/dashboard/statistics-trunk-graphs.tpl new file mode 100644 index 000000000..363c1a07a --- /dev/null +++ b/application/views/dashboard/statistics-trunk-graphs.tpl @@ -0,0 +1,58 @@ +{include file="header.tpl" pageTitle="IXP Manager :: Member Dashboard"} + +
+ +
+ + + + + +
+ Trunk Graphs :: {$graphs.$graph} +
+ +{include file="message.tpl"} + +
+ +

+

+ + + + + + +
Select Trunk: + +
+
+

+ +{foreach from=$periods key=pname item=pvalue} + +

{$pname} Graph

+ +

+ {genMrtgGraphBox + shortname='X_Trunks' + period=$pvalue + values=$stats.$pvalue + graph=$graph + } +

+ + +{/foreach} + + +
+
+ +{include file="footer.tpl"} + diff --git a/application/views/dashboard/statistics.tpl b/application/views/dashboard/statistics.tpl new file mode 100644 index 000000000..db17d01a2 --- /dev/null +++ b/application/views/dashboard/statistics.tpl @@ -0,0 +1,78 @@ +{include file="header.tpl" pageTitle="IXP Manager :: Member Dashboard"} + +
+ +
+ + + + + +
+ IXP Interface Statistics :: {$customer->name} +
+ +{include file="message.tpl"} + +
+ + +

+Click on a graph below for longer term statistics or change the graph time in the drop down below. +

+ +

+

+ + + + + + + +
Graph Type: + +
+
+

+ +

Aggregate Traffic Statistics

+ +

+ + {genMrtgImgUrlTag shortname=$shortname category=$category monitorindex='aggregate'} + +

+ + +{foreach from=$connections item=connection} + + {foreach from=$connection.Physicalinterface item=pi} + +

+ Connection: + {$pi.Switchport.SwitchTable.Cabinet.Location.name} + / {$pi.Switchport.SwitchTable.name} + / {$pi.Switchport.name} ({$pi.speed}Mb/s) +

+ + +

+ + {genMrtgImgUrlTag shortname=$shortname category=$category monitorindex=$pi.monitorindex} + +

+ + {/foreach} + +{/foreach} + +
+
+ +{include file="footer.tpl"} + diff --git a/application/views/dashboard/switch-configuration.tpl b/application/views/dashboard/switch-configuration.tpl new file mode 100644 index 000000000..8453de2b6 --- /dev/null +++ b/application/views/dashboard/switch-configuration.tpl @@ -0,0 +1,120 @@ +{include file="header.tpl" pageTitle="IXP Manager :: Member Dashboard"} + +
+ +{include file="message.tpl"} + +
+ +
+ + + + + + + + +
+ + + + + + + + +
+ + + + +
+ +
+ +
+ + + + + + + + + + + + + + + +{foreach from=$swconf item=swc} + + + + + + + + + + + + + +{/foreach} + + +
MemberSwitchPortSpeedASNRoute ServerIPv4 AddressIPv6 AddressStatus
{$swc.name}{$swc.ViewSwitchDetailsByCustid.switch}{$swc.ViewSwitchDetailsByCustid.switchport}{$swc.ViewSwitchDetailsByCustid.speed}Mbps{$swc.autsys|asnumber}{if $swc.ViewSwitchDetailsByCustid.ViewVlaninterfaceDetailsByCustid.rsclient}Yes{else}No{/if}{$swc.ViewSwitchDetailsByCustid.ViewVlaninterfaceDetailsByCustid.ipv4address}{$swc.ViewSwitchDetailsByCustid.ViewVlaninterfaceDetailsByCustid.ipv6address}{$swc.ViewSwitchDetailsByCustid->getPhysicalInterfaceStatusString()}
+
+ +
+ +
+
+ +{literal} + +{/literal} + +{include file="footer.tpl"} + diff --git a/application/views/error/error-404.tpl b/application/views/error/error-404.tpl new file mode 100644 index 000000000..cb39a991d --- /dev/null +++ b/application/views/error/error-404.tpl @@ -0,0 +1,15 @@ +{include file="header.tpl"} + +
+ +

Not Found - 404

+ +{include file="message.tpl"} + +

+The requested URL was not found on this server. +

+ +
+ +{include file="footer.tpl"} \ No newline at end of file diff --git a/application/views/error/error-debug.tpl b/application/views/error/error-debug.tpl new file mode 100644 index 000000000..5fafc2293 --- /dev/null +++ b/application/views/error/error-debug.tpl @@ -0,0 +1,31 @@ +{include file="header.tpl"} + +
+ +

An error has occured

+ +{include file="message.tpl"} + +
+
File
+
{$errorException->getFile()}
+ +
Line
+
{$errorException->getLine()}
+ +
Message
+
{$errorException->getMessage()}
+ +
Code
+
{$errorException->getCode()}
+
+ +

Trace

+ +
+{$errorException->getTraceAsString()}
+
+ +
+ +{include file="footer.tpl"} \ No newline at end of file diff --git a/application/views/error/error.tpl b/application/views/error/error.tpl new file mode 100644 index 000000000..3c5651a25 --- /dev/null +++ b/application/views/error/error.tpl @@ -0,0 +1,23 @@ +{include file="header.tpl"} + +
+ +

An error has occured

+ +{include file="message.tpl"} + +{if not isset( $message )} +

+ We apologise but an unexpected server error has occured. +

+{/if} + +

+Please mail our support team with a description of what you were doing when the error +occured and we will rectify it as soon as possible. Our support team can be reached via +{mailto address="operations@inex.ie" encode="javascript" subject="Unexpected web error report"}. +

+ +
+ +{include file="footer.tpl"} \ No newline at end of file diff --git a/application/views/footer-full-width.tpl b/application/views/footer-full-width.tpl new file mode 100644 index 000000000..18e4b8dec --- /dev/null +++ b/application/views/footer-full-width.tpl @@ -0,0 +1,37 @@ + + + +
+ + +
+ +
+ + +
+ + + diff --git a/application/views/footer-tiny.tpl b/application/views/footer-tiny.tpl new file mode 100644 index 000000000..a5e6b803a --- /dev/null +++ b/application/views/footer-tiny.tpl @@ -0,0 +1,10 @@ + + + +
+ + +
+ + + diff --git a/application/views/footer.tpl b/application/views/footer.tpl new file mode 100644 index 000000000..4ed15489c --- /dev/null +++ b/application/views/footer.tpl @@ -0,0 +1,37 @@ + + + +
+ + +
+ +
+ + +
+ + + diff --git a/application/views/form/add-cancel.tpl b/application/views/form/add-cancel.tpl new file mode 100644 index 000000000..5aad4bf7e --- /dev/null +++ b/application/views/form/add-cancel.tpl @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + +
+ + + +
+ + + diff --git a/application/views/form/add-edit-cancel.tpl b/application/views/form/add-edit-cancel.tpl new file mode 100644 index 000000000..bf12be604 --- /dev/null +++ b/application/views/form/add-edit-cancel.tpl @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + +
+ + + +
+ + + diff --git a/application/views/frontend/addEdit.tpl b/application/views/frontend/addEdit.tpl new file mode 100644 index 000000000..8d65a0779 --- /dev/null +++ b/application/views/frontend/addEdit.tpl @@ -0,0 +1,23 @@ +{include file="header.tpl"} + +{assign var='_inc_file' value=$controller|cat:'/addEdit-preamble.tpl'} +{include_if_exists file=$_inc_file} + + +
+ +{if $isEdit} +

{$frontend.pageTitle} :: Edit

+{else} +

{$frontend.pageTitle} :: Add New

+{/if} + +{$form} + +
+ +{assign var='_inc_file' value=$controller|cat:'/addEdit-postamble.tpl'} +{include_if_exists file=$_inc_file} + +{include file="footer.tpl"} + diff --git a/application/views/frontend/list.tpl b/application/views/frontend/list.tpl new file mode 100644 index 000000000..9b2bf56e0 --- /dev/null +++ b/application/views/frontend/list.tpl @@ -0,0 +1,308 @@ +{include file="header.tpl" pageTitle="IXP Manager :: "|cat:$frontend.pageTitle} + + + +
+ + + + + +
+ {$frontend.pageTitle} +
+ +{include file="message.tpl"} + +
+ + +{assign var='_inc_file' value=$controller|cat:'/list-pretable.tpl'} +{include_if_exists file=$_inc_file} + + +
+ +
+ + + + + + {foreach from=$frontend.columns.displayColumns item=col} + + {/foreach} + + + + +{foreach from=$rows item=row} + + + {foreach from=$frontend.columns.displayColumns item=col} + {if isset( $frontend.columns.$col.type )} + {if $frontend.columns.$col.type eq 'hasOne'} + {counter name='id' assign='idcount'} + {assign var='model' value=$frontend.columns.$col.model} + {assign var='field' value=$frontend.columns.$col.field} + + {elseif $frontend.columns.$col.type eq 'l2HasOne'} + {assign var='l1model' value=$frontend.columns.$col.l1model} + {assign var='l2model' value=$frontend.columns.$col.l2model} + {assign var='field' value=$frontend.columns.$col.field} + + {elseif $frontend.columns.$col.type eq 'xlate'} + + {/if} + {else} + + {/if} + {/foreach} + + + +{/foreach} + + + +
{$col}{$frontend.columns.$col.label}
+ {if $row->$model->$field neq ''} + + + {$row->$model->$field} + + {/if} + + {if $row->$l1model->$l2model->$field neq ''} + + + {$row->$l1model->$l2model->$field} + + {/if} + + {assign var='index' value=$row->$col} + {$frontend.columns.$col.xlator.$index} + {$row->$col}
+ +
+ +
+ +
+
+
Loading...
+
+
+ + + +{if not isset( $frontend.disableAddNew ) or not $frontend.disableAddNew} + +

+

+ +
+

+ +{/if} + +{if $hasPostContent} + {include file=$hasPostContent} +{/if} + +
+ +{include file="footer.tpl"} diff --git a/application/views/frontend/view.tpl b/application/views/frontend/view.tpl new file mode 100644 index 000000000..e68191fb0 --- /dev/null +++ b/application/views/frontend/view.tpl @@ -0,0 +1,90 @@ +{if isset( $frontend.columns.viewPanelTitle )} + {assign var='title' value=$frontend.columns.viewPanelTitle} + {assign var='title' value=$object.$title} +{else} + {assign var='title' value=$frontend.pageTitle} +{/if} + +{if $perspective neq 'panel'} + {include file="header.tpl"} + + + + + +
+ {$frontend.pageTitle} + {if isset( $frontend.columns.viewPanelTitle )} + :: {$title} + {/if} +
+ +
+{else} +
{$title}
+
+{/if} + + + + +{foreach from=$frontend.columns.viewPanelRows item=title} + + + + +{/foreach} + + + + + + +
+ {$frontend.columns.$title.label} + + {if isset( $frontend.columns.$title.type )} + {if $frontend.columns.$title.type eq 'hasOne'} + {assign var='model' value=$frontend.columns.$title.model} + {assign var='field' value=$frontend.columns.$title.field} + {$object->$model->$field} + {elseif $frontend.columns.$title.type eq 'l2HasOne'} + {assign var='l1model' value=$frontend.columns.$title.l1model} + {assign var='l2model' value=$frontend.columns.$title.l2model} + {assign var='field' value=$frontend.columns.$title.field} + {$object->$l1model->$l2model->$field} + {elseif $frontend.columns.$title.type eq 'xlate'} + {assign var='index' value=$object->$title} + {$frontend.columns.$title.xlator.$index} + {/if} + {else} + {$object->$title} + {/if} +
+ + + + + +
+
+ +
+
+
+ +
+
+
+ +{if $perspective neq 'panel'} +
+ + {include file="footer.tpl"} +{else} +
+
INEX IXP Manager
+ Close +{/if} diff --git a/application/views/header-full-width.tpl b/application/views/header-full-width.tpl new file mode 100644 index 000000000..1f1944670 --- /dev/null +++ b/application/views/header-full-width.tpl @@ -0,0 +1,46 @@ + + + + + + + + + {$pageTitle|default:"IXP Manager"} + + + + + + + + + + + + + + + + + +
+ + + +
+ +
+ + +
+ + +
+ + + diff --git a/application/views/header-tiny.tpl b/application/views/header-tiny.tpl new file mode 100644 index 000000000..406a325ed --- /dev/null +++ b/application/views/header-tiny.tpl @@ -0,0 +1,21 @@ + + + + + + + + + {$pageTitle|default:"IXP Manager"} + + + + + + + + +
+ +
+ diff --git a/application/views/header.tpl b/application/views/header.tpl new file mode 100644 index 000000000..2557534a8 --- /dev/null +++ b/application/views/header.tpl @@ -0,0 +1,102 @@ + + + + + + + + + {$pageTitle|default:"IXP Manager"} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {if $hasIdentity and $action neq 'my-peering-matrix'} + + {/if} + + + + + +
+ + + +
+ +
+ + +
+ + +
+ + +{include file="menu.tpl"} + diff --git a/application/views/index/index.tpl b/application/views/index/index.tpl new file mode 100644 index 000000000..30cf62c19 --- /dev/null +++ b/application/views/index/index.tpl @@ -0,0 +1,27 @@ +{include file="header.tpl" pageTitle="IXP Manager"} + +
+ +{include file="message.tpl"} + +

Welcome to the INEX IXP Manager

+ +

+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin et sem nec leo vestibulum sagittis. Phasellus ante ligula, pellentesque ut consectetur vel, egestas at dui. Aliquam erat volutpat. Aenean ac ipsum sapien, a feugiat arcu. Morbi ipsum sem, pulvinar et eleifend quis, venenatis ac lacus. Quisque condimentum magna in quam imperdiet at sagittis tellus molestie. Morbi varius nisi ac nibh adipiscing luctus. Sed bibendum purus at enim iaculis eget mollis nibh luctus. Nullam vitae sapien eget magna viverra commodo. Donec accumsan mi et mauris varius aliquet. Nulla placerat vulputate metus sed volutpat. +

+

+Aenean ut quam at mi consectetur ultricies. Mauris non tellus orci, a laoreet metus. Integer at nibh magna, nec fringilla ipsum. Quisque justo odio, suscipit aliquam auctor nec, faucibus et enim. Morbi sagittis, lacus et pharetra euismod, nisl lacus ornare massa, et commodo mauris ligula vel ligula. Suspendisse potenti. Ut lobortis enim sed nisi dictum commodo vel eu quam. Nullam magna turpis, imperdiet vitae sollicitudin sit amet, sagittis non diam. Proin pulvinar neque vitae justo tempor vitae suscipit ipsum ullamcorper. Nulla ut enim sed lacus dignissim dictum auctor eget nisi. In sed nisi ac elit commodo cursus vel et arcu. Aenean venenatis ante mi, et faucibus eros. Nam ultricies, massa at vestibulum porttitor, dolor lorem pharetra enim, ac blandit tortor nisi in massa. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent viverra leo eu nibh ultrices nec dictum nunc tincidunt. Mauris posuere sapien varius purus vestibulum accumsan. +

+

+Sed faucibus porttitor orci vel fringilla. Nulla facilisi. Praesent lacinia enim ut odio lacinia in sollicitudin dui tincidunt. Cras sit amet elementum felis. Pellentesque fermentum tempus urna nec euismod. Vivamus vulputate iaculis venenatis. Sed ac justo viverra orci mollis molestie. Mauris posuere ornare ante, et ultrices lacus ornare vitae. Maecenas placerat tincidunt ante, ut porta mauris tincidunt in. Nunc tempor sollicitudin mi vitae pellentesque. In porttitor convallis ornare. Donec auctor condimentum volutpat. Nunc enim augue, faucibus et sagittis sed, ultricies nec ligula. +

+

+Sed at justo quam. Sed bibendum faucibus urna vitae sodales. Aliquam varius nisl sed nisl suscipit mollis. Duis ac sapien a libero commodo rutrum. Nam tincidunt vehicula ullamcorper. Aliquam erat volutpat. Vivamus dui nibh, gravida in sodales nec, varius id lorem. Donec a fermentum elit. Quisque non pellentesque ante. Nunc aliquet augue molestie ipsum semper sit amet blandit leo mollis. Donec nec massa eget dolor hendrerit fringilla quis nec quam. +

+

+Pellentesque euismod consequat odio, quis hendrerit libero sodales condimentum. Integer tempus leo consequat tortor fermentum id sollicitudin tellus cursus. Sed volutpat dolor lacus, quis bibendum ligula. Donec ultrices gravida vestibulum. Fusce dignissim sagittis leo, quis elementum enim placerat quis. Suspendisse non ante non sapien aliquet commodo et non justo. Aenean eleifend vestibulum rutrum. Vestibulum fermentum, libero vitae aliquam venenatis, nunc nulla molestie purus, vel luctus lorem lorem sed neque. Aenean in tellus a enim pulvinar porta vel nec neque. Pellentesque sapien felis, congue a tincidunt et, volutpat vitae nisi. Suspendisse eget nulla purus, nec varius velit. Morbi odio est, vehicula a sollicitudin in, vehicula eu leo. Mauris tellus tortor, lacinia sed sagittis ac, vulputate in urna. +

+ +
+ +{include file="footer.tpl"} \ No newline at end of file diff --git a/application/views/ipv4-address/list.tpl b/application/views/ipv4-address/list.tpl new file mode 100644 index 000000000..056959e51 --- /dev/null +++ b/application/views/ipv4-address/list.tpl @@ -0,0 +1,41 @@ +{include file="header.tpl" pageTitle="IXP Manager :: IPv4 Addresses"} + +
+ +
+ + + + + +
+ IPv4 Addresses :: {$ips.0.Vlan.name} +
+ + + + + + + + + + +{foreach from=$ips item=ip} + + + + + + + +{/foreach} + +
IPv4 AddressARPA EntryCustomer
{$ip.address}{$ip.Vlaninterface.ipv4hostname}{$ip.Vlaninterface.Virtualinterface.Cust.name}
+ + +
+ +
+ +{include file="footer.tpl"} diff --git a/application/views/ipv6-address/list.tpl b/application/views/ipv6-address/list.tpl new file mode 100644 index 000000000..a2f0f0ca8 --- /dev/null +++ b/application/views/ipv6-address/list.tpl @@ -0,0 +1,41 @@ +{include file="header.tpl" pageTitle="IXP Manager :: IPv6 Addresses"} + +
+ +
+ + + + + +
+ IPv6 Addresses :: {$ips.0.Vlan.name} +
+ + + + + + + + + + +{foreach from=$ips item=ip} + + + + + + + +{/foreach} + +
IPv6 AddressARPA EntryCustomer
{$ip.address}{$ip.Vlaninterface.ipv4hostname}{$ip.Vlaninterface.Virtualinterface.Cust.name}
+ + +
+ +
+ +{include file="footer.tpl"} diff --git a/application/views/logical-circuit/addEdit.tpl b/application/views/logical-circuit/addEdit.tpl new file mode 100644 index 000000000..186150ac3 --- /dev/null +++ b/application/views/logical-circuit/addEdit.tpl @@ -0,0 +1,19 @@ +{include file="header.tpl"} + + + + + + +
+ {$frontend.pageTitle} :: {if $isEdit}Edit{else}Add New{/if} +
+ +
+ +{$form} + +
+ +{include file="footer.tpl"} + diff --git a/application/views/logical-circuit/form/add-edit.tpl b/application/views/logical-circuit/form/add-edit.tpl new file mode 100644 index 000000000..6c2d11e6f --- /dev/null +++ b/application/views/logical-circuit/form/add-edit.tpl @@ -0,0 +1,218 @@ + +
+ +{if $element->isErrors()} +
+
+
    + {foreach from=$element->getMessages() item=elements} + {foreach from=$elements item=messages} + {foreach from=$messages item=msg} +
  • {$msg}
  • + {/foreach} + {/foreach} + {/foreach} +
+
+
+{/if} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ {$element->our_ref->getLabel()}: + + {$element->our_ref} +
+ {$element->installed->getLabel()}: + + {$element->installed} +
+ {$element->removed->getLabel()}: + + {$element->removed} +
+ {$element->custid->getLabel()}: + + {$element->custid} +
+ {$element->notes->getLabel()}: + + {$element->notes} +
+ + + +

Physical Segments

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Our Reference: + + + + Colo / Other Reference: + + +
+ Installed: + + + + Removed: + + +
+ A End - Type: + + + + A End - Port: + + +
+ B End - Type: + + + + B End - Port: + + +
+ + + + + + + + + + + + diff --git a/application/views/meeting-item/addEdit-preamble.tpl b/application/views/meeting-item/addEdit-preamble.tpl new file mode 100644 index 000000000..a41ac4dc4 --- /dev/null +++ b/application/views/meeting-item/addEdit-preamble.tpl @@ -0,0 +1,10 @@ + + + + + diff --git a/application/views/meeting-item/list-pretable.tpl b/application/views/meeting-item/list-pretable.tpl new file mode 100644 index 000000000..55bde152b --- /dev/null +++ b/application/views/meeting-item/list-pretable.tpl @@ -0,0 +1,24 @@ + + + +
+
+

+
+ Meeting:  + +   + + +

+
+
+ diff --git a/application/views/meeting/addEdit-preamble.tpl b/application/views/meeting/addEdit-preamble.tpl new file mode 100644 index 000000000..7b0ef9024 --- /dev/null +++ b/application/views/meeting/addEdit-preamble.tpl @@ -0,0 +1,17 @@ + + + + + diff --git a/application/views/meeting/compose.tpl b/application/views/meeting/compose.tpl new file mode 100644 index 000000000..15a838803 --- /dev/null +++ b/application/views/meeting/compose.tpl @@ -0,0 +1,112 @@ +{include file="header.tpl" pageTitle="IXP Manager :: Member Dashboard"} + +
+ +
+ + {$element->cancel}      {$element->commit} +
+ + + +
INEX Members' Meetings :: Compose Mail Notification
+ +{include file="message.tpl"} + +
+ +

Composing Email for Members' Meeting of {$meeting.date|strtotime|date_format}

+ +

+The form below allows you to enter some pre-amble to the email detailing +the members' meeting. If you are unsure of how this works, enter some text and send the mail +which, by default, only sends it to yourself. +

+ +

+When you're happy with the result, you can send it to members@inex.ie. +

+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ From:   + + +
+ To:   + + +
+ BCC:   + + +
+ Subject:   + + +
+ +
+ +
+ + + +
+ +
+ + + + + + + +
+ + +{include file="footer.tpl"} diff --git a/application/views/meeting/core.tpl b/application/views/meeting/core.tpl new file mode 100644 index 000000000..e092c77e8 --- /dev/null +++ b/application/views/meeting/core.tpl @@ -0,0 +1,172 @@ + +
+ +{foreach from=$entries item=e} + + +
+ +
+

{$e.title} – {$e.date|date_format:"%A, %B %e, %Y"}

+

+ In {if $e.venue_url neq ''}{$e.venue}{else}{$e.venue}{/if} at {$e.time|date_format:"%H:%M"} + {if not $simple and $e.venue_url neq ''} +    + [LINK] + + {/if} +

+
+ +
{$e.before_text}
+ +
+ +
+ + {assign var='inOtherContent' value=0} + + {foreach from=$e.MeetingItem key=id item=mi} + + {if $mi.other_content and not $inOtherContent} +
+ +

+ Other meeting content also includes: +

+ +
+ + {assign var='inOtherContent' value=1} + {/if} + +
+ +
+ +
+ {if not $simple} + {if $mi.presentation neq ''} + + [VIDEO] + + {/if} + {if $mi.video_url neq ''} + + [VIDEO] + + {/if} + {/if} +
+ +

+ {$mi.title} – + + {if not $simple and $mi.email neq ''} + {mailto address=$mi.email encode='javascript' text=$mi.name} + {else} + {$mi.name} + {/if} +

+ +

+ {if $mi.role neq ''}{$mi.role}, {/if} + {if $mi.company_url neq ''} + {$mi.company} + {else} + {$mi.company} + {/if} +

+
+ +
+ +
+ {$mi.summary} +
+ + {/foreach} + +
+ +
+ +
{$e.after_text}
+ +{if not $simple and $smarty.now < strtotime( $e.date ) and $user.privs eq 1} +
+ + {if $user->getPreference( 'meeting.attending.'|cat:$e.id ) eq 'ATTENDING' + or $user->getPreference( 'meeting.attending.'|cat:$e.id ) eq 'NOT_ATTENDING'} +

+ You have already RSVP'd for this meeting and told us that you will + {if $user->getPreference( 'meeting.attending.'|cat:$e.id ) eq 'NOT_ATTENDING'}not{/if} + be attending. Please email + {mailto text=$config.meeting.rsvp_to_name address=$config.meeting.rsvp_to_email} + directly to change this. +

+ {else} +

+ Please RSVP for this meeting: + + +

+ {/if} +
+ + + + +
+{/if} + +{/foreach} + +
diff --git a/application/views/meeting/customContextMenu.js.tpl b/application/views/meeting/customContextMenu.js.tpl new file mode 100644 index 000000000..9dbce2972 --- /dev/null +++ b/application/views/meeting/customContextMenu.js.tpl @@ -0,0 +1,70 @@ + +{literal} + +var onContextMenuClick = function( p_sType, p_aArgs, p_myDataTable ) +{ + var task = p_aArgs[1]; + if( task ) { + // Extract which TR element triggered the context menu + var elRow = this.contextEventTarget; + elRow = p_myDataTable.getTrEl( elRow ); + + if( elRow ) + { + var oRecord = p_myDataTable.getRecord(elRow); + + switch( task.groupIndex ) + { + case 0: + switch( task.index ) + { + case 0: + window.location.assign( {/literal}"{genUrl controller=$controller action='edit'}{literal}/id/" + oRecord.getData( 'id' ) ); + break; + + case 1: + if( confirm("Are you sure you want to delete this meeting entry and all related presentations?" ) ) + window.location.assign( {/literal}"{genUrl controller=$controller action='delete'}{literal}/id/" + oRecord.getData( 'id' ) ); + break; + } + break; + + case 1: + switch( task.index ) + { + case 0: // see presentations for this meeting + window.location.assign( {/literal}"{genUrl controller='meeting-item' action='list' meeting_id=''}{literal}" + oRecord.getData( 'id' ) ); + break; + } + break; + + case 2: + switch( task.index ) + { + case 0: // compose for this meeting + window.location.assign( {/literal}"{genUrl controller='meeting' action='compose' id=''}{literal}" + oRecord.getData( 'id' ) ); + break; + } + break; + } + } + } +}; + +var myContextMenu = new YAHOO.widget.ContextMenu( "mycontextmenu", + {trigger:this.myDataTable.getTbodyEl()} +); + +myContextMenu.addItem("Edit", 0 ); +myContextMenu.addItem("Delete", 0 ); + +myContextMenu.addItem("See presentations for this meeting...", 1 ); + +myContextMenu.addItem("Compose mail for this meeting...", 2 ); + +myContextMenu.render("myDatatable"); +myContextMenu.clickEvent.subscribe( onContextMenuClick, this.myDataTable ); + + + +{/literal} diff --git a/application/views/meeting/email/meeting.tpl b/application/views/meeting/email/meeting.tpl new file mode 100644 index 000000000..e1600c74a --- /dev/null +++ b/application/views/meeting/email/meeting.tpl @@ -0,0 +1,216 @@ + + + + + + + + + + + + + +
+ +
+ +
{$body}
+ +
+

{$meeting.title} – {$meeting.date|date_format:"%A, %B %e, %Y"}

+

+ In {$meeting.venue} at {$meeting.time|date_format:"%H:%M"} +

+
+ +
{$meeting.before_text}
+ +
+ +
+ + {assign var='inOtherContent' value=0} + + {foreach from=$meeting.MeetingItem key=id item=mi} + + {if $mi.other_content and not $inOtherContent} +
+ +

+ Other meeting content also includes: +

+ +
+ + {assign var='inOtherContent' value=1} + {/if} + +
+ +
+ +
+
+ +

+ {$mi.title} – + + {if $mi.email neq ''} + {mailto address=$mi.email encode='none' text=$mi.name} + {else} + {$mi.name} + {/if} +

+ +

+ {if $mi.role neq ''}{$mi.role}, {/if} + {if $mi.company_url neq ''} + {$mi.company} + {else} + {$mi.company} + {/if} +

+
+ +
+ +
+ {$mi.summary} +
+ + {/foreach} + +
+ +
+ +
{$meeting.after_text}
+ + +
+
+ + + diff --git a/application/views/meeting/meetings.tpl b/application/views/meeting/meetings.tpl new file mode 100644 index 000000000..c1661c17c --- /dev/null +++ b/application/views/meeting/meetings.tpl @@ -0,0 +1,37 @@ +{include file="header.tpl" pageTitle="IXP Manager :: Member Dashboard"} + +
+ + + + + +
INEX Members' Meetings
+ +
+

+

+ Jump to:  + + +
+

+
+ + +{include file='meeting/core.tpl'} + + +
+ +{include file="footer.tpl"} diff --git a/application/views/meeting/simple.tpl b/application/views/meeting/simple.tpl new file mode 100644 index 000000000..ed2b530f7 --- /dev/null +++ b/application/views/meeting/simple.tpl @@ -0,0 +1,134 @@ + + + +

+ + This is public list of INEX Members' Meetings. INEX members should log into the IXP Manager + where they can download presentations, view recorded presentations and access speaker contact + details. + +

+ +{include file='meeting/core.tpl'} + diff --git a/application/views/meeting/simple2.tpl b/application/views/meeting/simple2.tpl new file mode 100644 index 000000000..91a33c9f1 --- /dev/null +++ b/application/views/meeting/simple2.tpl @@ -0,0 +1,68 @@ +

+ + This is public list of INEX Members' Meetings. INEX members should log into the IXP Manager + where they can download presentations and view recorded presentations that were requested + to not be made public as well as access speaker contact details. + +

+ + + +{foreach from=$entries item=e} + +

{$e.title} – {$e.date|date_format:"%A, %B %e, %Y"}

+ +

In {if $e.venue_url neq ''}{$e.venue}{else}{$e.venue}{/if} at {$e.time|date_format:"%H:%M"}

+ +
{$e.before_text}
+ +
+ + {assign var='inOtherContent' value=0} + + {foreach from=$e.MeetingItem key=id item=mi} + + {if $mi.other_content and not $inOtherContent} +
+ +

+ Other meeting content also includes: +

+ +
+ + {assign var='inOtherContent' value=1} + {/if} + +
+ +

+ {$mi.name}: {if $mi.role neq ''}{$mi.role}, {/if}{if $mi.company_url neq ''}{$mi.company}{else}{$mi.company}{/if} +

+
+ +
+ {$mi.title} + + {if $mi.presentation neq ''} +     [PRES] + {/if} + {if $mi.video_url neq ''} +     [VIDEO] + {/if} + +
+ + + {if $mi.summary neq ''} {$mi.summary}{/if} + + + {/foreach} + + + + +
{$e.after_text}
+ +{/foreach} + diff --git a/application/views/menu.tpl b/application/views/menu.tpl new file mode 100644 index 000000000..345d5ddbb --- /dev/null +++ b/application/views/menu.tpl @@ -0,0 +1,303 @@ + + + + + + + +
+ +
+ diff --git a/application/views/message.tpl b/application/views/message.tpl new file mode 100644 index 000000000..ab1841ce9 --- /dev/null +++ b/application/views/message.tpl @@ -0,0 +1,47 @@ +{if isset( $message )} + +
+
+ {$message->getMessage()} +
+
+
+ +
+
+
+
+
+ + + +{/if} + diff --git a/application/views/patch-panel/addEdit.tpl b/application/views/patch-panel/addEdit.tpl new file mode 100644 index 000000000..0ce3e62f4 --- /dev/null +++ b/application/views/patch-panel/addEdit.tpl @@ -0,0 +1,37 @@ +{include file="header.tpl"} + +
+ + + + + +
+ {if $isEdit} +

{$frontend.pageTitle} :: Edit

+ {else} +

{$frontend.pageTitle} :: Add New

+ {/if} +
+ + +{include file="message.tpl"} + +
+ + + +

{if $isEdit}Edit{else}New{/if} Patch Panel Details

+ +{if $isEdit} +Note: If you edit the co-location reference then all of the ports of this +patch panel will also have their co-location reference updated also. +{/if} + +{$form} + + +
+ +{include file="footer.tpl"} + diff --git a/application/views/patch-panel/edit-ports.tpl b/application/views/patch-panel/edit-ports.tpl new file mode 100644 index 000000000..e6d5ca413 --- /dev/null +++ b/application/views/patch-panel/edit-ports.tpl @@ -0,0 +1,25 @@ +{include file="header.tpl"} + +
+ + + + + +
+

{$frontend.pageTitle} :: Edit Ports for New Patch Panel

+
+ + +{include file="message.tpl"} + +
+ + +{$form} + + +
+ +{include file="footer.tpl"} + diff --git a/application/views/patch-panel/form/autogen.tpl b/application/views/patch-panel/form/autogen.tpl new file mode 100644 index 000000000..6db7875ba --- /dev/null +++ b/application/views/patch-panel/form/autogen.tpl @@ -0,0 +1,89 @@ + + +{literal} + +{/literal} + +

+

+{$element->cb_autogen} {$element->cb_autogen->getLabel()} +

+ + + + diff --git a/application/views/patch-panel/form/patch-panel-port.tpl b/application/views/patch-panel/form/patch-panel-port.tpl new file mode 100644 index 000000000..689a653d0 --- /dev/null +++ b/application/views/patch-panel/form/patch-panel-port.tpl @@ -0,0 +1,64 @@ + +{assign var='side' value=$element->side->getValue()} +

Port {$element->port->getValue()} ({if $side eq 1}Back{else}Front{/if})

+ +{$element->port} +{$element->side} + + +{if $element->isErrors()} +
+
+
    + {foreach from=$element->getMessages() item=elements} + {foreach from=$elements item=messages} + {foreach from=$messages item=msg} +
  • {$msg}
  • + {/foreach} + {/foreach} + {/foreach} +
+
+
+{/if} + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ {$element->type->getLabel()}: + + {$element->type} +
+ {$element->cable_type->getLabel()}: + + {$element->cable_type} +
+ {$element->colo_ref->getLabel()}: + + {$element->colo_ref} +
+ diff --git a/application/views/patch-panel/form/patch-panel.tpl b/application/views/patch-panel/form/patch-panel.tpl new file mode 100644 index 000000000..9f993614d --- /dev/null +++ b/application/views/patch-panel/form/patch-panel.tpl @@ -0,0 +1,103 @@ + + +{if $element->isErrors()} +
+
+
    + {foreach from=$element->getMessages() item=elements} + {foreach from=$elements item=messages} + {foreach from=$messages item=msg} +
  • {$msg}
  • + {/foreach} + {/foreach} + {/foreach} +
+
+
+{/if} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Name: + + {$element->name} +
+ Cabinet: + + {$element->cabinetid} +
+ Colocation Reference: + + {$element->colo_ref} +
+ Cable Type: + + {$element->cable_type} +
+ Interface Type: + + {$element->interface_type} +
+ Allow Duplex: + + {$element->allow_duplex} +
+ Notes: + + {$element->notes} +
+ diff --git a/application/views/peering-matrix/index.tpl b/application/views/peering-matrix/index.tpl new file mode 100644 index 000000000..82a63659e --- /dev/null +++ b/application/views/peering-matrix/index.tpl @@ -0,0 +1,134 @@ + + + +

+Total potential sessions: {$potential}. +Active peering sessions: {$active}. +{assign var=active value=`$active*100`} +Percentage active peering sessions: {$active/$potential|string_format:'%d'}% +

+ + + + + + + + + {foreach from=$matrix key=x_as item=peers} + + + + {/foreach} + + + + +{assign var=outer value=0} + +{foreach from=$matrix key=x_as item=peers} + + + + + + + + {assign var=inner value=0} + + {foreach from=$peers item=y} + + + + {assign var=inner value=`$inner+1`} + + {* for the last cell of the last row, we add a empty cell *} + {if $outer eq $peers|@count and $inner eq $peers|@count} + + {/if} + {/foreach} + + + +{assign var=outer value=`$outer+1`} + +{/foreach} + +
   + {assign var=asn value=$x_as|string_format:'% 6s'} + {php} + $asn = $this->get_template_vars( 'asn' ); + for( $i = 0; $i < 6; $i++ ) + echo substr( $asn, $i, 1 ) . '
'; + {/php} +
{$peers[0].X_Cust.name}  {$peers[0].x_as}  + {if $outer eq $inner} + {* we're at the intersection of our AS on the x and y graph - stick in an empter cell *} + + {/if} + + {if $y.peering_status eq 'YES'} + Y + {else if $row.peering_status eq 'NO'} + N + {/if} +
+ diff --git a/application/views/profile/index.tpl b/application/views/profile/index.tpl new file mode 100644 index 000000000..ca4bfd7b4 --- /dev/null +++ b/application/views/profile/index.tpl @@ -0,0 +1,35 @@ +{include file="header.tpl" pageTitle="IXP Manager :: "|cat:$frontend.pageTitle} + +
+ +
+ + + + + +
+ User Profile +
+ +{include file="message.tpl"} + +
+ + +

+This is your INEX user profile where you can change you contact preferences and password. +

+ +

+Please note that the mobile number is used to send you password reminders and should contain the country code +in the format: 353861234567. + +{$profileForm} + +{$passwordForm} + +

+
+ +{include file="footer.tpl"} \ No newline at end of file diff --git a/application/views/provision/interface/list.tpl b/application/views/provision/interface/list.tpl new file mode 100644 index 000000000..d54ba5953 --- /dev/null +++ b/application/views/provision/interface/list.tpl @@ -0,0 +1,156 @@ +{include file="header.tpl" pageTitle="IXP Manager :: Provision New Interface"} + +
+ +
+ + + + + +
Provisioning: New Interfaces
+ +{include file="message.tpl"} + +
+ + + +
+
+ + + + + + + + + + + + + + + {foreach from=$outstanding item=o} + + + + + + + {/foreach} + +
IDCustomerCreated ByStarted AtProgress
{$o.id}{$o.Cust.name}{$o.CreatedBy.username}{$o.created_at|strtotime|date_format:"%Y-%m-%d %H:%m:%d"} + {$o->stepsComplete()}
+
+
+ + + + +
+
+ +
+
+ + + + + + + +
+
+ + + + +{include file="footer.tpl"} diff --git a/application/views/provision/interface/mail/interface-details.tpl b/application/views/provision/interface/mail/interface-details.tpl new file mode 100644 index 000000000..74dd95369 --- /dev/null +++ b/application/views/provision/interface/mail/interface-details.tpl @@ -0,0 +1,219 @@ + +Dear INEX Member, + +Please take some time to read this email -- it contains important information concerning your newly provisioning INEX port. + + +Interface Details +================== + +We have provisioned the following new interface for your use. + +INEX operates multiple peering LANs (e.g. our primary LANs, dedicated VoIP peering LANs, etc). Unless you have been advised otherwise, you have been assigned an untagged port on the primary peering LAN(s). Please contact us for more information on the other LANs. + +We have assigned the following IP addresses and switch-ports for your exclusive use: + +Switch Port: {$progress.Physicalinterface.Switchport.SwitchTable.name}.inex.ie, {$progress.Physicalinterface.Switchport.name} +Speed: {$progress.Physicalinterface.speed}Mbps +Duplex: {$progress.Physicalinterface.duplex} +Location: {$progress.Physicalinterface.Switchport.SwitchTable.Cabinet.Location.name} +Colo Cabinet ID: {$progress.Physicalinterface.Switchport.SwitchTable.Cabinet.name} + + +{assign var='vlanid' value=$progress.Vlaninterface.vlanid} +{$progress.Vlaninterface.Vlan.name}: + +IPv4 Address: {$progress.Vlaninterface.Ipv4address.address}/{$networkInfo.$vlanid.4.masklen} +IPv4 Hostname: {$progress.Vlaninterface.ipv4hostname} +IPv6 Address: {if $progress.Vlaninterface.Ipv6address.address}{$progress.Vlaninterface.Ipv6address.address}/{$networkInfo.$vlanid.6.masklen}{else}(please contact us to enable IPv6){/if} + +IPv6 Hostname: {$progress.Vlaninterface.ipv6hostname} + + + +Your Input +---------- + +As a matter of policy, INEX hard-wires all switch ports to a specific speed and duplex setting. Should you require a different duplex setting to the one specified above, or should you require your reverse DNS hostnames changed for either IPv4 or IPv6, please contact operations@inex.ie + + +Route Servers +============= + +INEX operates a Route Server cluster; this facility allows all members who connect to the cluster to see all routing prefixes sent to the cluster by any other member. I.e. it provides an quick, safe and easy way to peer with any other route server user. + +The INEX route server cluster is aimed at: + +o small to medium sized members of the exchange who don't have the time or resources to aggressively manage their peering relationships. + +o larger members of the exchange who have an open peering policy, but where it may not be worth their while managing peering relationships with smaller members of the exchange. + +If you don't have any good reasons not to use the route server cluster, you should probably use it. + +The service is designed to be reliable. It operates on two physical servers, each located in a different data centre. The service is available on all INEX networks (public peering lans #1 and #2, and voip peering lans #1 and #2), on both ipv4 and ipv6. The route servers also filter inbound routing prefixes based on published RIPE IRR policies, which means that using the route servers for peering is generally much safer than peering directly with other members. + + +Your Input +---------- + +If you wish to use the INEX route server system, please email operations@inex.ie. + + +----------- + + +External Connections to the INEX Infrastructure +=============================================== + +Many INEX members already have a presence in the co-location facilities which house INEX points of presence. If you are such a member and wish to keep your routing equipment in your own cabinet space, INEX is happy to accept cross-connects from your cabinet to the INEX cage. Please note that all connections into the INEX cage are paid for directly by INEX members, not by INEX itself. + +INEX considers metro ethernet connections as standard external connections. When ordering your metro ethernet circuit, please specify the correct INEX termination point to your provider. + +Cross-connect cabinet termination points are provided in the "Connection Details" section above. + + +Your Input +---------- + +If you want to connect to INEX using a cross-connect, you must order it directly from your co-lo / metro ethernet provider and inform INEX Operations immediately. Please ensure that you include full details on the connection type and termination cabinet when ordering the cross-connect from your co-lo provider. + +---------- + + +Peering +======= + +INEX facilitates peering between its members, but other than the minimum current peering requirements (4 members or 10%, whichever is larger) does not mandate peering with any particular member apart from INEX itself. + +You will find a full list of members on the INEX members web page, along with the correct email addresses to use for peering requests. + +When emailing other INEX members about peering requests, please include all technical details relevant to the peering session, including your IP address, your AS number, and an estimate of the number of prefixes you intend to announce to that candidate peer. Several members require written legal contracts to be signed as a part of their peering procedures. If you require a written contract, please specify this on your peering request; similarly, it may be often useful to indicate your willingness (or otherwise) to sign legal contracts when approaching other members about peering. + +Please note that INEX members are required to reply to peering requests within a reasonable time frame. If your emails to other INEX members about peering go unanswered, please let us know and we will do what we can. + +INEX requires that all new members peer and share routes with the INEX route collectors for administrative purposes. We would be obliged if you could set up your router(s) and make the necessary arrangements for this as soon as possible. + +INEX's details are: + +remote-as: AS2128 +AS Macro: AS-INEXIE + +Peering VLAN #1 + IPv4 address: 193.242.111.126 + IPv4 session MD5: {$progress.Vlaninterface.ipv4bgpmd5secret} + + IPv6 address: 2001:7F8:18::F:0:1 + IPv4 session MD5: {$progress.Vlaninterface.ipv6bgpmd5secret} + +Peering VLAN #2 + IPv4 address : 194.88.240.126 + IPv4 session MD5: {$progress.Vlaninterface.ipv4bgpmd5secret} + + IPv6 address: 2001:7F8:18:12::F:0:1 + IPv4 session MD5: {$progress.Vlaninterface.ipv6bgpmd5secret} + + +INEX currently announces two prefixes over IPv4 and one prefix over IPv6 from AS2128: + + 193.242.111.0/24 + 194.88.240.0/23 + + 2001:7F8:18::/48 + + +NOC Details +=========== + +For the convenience of its members, INEX maintains a list of NOC and peering contact details for its members. These details are held on a private INEX database, and are available only from the following URL: + + https://www.inex.ie/members/memberlist + +This area of the INEX website is password protected and SSL secured. Passwords are only provided to current INEX members. This information is considered private and will not be passed on to other third parties by INEX. + +We would appreciate if you could take the time to ensure that the following details we hold on file are correct: + +Your Input +---------- + +Member name: {$progress.Cust.name} +Primary corporate web page: {$progress.Cust.corpwww} +Peering Email Address: {$progress.Cust.peeringemail} +NOC Phone number: {$progress.Cust.nocphone} +NOC Fax number: {$progress.Cust.nocfax} +General NOC email address: {$progress.Cust.nocemail} +NOC Hours: {$progress.Cust.nochours} +Dedicated NOC web page: {$progress.Cust.nocwww} +AS Number: {$progress.Cust.autsys} + +---------- + + +Router Configuration +==================== + +If you are new to internet exchanges, we would ask you to note that all members are expected to adhere to the technical requirements of the INEX MoU. In particular, we would draw your attention to section 2 of these requirements which outline what types of traffic may and may not be forwarded to the INEX peering LAN. + +For Cisco IOS based routers, we recommend the following interface configuration commands: + + no ip redirects + no ip proxy-arp + no ip directed-broadcast + no mop enabled + no cdp enable + udld port disable + +If you intend to use IPv6 with a Cisco IOS based router, please also consider the following interface commands: + + no ipv6 redirects + ipv6 nd suppress-ra + + +Connecting Switches to INEX +=========================== + +Many members choose to connect their INEX port to a layer 2 switch and then forward their peering traffic to a router virtual interface hosted elsewhere on their network. While connecting layer 2 switches to the INEX peering LAN is not actively discouraged, incorrect configuration can cause serious and unexpected connectivity problems. + +The primary concern is to ensure that only traffic from the router subinterface is presented to the INEX port. INEX implements per port mac address counting: if more than 1 mac address is seen on any switch port at any time, that port will automatically be disabled for a cooling off period, and your connectivity to INEX will temporarily be lost. + +This policy prevents two potential problems: firstly, it ensures that layer 2 traffic loops are prevented and secondly, it ensures that no other traffic escapes to the INEX peering LAN which shouldn't be seen there. + +If you choose to connect your INEX port or ports to a switch, it is critically important to assign one unique vlan for each INEX connection. If you share an INEX facing VLAN between multiple INEX ports or share a INEX-facing VLAN with any other network, your connection will automatically be shut down due to the security mechanisms implemented by INEX. + +Please also note that by default, several switch models send link-local traffic to all ports. On Cisco switches, this can be disabled using the following interface commands: + +interface GigabitEthernetx/x + spanning-tree bpdufilter enable + no keepalive + no cdp enable + udld port disable + +For further details please see the following URL: + + https://www.inex.ie/members/connectingswitches + +Note also that as we hard code speed and duplex settings, if you are connecting at 100Mbps and connecting from a switch, you must ensure to use a cross over cable. + +Monitoring +========== + +By default, INEX actively monitors all ports on its peering LANs using ICMP PING for both connectivity and host latency. This monitoring causes about 25 PING packets to be sent to each IP address on the peering LAN every 5 minutes. If you do not wish for your router to be actively monitored, please mail operations@inex.ie and we can disable this facility. + + + +PeeringDB +========= + +PeeringDB ( http://www.peeringdb.com/ ) facilitates the exchange of information related to peering. Specifically, what networks are peering, where they are peering, and if they are likely to peer with you. + +More and more organisations are using PeeringDB to make decisions on where they should open POPs, provision new links, etc. + +We would very much appreciate it if you could mark your new INEX peering under the "Public Peering Locations" section of your PeeringDB page. We are listed as 'INEX'. If you do not yet have a PeeringDB account, we would suggest that you register for one on their site. + + +Welcome to INEX, Ireland's Internet hub. + + +INEX Operations +INEX - Internet Neutral Exchange Association + + diff --git a/application/views/provision/interface/overview.tpl b/application/views/provision/interface/overview.tpl new file mode 100644 index 000000000..a2cec17d2 --- /dev/null +++ b/application/views/provision/interface/overview.tpl @@ -0,0 +1,218 @@ +{include file="header.tpl" pageTitle="IXP Manager :: Provision New Interface"} + +
+ +
+ + + + + +
Provisioning: New Interface
+ + +{include file="message.tpl"} + +
+ +
+ +{if $progress.cust_id neq 0} +

New Interface for {$progress.Cust.name}

+ +

+ Started by {$progress.CreatedBy.username} on {$progress.created_at}. +

+{/if} + +
+ + {if $progress.cust_id neq 0} + [DONE] + {else} + [PENDING] + {/if} + + 1. Select Customer + + {if $progress.cust_id neq 0} +

Provisioning new interface for {$progress.Cust.name}.

+ {else} +
+
+ + +
+ +

+ Select a customer for whom you wish to provision a new interface.

+

+ {/if} +
+ + + +
+ + {if $progress.virtualinterface_id neq 0} + [DONE] + {else} + [PENDING] + {/if} + + 2. Create a Virtual Interface + + {if $progress.cust_id neq 0} + {if $progress.virtualinterface_id neq 0} +
+ + {else} + + + {/if} + + + +
+ {/if} + +

+ Create a virtual interface for the customer to which we will later add physical interface(s) and VLAN interface(s). +

+ +
+ + + +
+ + {if $progress.physicalinterface_id neq 0} + [DONE] + {else} + [PENDING] + {/if} + + 3. Create / Add a Physical Interface + + {if $progress.virtualinterface_id neq 0} + {if $progress.physicalinterface_id neq 0} +
+ + + {else} + + + {/if} + + + + +
+ {/if} + +

+ Create a phsyical interface for the customer. +

+ +
+ + + +
+ + {if $progress.vlaninterface_id neq 0} + [DONE] + {else} + [PENDING] + {/if} + + 4. Create / Add a VLAN Interface + + {if $progress.virtualinterface_id neq 0} + {if $progress.vlaninterface_id neq 0} +
+ + {else} + + + {/if} + + + + +
+ {/if} + +

+ Create a phsyical interface for the customer. +

+ +
+ + + +
+ + {if $progress.mail_sent neq 0} + [DONE] + {else} + [PENDING] + {/if} + + 5. Send Interface Details Mail + + {if $progress.physicalinterface_id neq 0 and $progress.vlaninterface_id neq 0} +
+ {if $progress.mail_sent neq 0} + + {else} + + {/if} +
+ {/if} + +

+ Send interface details email including cross connect information to the member. +

+ +
+ + + +
+ + {if $progress.switch_config neq 0} + [DONE] + {else} + [PENDING] + {/if} + + 6. Configure the Switch Port for Quarantine + + {if $progress.physicalinterface_id neq 0 and $progress.vlaninterface_id neq 0} +
+ +
+ {/if} + +

+ Generate the configuration necessary to set up the port on the quarantine LAN. +

+ +
+ + + + + + + +
+
+ +{include file="footer.tpl"} diff --git a/application/views/provision/interface/switch-config.tpl b/application/views/provision/interface/switch-config.tpl new file mode 100644 index 000000000..3dede6370 --- /dev/null +++ b/application/views/provision/interface/switch-config.tpl @@ -0,0 +1,123 @@ +{include file="header.tpl" pageTitle="IXP Manager :: Provision New Interface"} + +
+ +
+ + + + + +
Provisioning: New Interface
+ + +{include file="message.tpl"} + +
+ +
+ +{if $progress.cust_id neq 0} +

New Interface for {$progress.Cust.name}

+ +

+ Started by {$progress.CreatedBy.username} on {$progress.created_at}. +

+{/if} + +

+Please apply the following configuration to: {$progress.Physicalinterface.Switchport.SwitchTable.name}.inex.ie +

+ +{* is this for a Cisco or for a Brocade? *} + +{if $progress.Physicalinterface.Switchport.SwitchTable.model eq 'TurboIron TI24X'} + +
+conf t
+
+vlan 30
+  tagged {$progress.Physicalinterface.Switchport.name|strtolower}
+  exit
+
+interface {$progress.Physicalinterface.Switchport.name|strtolower}
+ port-name {$progress.Cust.name}
+ no fdp enable
+ speed-duplex {if $progress.Physicalinterface.speed <= 100}{$progress.Physicalinterface.speed}-{$progress.Physicalinterface.duplex}{else}{$progress.Physicalinterface.speed}{/if}
+ no spanning-tree
+ sflow-forwarding
+ exit
+
+exit
+
+ +{elseif $progress.Physicalinterface.Switchport.SwitchTable.model eq 'FESX624+2XG'} + +
+conf t
+
+vlan 30
+  tagged {$progress.Physicalinterface.Switchport.name|strtolower}
+  exit
+
+interface {$progress.Physicalinterface.Switchport.name|strtolower}
+  port-name {$progress.Cust.name}
+  no fdp enable
+  speed-duplex {if $progress.Physicalinterface.speed <= 100}{$progress.Physicalinterface.speed}-{$progress.Physicalinterface.duplex}{else}{$progress.Physicalinterface.speed}-{$progress.Physicalinterface.duplex}-master{/if}
+  no spanning-tree
+  broadcast limit 65536
+  multicast limit
+  unknown-unicast limit 65536
+  sflow-forwarding
+  port security
+    enable
+    violation restrict
+    age 5
+    exit
+  exit
+exit
+
+ +{elseif $progress.Physicalinterface.Switchport.SwitchTable.model eq 'Catalyst 6506'} + +
+conf t
+interface {$progress.Physicalinterface.Switchport.name}
+ description {$progress.Cust.name}
+ switchport
+ switchport access vlan 30
+ switchport mode access
+ switchport block unicast
+ switchport port-security
+ switchport port-security aging time 5
+ logging event link-status
+ speed {$progress.Physicalinterface.speed}
+ duplex {$progress.Physicalinterface.duplex}
+ storm-control broadcast level 0.34
+ storm-control multicast level 0.34
+ no cdp enable
+ spanning-tree portfast edge
+ spanning-tree bpdufilter enable
+ exit
+exit
+
+{else} + Error: Unsupported switch type: {$progress.Physicalinterface.Switchport.SwitchTable.Vendor.name} +{/if} + + + + +
+
+ +
+
+ + +
+ +
+ + +{include file="footer.tpl"} \ No newline at end of file diff --git a/application/views/sec-viewer/read.tpl b/application/views/sec-viewer/read.tpl new file mode 100644 index 000000000..d7decbe32 --- /dev/null +++ b/application/views/sec-viewer/read.tpl @@ -0,0 +1,104 @@ +{include file="header.tpl" pageTitle="IXP Manager :: SEC Event Notification Config"} + +
+ +
+ + + + + +
+ Member Information :: SEC Event Logs +
+ +{include file="message.tpl"} + +
+ + +

About SEC Events

+ +

+At INEX, we use the SEC - simple event correlator to +monitor various logs and feed information that we feel is important into a processor within the IXP Manager. +The processor parses the entry and then correlates that information with our IXP database to match it +to switch ports and INEX members. See more information here. +

+ +


+ + + + + + + + + + + + + + + +
+ {genDoctrinePagerLinks controller='sec-viewer' action='read' pager=$pager} +
+
+ + + + + + + + + + + {foreach from=$logs item=log} + + + + + {/foreach} + + +
DateLog Message
{$log.recorded_date|date_format:'%Y-%m-%d %H:%M:%S'}{$log.message}
+
+
+ {genDoctrinePagerLinks controller='sec-viewer' action='read' pager=$pager showPageCount=1} +
+ + +
+ +
+ + + + +{include file="footer.tpl"} + diff --git a/application/views/sec/cust_bgp_auth.tpl b/application/views/sec/cust_bgp_auth.tpl new file mode 100644 index 000000000..f7b57e6fc --- /dev/null +++ b/application/views/sec/cust_bgp_auth.tpl @@ -0,0 +1,30 @@ +{if $params->vlan.number eq 10 and $params->ipv eq 4} + {assign var="rcip" value="193.242.111.126"} +{elseif $params->vlan.number eq 10 and $params->ipv eq 6} + {assign var="rcip" value="2001:7F8:18::F:0:1"} +{elseif $params->vlan.number eq 12 and $params->ipv eq 4} + {assign var="rcip" value="194.88.240.126"} +{elseif $params->vlan.number eq 12 and $params->ipv eq 6} + {assign var="rcip" value="2001:7F8:18:12::9999"} +{/if} + +==== THIS IS AN AUTO-GENERATED MESSAGE ==== + +Dear INEX Member, + +Our monitoring systems have recorded a bad or missing BGP MD5 authentication with our route collector. + +The details are: + + LAN: {$params->vlan.name} + Our IP: {$rcip} + Your IP: {$params->ip.address} + MD5: {if $params->ipv eq 4}{$params->vlaninterface.ipv4bgpmd5secret}{else}{$params->vlaninterface.ipv6bgpmd5secret}{/if} + +As it is a requirement of INEX that all members peer and exchange routes with the route collector, we'd appreciate it if you could address this at your earliest convenience. + +You will receive one mail notification per INEX peering LAN IP per day. You can disable these notifications in the IXP Manager under the Profile menu. + +The INEX Operations Team stand ready to provide any assistance to help you resolve this issue. We can be contacted by emailing operations@inex.ie. + + diff --git a/application/views/sec/cust_port_updown.tpl b/application/views/sec/cust_port_updown.tpl new file mode 100644 index 000000000..afc342028 --- /dev/null +++ b/application/views/sec/cust_port_updown.tpl @@ -0,0 +1,29 @@ +{if $params->type eq 'PORT_UPDOWN'} + {assign var='type' value='port'} +{else} + {assign var='type' value='line protocol'} +{/if} + +==== THIS IS AN AUTO-GENERATED MESSAGE ==== + +Dear INEX Member, + +Our monitoring systems have recorded a {$type} state change to {$params->state} on your port with the following details: + + Switch: {$params->switch.name} + Interface: {$params->switchPort.name} + {if $params->date neq ''}Date: {$params->date}{/if} + + +{if $params->state eq 'down'} +WARNING: As a result of this, your INEX link may be no longer passing traffic. +{/if} + +The INEX Operations Team stand ready to provide any assistance to help you resolve this issue. We can be contacted by emailing operations@inex.ie. + +For out of hours emergency support, please see our contact details on: + + https://www.inex.ie/ixp/dashboard/static/page/support + +You can disable these notifications in the IXP Manager under the Profile menu. + diff --git a/application/views/sec/cust_security_violation.tpl b/application/views/sec/cust_security_violation.tpl new file mode 100644 index 000000000..ed2fdc796 --- /dev/null +++ b/application/views/sec/cust_security_violation.tpl @@ -0,0 +1,63 @@ + + +==== THIS IS AN AUTO-GENERATED MESSAGE ==== + +Dear INEX Member, + +Our monitoring systems have recorded a security violation on your port with the following details: + + Switch: {$params->switch.name} + Interface: {$params->switchPort.name} + {if $params->date neq ''}Date: {$params->date}{/if} + + +The violation was caused by a received packet with MAC address: + + MAC: {$params->mac} + Manufacturer: {$manufacturer} + + +To ensure the stability of our peering LANs, it is a strict requirement at INEX that our members only present one MAC address per port. + +You will receive one mail notification per port per day on any day that we register a security violation. You can disable these notifications in the IXP Manager under the Profile menu. + +We would kindly request that you please address this issue at your earliest convenience. + +The INEX Operations Team stand ready to provide any assistance to help you resolve this issue. We can be contacted by emailing operations@inex.ie. + + +-- + + +For your information, we would like to respectfully draw your attention to the following subsections of the INEX MoU which can be read in full online at https://www.inex.ie/joining/mou: + + Technical Requirements + + 2. Connectivity + + 2.1 INEX provides connectivity to its infrastructure using switched + shared Ethernet LANs. The following requirements apply: + + 2.1.2 All traffic frames destined to a particular INEX physical + interface and to INEX peering LANs must have the same source + MAC address. + + 2.1.8 With the exception of ARP and IPv6 Neighbour Discovery, + link-local traffic must not be forwarded to INEX peering + LANs. Link-local traffic includes, but is not limited to: + + * IEEE 802 Spanning Tree + * Vendor-proprietary discovery protocols (e.g. CDP, EDP) + * BOOTP/DHCP + * IPv6 Router Advertisement and Router Solicitation + * IPv4 ICMP redirects and IPv6 redirects + * All interior routing protocol announcements (e.g. RIP, + OSPF, IGRP, EIGRP, ISIS) + * IRDP + + 2.2 INEX reserves the right to disconnect any port which violates any + of the requirements listed in section 2.1. + + + + diff --git a/application/views/sec/ops_bgp_auth.tpl b/application/views/sec/ops_bgp_auth.tpl new file mode 100644 index 000000000..14d26fa7b --- /dev/null +++ b/application/views/sec/ops_bgp_auth.tpl @@ -0,0 +1,31 @@ +{if $params->vlan.number eq 10 and $params->ipv eq 4} + {assign var="rcip" value="193.242.111.126"} +{elseif $params->vlan.number eq 10 and $params->ipv eq 6} + {assign var="rcip" value="2001:7F8:18::F:0:1"} +{elseif $params->vlan.number eq 12 and $params->ipv eq 4} + {assign var="rcip" value="194.88.240.126"} +{elseif $params->vlan.number eq 12 and $params->ipv eq 6} + {assign var="rcip" value="2001:7F8:18:12::9999"} +{/if} + +==== THIS IS AN AUTO-GENERATED MESSAGE ==== + +Our monitoring systems have recorded a bad or missing BGP MD5 authentication with our route collector. + +The details are: + + LAN: {$params->vlan.name} + Customer: {$params->cust.name} + Our IP: {$rcip} + Cust IP: {$params->ip.address} + MD5: {if $params->ipv eq 4}{$params->vlaninterface.ipv4bgpmd5secret}{else}{$params->vlaninterface.ipv6bgpmd5secret}{/if} + + + +{if $customer_notified} +The customer has also been notified. +{else} +The customer has NOT been notified. Configure this using the sec.bgp_auth.alert_customers in application.ini. +{/if} + + diff --git a/application/views/sec/ops_port_updown.tpl b/application/views/sec/ops_port_updown.tpl new file mode 100644 index 000000000..e1031881e --- /dev/null +++ b/application/views/sec/ops_port_updown.tpl @@ -0,0 +1,33 @@ +{if $params->type eq 'PORT_UPDOWN'} + {assign var='type' value='port'} +{else} + {assign var='type' value='line protocol'} +{/if} + +==== THIS IS AN AUTO-GENERATED MESSAGE ==== + +We have recorded a {$type} state change to {$params->state} on: + +{if $params->isCorePort} + + ***** PORT UP/DOWN ON A CORE INEX PORT ***** + + Switch: {$params->switch.name} + Interface: {$params->port} + {if $params->date neq ''}Date: {$params->date}{/if} + + +{else} + + Customer: {$params->cust.name} + Switch: {$params->switch.name} + Interface: {$params->switchPort.name} + {if $params->date neq ''}Date: {$params->date}{/if} + +{if $customer_notified} +The customer has also been notified. +{else} +The customer has NOT been notified. Configure this using the sec.port_updown.alert_customers in application.ini. +{/if} +{/if} + diff --git a/application/views/sec/ops_security_violation.tpl b/application/views/sec/ops_security_violation.tpl new file mode 100644 index 000000000..2de0d036a --- /dev/null +++ b/application/views/sec/ops_security_violation.tpl @@ -0,0 +1,25 @@ + + +==== THIS IS AN AUTO-GENERATED MESSAGE ==== + +A security violation occured with the following details: + + Customer: {$params->cust.name} + Switch: {$params->switch.name} + Interface: {$params->switchPort.name} + {if $params->date neq ''}Date: {$params->date}{/if} + + +The violation was caused by a received packet with MAC address: + + MAC: {$params->mac} + Manufacturer: {$manufacturer} + +{if $customer_notified} +The customer has also been notified. +{else} +The customer has NOT been notified. Configure this using the sec.security_violation.alert_customers in application.ini. +{/if} + + + diff --git a/application/views/switch/customContextMenu.js.tpl b/application/views/switch/customContextMenu.js.tpl new file mode 100644 index 000000000..26497174a --- /dev/null +++ b/application/views/switch/customContextMenu.js.tpl @@ -0,0 +1,60 @@ + +{literal} + +var onContextMenuClick = function( p_sType, p_aArgs, p_myDataTable ) +{ + var task = p_aArgs[1]; + if( task ) { + // Extract which TR element triggered the context menu + var elRow = this.contextEventTarget; + elRow = p_myDataTable.getTrEl( elRow ); + + if( elRow ) + { + var oRecord = p_myDataTable.getRecord(elRow); + + switch( task.groupIndex ) + { + case 0: + switch( task.index ) + { + case 0: + window.location.assign( {/literal}"{genUrl controller=$controller action='edit'}{literal}/id/" + oRecord.getData( 'id' ) ); + break; + + case 1: + if( confirm("Are you sure you want to delete this switch entry?" ) ) + window.location.assign( {/literal}"{genUrl controller=$controller action='delete'}{literal}/id/" + oRecord.getData( 'id' ) ); + break; + } + break; + + case 1: + switch( task.index ) + { + case 0: + window.location.assign( {/literal}"{genUrl controller=$controller action='port-report' id=''}{literal}" + oRecord.getData( 'id' ) ); + break; + } + break; + + } + } + } +}; + +var myContextMenu = new YAHOO.widget.ContextMenu( "mycontextmenu", + {trigger:this.myDataTable.getTbodyEl()} +); + +myContextMenu.addItem("Edit", 0 ); +myContextMenu.addItem("Delete", 0 ); + +myContextMenu.addItem("View Port Report...", 1 ); + +myContextMenu.render("myDatatable"); +myContextMenu.clickEvent.subscribe( onContextMenuClick, this.myDataTable ); + + + +{/literal} diff --git a/application/views/switch/port-report.tpl b/application/views/switch/port-report.tpl new file mode 100644 index 000000000..ee5ead489 --- /dev/null +++ b/application/views/switch/port-report.tpl @@ -0,0 +1,73 @@ +{include file="header.tpl" pageTitle="IXP Manager :: Member Dashboard"} + +
+ + + + + +
Switch :: Port Report
+ +


+ + +
+ + + + + + + + + + + + {foreach from=$ports item=p} + + + + + {if $p.connection} + + + {else} + + + {/if} + + + {/foreach} + + +
Port NameTypeSpeed/DuplexCustomer
{$p.name}{$p.type}{$p.connection.speed}/{$p.connection.duplex}{$p.connection.Virtualinterface.Cust.name}
+
+ + + + +
+ +{include file="footer.tpl"} diff --git a/application/views/user/customContextMenu.js.tpl b/application/views/user/customContextMenu.js.tpl new file mode 100644 index 000000000..dabd6ea11 --- /dev/null +++ b/application/views/user/customContextMenu.js.tpl @@ -0,0 +1,198 @@ + +{literal} + +// Define various event handlers for Dialog +var dialogHandleSubmit = function() { + document.getElementById( "ajaxMessage" ).innerHTML = '
' + + '[...]' + + ' Processing....
'; + this.submit(); +}; +var dialogHandleCancel = function() { + this.cancel(); +}; + +var aniObj = new YAHOO.util.Anim( + document.getElementById( "ajaxMessage" ), + { opacity: {from: 1, to: 0 } }, + '10', + YAHOO.util.Easing.easeOut +); + +var dialogHandleSuccess = function(o) { + + var dialogHandleSuccessClearDiv = function() { + document.getElementById( "ajaxMessage" ).innerHTML = ''; + YAHOO.util.Dom.setStyle( document.getElementById( "ajaxMessage" ), 'opacity', '1' ); + } + + if( o.responseText.substr( 0, 2 ) == '1:' ) + { + document.getElementById( "ajaxMessage" ).innerHTML = '
' + o.responseText.substr( 2 ) + '
'; + } + else + { + document.getElementById( "ajaxMessage" ).innerHTML = '
' + o.responseText.substr( 2 ) + '
'; + } + + aniObj.onComplete.subscribe( dialogHandleSuccessClearDiv ); + aniObj.animate(); + +}; + +var dialogHandleFailure = function(o) { + document.getElementById( "ajaxMessage" ).innerHTML = '
Error with AJAX communication.
'; +}; + +var sendSMSDialog = new YAHOO.widget.Dialog( "sendSMSDialog", + { + width : "350px", + fixedcenter : true, + visible : false, + constraintoviewport : true, + buttons : [ + { text:"Submit", handler:dialogHandleSubmit, isDefault:true }, + { text:"Cancel", handler:dialogHandleCancel } + ] + } +); + + +// Wire up the success and failure handlers +sendSMSDialog.callback = { + success: dialogHandleSuccess, + failure: dialogHandleFailure +}; + +// Render the Dialog +sendSMSDialog.render(); + + + + + + + + + +var sendEmailDialog = new YAHOO.widget.Dialog( "sendEmailDialog", + { + width : "550px", + fixedcenter : true, + visible : false, + constraintoviewport : true, + buttons : [ + { text:"Submit", handler:dialogHandleSubmit, isDefault:true }, + { text:"Cancel", handler:dialogHandleCancel } + ] + } +); + + +// Wire up the success and failure handlers +sendEmailDialog.callback = { + success: dialogHandleSuccess, + failure: dialogHandleFailure +}; + +// Render the Dialog +sendEmailDialog.render(); + + + + +var onContextMenuClick = function( p_sType, p_aArgs, p_myDataTable ) +{ + // complete the animation of any previously selected options + aniObj.stop(); + document.getElementById( "ajaxMessage" ).innerHTML = ''; + YAHOO.util.Dom.setStyle( document.getElementById( "ajaxMessage" ), 'opacity', '1' ); + + var task = p_aArgs[1]; + if( task ) { + // Extract which TR element triggered the context menu + var elRow = this.contextEventTarget; + elRow = p_myDataTable.getTrEl( elRow ); + + if( elRow ) + { + var oRecord = p_myDataTable.getRecord(elRow); + + switch( task.groupIndex ) + { + case 0: + switch( task.index ) + { + case 0: + window.location.assign( "/ixp/{/literal}{$controller}{literal}/edit/id/" + oRecord.getData( 'id' ) ); + break; + + case 1: + if( confirm("Are you sure you want to delete this record?" ) ) + window.location.assign( "/ixp/{/literal}{$controller}{literal}/delete/id/" + oRecord.getData( 'id' ) ); + break; + } + break; + + case 1: + switch( task.index ) + { + case 0: /* Send Password via SMS */ + document.getElementById( "sendSMSDialog-id" ).value = oRecord.getData( 'id' ); + document.getElementById( "sendSMSDialog-to" ).value = oRecord.getData( 'authorisedMobile' ); + document.getElementById( "sendSMSDialog-message" ).value = + "Your INEX Members' Area password is:\n\n" + oRecord.getData( 'password' ) + "\n\nSincerely,\nINEX Operations\noperations@inex.ie"; + document.getElementById( "sendSMSDialog-count" ).innerHTML = + document.getElementById( "sendSMSDialog-message" ).value.length; + + sendSMSDialog.show(); + break; + + case 1: /* Send Login Details via Email */ + document.getElementById( "sendEmailDialog-id" ).value = oRecord.getData( 'id' ); + document.getElementById( "sendEmailDialog-to" ).value = oRecord.getData( 'email' ); + + var loginDetailsString = + "

Dear INEX Member,

Your INEX Members' Area username is:

" + oRecord.getData( 'username' ) + + "

We will send your password to the authorised mobile phone (" + oRecord.getData( 'authorisedMobile' ) + ") by SMS." + + "

Sincerely,
INEX Operations
operations@inex.ie

"; + + document.getElementById( "sendEmailDialog-message" ).value = loginDetailsString; + emailEditor.setEditorHTML( loginDetailsString ); + + sendEmailDialog.show(); + break; + } + break + + case 2: + switch( task.index ) + { + case 0: /* Log in as... SMS */ + window.location.assign( "{/literal}{genUrl controller='auth' action='switch'}{literal}/id/" + oRecord.getData( 'id' ) ); + break; + } + + } + } + } +}; + +var myContextMenu = new YAHOO.widget.ContextMenu( "mycontextmenu", + {trigger:this.myDataTable.getTbodyEl()} +); + +myContextMenu.addItem("Edit", 0 ); +myContextMenu.addItem("Delete", 0 ); + +myContextMenu.addItem("Send Password via SMS", 1 ); +myContextMenu.addItem("Send Login Details via Email", 1 ); + +myContextMenu.addItem("Log in as...", 2 ); + +myContextMenu.render("myDatatable"); +myContextMenu.clickEvent.subscribe( onContextMenuClick, this.myDataTable ); + + + +{/literal} diff --git a/application/views/user/last.tpl b/application/views/user/last.tpl new file mode 100644 index 000000000..e34346695 --- /dev/null +++ b/application/views/user/last.tpl @@ -0,0 +1,66 @@ +{include file="header.tpl" pageTitle="IXP Manager :: Member Dashboard"} + +
+ +
+ + + + + +
+ Users :: Last Logins +
+ +
+
+ + + + + + + + + + + + {foreach from=$last item=l} + + + + + + {/foreach} + +
UsernameCustomerLast Login
{$l.u_username}{$l.c_shortname}{$l.up_value|date_format:"%Y-%m-%d %H:%M:%S"}
+
+
+ + + +
+
+ +{include file="footer.tpl"} diff --git a/application/views/user/postContent.tpl b/application/views/user/postContent.tpl new file mode 100644 index 000000000..efe835450 --- /dev/null +++ b/application/views/user/postContent.tpl @@ -0,0 +1,90 @@ +
+
Send Password via SMS
+
+
+ + + + + + + + + + + + + + + + +
+ To:   + + +
+ +
+ Size:   + + +
+ + +
+
+
+ + + + +
+
Send Login Details via Email
+
+
+ + + + + + + + + + + +
+ To:   + + +
+ +
+ + +
+
+
+ + + diff --git a/application/views/virtual-interface/addEdit.tpl b/application/views/virtual-interface/addEdit.tpl new file mode 100644 index 000000000..62119022b --- /dev/null +++ b/application/views/virtual-interface/addEdit.tpl @@ -0,0 +1,344 @@ +{include file="header.tpl"} + + + + +
+ +{if $isEdit} +

{$frontend.pageTitle} :: Editing

+{else} +

Create New Customer Interface

+{/if} + +{include file="message.tpl"} + + +{$form} + +{if $isEdit} + +
+
+ +
+ +
+ + Physical Interfaces + +
+ + + + + + + + + + + + + + + + {foreach from=$phyInts item=int} + + + + + + + + + + + {/foreach} + + + +
LocationSwitchPortSpeed/Duplex
+ {$int.Switchport.SwitchTable.Cabinet.Location.name} + + {$int.Switchport.SwitchTable.name} + + {$int.Switchport.name} + + {$int.speed}/{$int.duplex} + +
+ + +
+
+
+ + +
+
+ +
+ + + + +
+ + + +
+ + +
+ +
+
+ + + + + +
+
+ +
+ +
+ + VLAN Interfaces + +
+ + + + + + + + + + + + + + + + {foreach from=$vlanInts item=int} + + + + + + + + + + + {/foreach} + + + +
VLAN NameVLAN IDIPv4 AddressIPv6 Address
+ {$int.Vlan.name} + + {$int.Vlan.number} + + {$int.Ipv4address.address} + + {$int.Ipv6address.address} + +
+ + +
+
+
+ + +
+
+ +
+ + + + + + + + + +
+ + +
+ + + +
+
+
+ +
+
+ +{/if} + +
+ +{include file="footer.tpl"} + diff --git a/application/views/virtual-interface/list.tpl b/application/views/virtual-interface/list.tpl new file mode 100644 index 000000000..ebd750352 --- /dev/null +++ b/application/views/virtual-interface/list.tpl @@ -0,0 +1,161 @@ +{include file="header.tpl"} + + + + +
+ + + + + + + +
+ {$frontend.pageTitle} +
+ +{include file="message.tpl"} + + +{literal} + +{/literal} + + + + + + + +
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+ +

+

+

+ +
+
+ +
+
+
Loading...
+
+
+ + +
+ + +{include file="footer.tpl"} diff --git a/bin/build-phpdoc.sh b/bin/build-phpdoc.sh new file mode 100755 index 000000000..fb716bc04 --- /dev/null +++ b/bin/build-phpdoc.sh @@ -0,0 +1,8 @@ +# /bin/bash + +ROOT=$(dirname $0)/.. + +/usr/local/bin/phpdoc -d $ROOT/application/models,$ROOT/library/INEX -t $ROOT/data/phpdoc/ -ti 'INEX IXP Manager :: Auto Generated Documentation' \ + -dc 'IXP-Undefiend' -dn 'IXP-Undefined' -s -o "HTML:frames:earthli" + + diff --git a/bin/doctrine-cli.php b/bin/doctrine-cli.php new file mode 100755 index 000000000..0f0932b58 --- /dev/null +++ b/bin/doctrine-cli.php @@ -0,0 +1,61 @@ +#!/usr/bin/env php +getBootstrap()->bootstrap( 'doctrine' ); + +$config = $application->getOption( 'resources' ); +$cli = new Doctrine_Cli( $config['doctrine'] ); + +$cli->run( $_SERVER['argv'] ); + + diff --git a/bin/ixptool.php b/bin/ixptool.php new file mode 100755 index 000000000..83cbcf3ab --- /dev/null +++ b/bin/ixptool.php @@ -0,0 +1,151 @@ +#! /usr/bin/php + + * + * http://www.inex.ie/ + * (c) Copyright 2009 Internet Neutral Exchange Association Ltd (INEX) + * + */ + +date_default_timezone_set( 'Europe/Dublin' ); + +error_reporting( E_ALL|E_STRICT ); +//error_reporting( ( E_ALL | E_STRICT ) ^ E_NOTICE ); + +ini_set( 'display_errors', true ); + +defined( 'APPLICATION_PATH' ) || define( 'APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application' ) ); + +// Define application environment +define( 'APPLICATION_ENV', 'clidev' ); +//define( 'APPLICATION_ENV', 'production' ); + +defined( 'APPLICATION_ENV' ) || define( 'APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production' ) ); + +// Ensure library/ is on include_path +set_include_path( implode( PATH_SEPARATOR, + array( + realpath( APPLICATION_PATH . '/../library' ), + get_include_path() + ) + ) +); + +/** Zend_Application */ +require_once 'Zend/Application.php'; + +// Create application, bootstrap, and run +$application = new Zend_Application( + APPLICATION_ENV, + APPLICATION_PATH . '/configs/application.ini' +); + +try { + $application->bootstrap(); + + $bootstrap = $application->getBootstrap(); + $bootstrap->bootstrap( 'frontController' ); +} +catch( Exception $e ) +{ + die( print_r( $e, true ) ); +} + +try +{ + $opts = new Zend_Console_Getopt( + array( + 'help|h' => 'Displays usage information.', + 'action|a=s' => 'Action to perform in format of module.controller.action', + 'verbose|v' => 'Verbose messages will be dumped to the default output.', + 'development|d' => 'Enables development mode.', + ) + ); + + $opts->parse(); +} +catch( Zend_Console_Getopt_Exception $e ) +{ + exit( $e->getMessage() ."\n\n". $e->getUsageMessage() ); +} + +if( isset( $opts->h ) ) +{ + echo $opts->getUsageMessage(); + exit; +} + +if( isset( $opts->a ) ) +{ + try + { + $reqRoute = array_reverse( explode( '.', $opts->a ) ); + + @list( $action, $controller, $module ) = $reqRoute; + + if( $opts->v ) + { + echo "Action: $action\n"; + echo "Controller: $controller\n"; + echo "Module: $module\n\n"; + } + + $front = $bootstrap->frontController; + + $front->throwExceptions( true ); + + $front->setRequest( new Zend_Controller_Request_Simple( $action, $controller, $module ) ); + $front->setRouter( new INEX_Controller_Router_Cli() ); + $front->setResponse( new Zend_Controller_Response_Cli() ); + + $front->setParam( 'noViewRenderer', true ) + ->setParam( 'disableOutputBuffering', true ); + + if( $opts->v ) + $front->setParam( 'verbose', true ); + else + $front->setParam( 'verbose', false ); + + // $front->addModuleDirectory( APPLICATION_PATH . '/modules'); + + $application->run(); + } + catch( Exception $e ) + { + echo "ERROR: " . $e->getMessage() . "\n\n"; + + if( $opts->v ) + { + echo $e->getTraceAsString(); + } + } +} + diff --git a/bin/sec-processor.php b/bin/sec-processor.php new file mode 100755 index 000000000..e49631eed --- /dev/null +++ b/bin/sec-processor.php @@ -0,0 +1,297 @@ +#! /usr/bin/env php + + * + * http://www.inex.ie/ + * (c) Copyright 2009 Internet Neutral Exchange Association Ltd (INEX) + * + */ + + +/** + * Instructions: + * ============= + * + * In sec.conf files, call this script with an action such as: + * + * action=pipe 'type=%s:switch=$1:mac=$2:port=$3' /home/barryo/ixp-manager-v2/bin/sec-test.php + * + * Note how the parameters are piped to this script. This script reads a line from stdin and + * parses for param1=val1:param2=val2:... + * + * If you pass the switch= param (where the value is, for example, sw01), the $switch variable + * will be populated from the INEX database with the row of the relevent switch. Passing a + * switch port as port= (where the value might be GigabitEthernet1/6) will additionally + * populate $switchPort, $physicalInterface, $virtualInterface and $cust with the + * appropriate details. + * + * Lastly, if you parse the log file date as follows: + * + * Log file line: Feb 25 06:42:51 ... + * Reg exp: ^(\w+)\s(\d+)\s(\d\d):(\d\d):(\d\d) + * + * and pass in those parameters as: + * + * 'month=$1:day=$2:hour=$3:minute=$4:second=$5' + * + * then $date will contain (in this example) "Feb 25 06:42:51" + * + * NB: only parameters explicitly ALLOWED in the switch() below will be permitted. Please add new + * parameters there. + * + */ + + + +error_reporting( E_ALL|E_STRICT ); + +ini_set( 'display_errors', true ); + +define('APPLICATION_ENV', 'production'); +defined( 'APPLICATION_PATH' ) || define( 'APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application' ) ); + +set_include_path( implode( PATH_SEPARATOR, array( + realpath( APPLICATION_PATH . '/../library' ), + get_include_path(), +))); + +date_default_timezone_set( 'Europe/Dublin' ); + + +require_once 'Zend/Application.php'; + +// Create application, bootstrap, and run +$application = new Zend_Application( + APPLICATION_ENV, + APPLICATION_PATH . '/configs/application.ini' +); + +try +{ + $application->bootstrap(); + $bootstrap = $application->getBootstrap(); + $bootstrap->bootstrap( 'frontController' ); + $bootstrap->bootstrap(); + + if( $bootstrap->hasResource( 'zfdebug' ) ) + $bootstrap->unregisterPluginResource( 'zfdebug' ); + + $namespace = $bootstrap->getResource( 'namespace' ); +} +catch( Exception $e ) +{ + die( print_r( $e, true ) ); +} + +define( 'MAILTO', 'barryo@inex.ie' ); + +// Read the parameters from STDIN +if( !defined( 'STDIN' ) ) +{ + define( 'STDIN', fopen( 'php://stdin', 'r' ) ); +} + +while( !feof( STDIN ) ) +{ + $in = fgets( STDIN, 4096 ); + + $bootstrap->getResource( 'logger' )->debug( "STDIN: $in" ); + break; +} + +// Now process the parameters only allowing those explicitly listed +$args = split( '&', $in ); + +foreach( $args as $arg ) +{ + $temp = split( '=', $arg ); + + switch( $temp[0] ) + { + case 'day': + case 'hour': + case 'minute': + case 'month': + case 'second': + case 'switch': + $$temp[0] = trim( $temp[1] ); + break; + + case 'ip': + case 'mac': + case 'port': + case 'router': + case 'state': + case 'type': + $namespace->$temp[0] = trim( $temp[1] ); + break; + + default: + die( 'Illegal parameter: ' . $temp[0] . "\n" ); + break; + } +} + +// die( print_r( $namespace->getIterator(), true ) ); + +if( isset( $hour ) ) +{ + $namespace->date = ( isset( $month ) ? $month : '' ) + . ' ' . ( isset( $day ) ? $day : '' ) + . " $hour:$minute:$second"; +} +else + $namespace->date = ''; + + +// +// Populate $switch, $switchPort, $physicalInterface, $virtualInterface, and $cust +// variables if we have that information +// + +if( isset( $switch ) ) +{ + $namespace->switch = Doctrine::getTable('SwitchTable')->findOneByName( $switch ); + + if( !$namespace->switch ) + die( "No such switch: $switch\n" ); + + // Weed out core ports (and also Port-channel interfaces which are all currently core) + // FIXME Port-channel could also be a customer but we don't have any yet + + $namespace->isCorePort = false; + if( preg_match( "/^Port-channel/", $namespace->port ) ) + { + $namespace->isCorePort = true; + $namespace->switchPort = null; + } + else + { + $namespace->switchPort = Doctrine_Query::create() + ->from( 'Switchport sp' ) + ->where( 'sp.switchid = ? AND sp.name = ?', array( $namespace->switch['id'], $namespace->port ) ) + ->fetchOne(); + } + + if( $namespace->isCorePort || $namespace->switchPort['type'] == Switchport::TYPE_CORE ) + { + $namespace->isCorePort = true; + $namespace->physicalInterface = null; + $namespace->virtualInterface = null; + $namespace->cust = Doctrine::getTable( 'Cust' )->findOneByShortname( 'inex' ); + } + else + { + $namespace->physicalInterface = Doctrine::getTable( 'Physicalinterface' )->findOneBySwitchportid( $namespace->switchPort['id'] ); + $namespace->virtualInterface = Doctrine::getTable( 'Virtualinterface' )->find( $namespace->physicalInterface['virtualinterfaceid'] ); + $namespace->cust = Doctrine::getTable( 'Cust' )->find( $namespace->virtualInterface['custid'] ); + $namespace->user = Doctrine::getTable( 'User' )->findOneByCustidAndPrivs( $namespace->cust['id'], User::AUTH_CUSTADMIN ); + } +} + +if( isset( $namespace->ip ) ) +{ + $ip = $namespace->ip; + + // is it an IPv4 or a v6 address? + if( ip2long( $ip ) === false ) + { + $namespace->ipv = 6; + + // FIXME: Yeah, this isn't good. We need a better way to reliably find an IPv6 address in the DB + if( $namespace->ip = Doctrine::getTable('Ipv6address')->findOneByAddress( strtolower( $ip ) ) ) + $namespace->vlaninterface = Doctrine::getTable( 'Vlaninterface' )->findOneByIpv6addressid( $namespace->ip['id'] ); + } + else + { + $namespace->ipv = 4; + + if( $namespace->ip = Doctrine::getTable('Ipv4address')->findOneByAddress( $ip ) ) + $namespace->vlaninterface = Doctrine::getTable( 'Vlaninterface' )->findOneByIpv4addressid( $namespace->ip['id'] ); + } + + $namespace->virtualinterface = Doctrine::getTable( 'Virtualinterface' )->find( $namespace->vlaninterface['virtualinterfaceid'] ); + $namespace->cust = Doctrine::getTable( 'Cust' )->find( $namespace->virtualinterface['custid'] ); + $namespace->vlan = Doctrine::getTable( 'Vlan' )->find( $namespace->vlaninterface->vlanid ); + $namespace->user = Doctrine::getTable( 'User' )->findOneByCustidAndPrivs( $namespace->cust['id'], User::AUTH_CUSTADMIN ); +} + +// +// Now act on individual log messages +// + +$front = $bootstrap->getResource( 'frontController' ); + +$front->throwExceptions( true ); + +$front->setRouter( new INEX_Controller_Router_Cli() ); +$front->setResponse( new Zend_Controller_Response_Cli() ); + +switch( $namespace->type ) +{ + case 'BGP_AUTH': + $front->setRequest( new INEX_Controller_Request_Simple( 'bgp-auth', 'sec', null ) ); + break; + + case 'PORT_UPDOWN': + case 'LINEPROTO_UPDOWN': + $front->setRequest( new INEX_Controller_Request_Simple( 'port-updown', 'sec', null ) ); + break; + + case 'SECURITY_VIOLATION': + $front->setRequest( new INEX_Controller_Request_Simple( 'security-violation', 'sec', null ) ); + break; + + default: + // FIXME!! + break; +} + +$front->setParam( 'noViewRenderer', true ) + ->setParam( 'disableOutputBuffering', true ); + +$application->run(); + + +function switch_port_updown( $switch, $switchPort, $cust, $state, $date ) +{ + $mail = new Zend_Mail(); + $mail->setBodyText( "\n=== TEST MODE :: NO MAIL GONE TO CUSTOMERS ===\n\n" + . "Port $state alert:\n\n Switch {$switch['name']}\n Interface {$switchPort['name']}\n Date: $date\n\nPort is owned by {$cust['name']}.\n\n" + ); + $mail->setFrom( 'operations@inex.ie', 'INEX Operations' ); + $mail->addTo( MAILTO, 'INEX Operations' ); + $mail->setSubject( "Port $state alert :: {$cust['name']} :: {$switch['name']}/{$switchPort['name']}" ); + $mail->send(); +} + + +?> \ No newline at end of file diff --git a/bin/sec/SEC-README b/bin/sec/SEC-README new file mode 100644 index 000000000..881ab959d --- /dev/null +++ b/bin/sec/SEC-README @@ -0,0 +1,4 @@ + +To test on a local machine: + +sec -conf=sec-test.conf -quoting -input=cisco-test.log -debug 4 -fromstart diff --git a/bin/sec/cisco-test.log b/bin/sec/cisco-test.log new file mode 100644 index 000000000..4dd195989 --- /dev/null +++ b/bin/sec/cisco-test.log @@ -0,0 +1,2 @@ +Feb 11 22:05:18 sw04 376333: Feb 11 22:05:18 GMT: %LINK-3-UPDOWN: TenGigabitEthernet3/3, changed state to down +Feb 11 22:05:27 sw04 376340: Feb 11 22:05:27 GMT: %LINK-3-UPDOWN: Interface TenGigabitEthernet3/3, changed state to up diff --git a/bin/sec/cisco-test.log2 b/bin/sec/cisco-test.log2 new file mode 100644 index 000000000..10fdfa388 --- /dev/null +++ b/bin/sec/cisco-test.log2 @@ -0,0 +1,23 @@ +Feb 11 22:05:18 sw04 376333: Feb 11 22:05:18 GMT: %LINK-3-UPDOWN: GigabitEthernet5/1, changed state to down +Feb 11 22:05:19 sw03 376335: Feb 11 22:05:18 GMT: %EC-SP-5-UNBUNDLE: Interface TenGigabitEthernet3/3 left the port-channel Port-channel3 +Feb 11 22:05:21 sw03 376338: Feb 11 22:05:19 GMT: %DTP-SP-5-NONTRUNKPORTON: Port Te3/3 has become non-trunk +Feb 11 22:05:27 sw04 376340: Feb 11 22:05:27 GMT: %LINK-3-UPDOWN: Interface GigabitEthernet5/1, changed state to up +Feb 11 22:05:27 sw03 376341: Feb 11 22:05:27 GMT: %LINEPROTO-5-UPDOWN: Line protocol on Interface Port-channel3, changed state to up +Feb 11 22:05:27 sw03 376343: Feb 11 22:05:27 GMT: %EC-SP-5-BUNDLE: Interface TenGigabitEthernet3/3 joined port-channel Port-channel3 +Feb 11 22:05:29 sw03 376346: Feb 11 22:05:28 GMT: %DTP-SP-5-TRUNKPORTON: Port Te3/3 has become dot1q trunk +Feb 11 22:09:22 sw03 376350: Feb 11 22:09:21 GMT: %LINEPROTO-5-UPDOWN: Line protocol on Interface Port-channel3, changed state to down +Feb 11 22:09:22 sw03 376351: Feb 11 22:09:21 GMT: %LINK-3-UPDOWN: Interface Port-channel3, changed state to down +Feb 11 22:09:22 sw03 376353: Feb 11 22:09:21 GMT: %EC-SP-5-UNBUNDLE: Interface TenGigabitEthernet3/3 left the port-channel Port-channel3 +Feb 11 22:09:24 sw03 376356: Feb 11 22:09:22 GMT: %DTP-SP-5-NONTRUNKPORTON: Port Te3/3 has become non-trunk +Feb 11 22:09:35 sw03 376358: Feb 11 22:09:35 GMT: %LINK-3-UPDOWN: Interface Port-channel3, changed state to up +Feb 11 22:09:35 sw03 376359: Feb 11 22:09:35 GMT: %LINEPROTO-5-UPDOWN: Line protocol on Interface Port-channel3, changed state to up +Feb 11 22:09:35 sw03 376361: Feb 11 22:09:35 GMT: %EC-SP-5-BUNDLE: Interface TenGigabitEthernet3/3 joined port-channel Port-channel3 +Feb 11 22:09:37 sw03 376364: Feb 11 22:09:36 GMT: %DTP-SP-5-TRUNKPORTON: Port Te3/3 has become dot1q trunk +Feb 11 22:27:30 sw03 376374: Feb 11 22:27:30 GMT: %LINEPROTO-5-UPDOWN: Line protocol on Interface Port-channel3, changed state to down +Feb 11 22:27:30 sw03 376375: Feb 11 22:27:30 GMT: %LINK-3-UPDOWN: Interface Port-channel3, changed state to down +Feb 11 22:27:31 sw03 376377: Feb 11 22:27:30 GMT: %EC-SP-5-UNBUNDLE: Interface TenGigabitEthernet3/3 left the port-channel Port-channel3 +Feb 11 22:27:33 sw03 376380: Feb 11 22:27:31 GMT: %DTP-SP-5-NONTRUNKPORTON: Port Te3/3 has become non-trunk +Feb 11 22:27:40 sw03 376382: Feb 11 22:27:40 GMT: %LINK-3-UPDOWN: Interface Port-channel3, changed state to up +Feb 11 22:27:40 sw03 376383: Feb 11 22:27:40 GMT: %LINEPROTO-5-UPDOWN: Line protocol on Interface Port-channel3, changed state to up +Feb 11 22:27:40 sw03 376385: Feb 11 22:27:40 GMT: %EC-SP-5-BUNDLE: Interface TenGigabitEthernet3/3 joined port-channel Port-channel3 +Feb 11 22:27:42 sw03 376388: Feb 11 22:27:40 GMT: %DTP-SP-5-TRUNKPORTON: Port Te3/3 has become dot1q trunk diff --git a/bin/sec/sec-test.conf b/bin/sec/sec-test.conf new file mode 100644 index 000000000..ddb274ab0 --- /dev/null +++ b/bin/sec/sec-test.conf @@ -0,0 +1,102 @@ + + + + +######################################################################### +# +# Rules for BGP bad auth +# +# Will only issue one alert per port per day +# +# Feb 10 13:38:27 rc1 520169: Feb 10 13:38:26 GMT: %TCP-6-BADAUTH: No MD5 digest from 193.242.111.37(179) to 193.242.111.126(52164) (RST) +# Feb 10 13:38:27 rc1 520170: Feb 10 13:38:26 GMT: %TCP-6-BADAUTH: No MD5 digest from 2001:7F8:18::33(179) to 2001:7F8:18::F:0:1(53686) (RST) +# +# barryo@inex.ie 20100210 +######################################################################### + +type=Suppress +desc=BGP_AUTH +ptype=regexp +pattern=^(\w+)\s(\d+)\s(\d\d):(\d\d):(\d\d)\s.+rc1.*TCP-6-BADAUTH:\sNo\sMD5\sdigest\sfrom\s([0-9A-F\.:]+)\(179\).+ +context=BGP_AUTH_$6 + +type=Single +continue=TakeNext +desc=BGP_AUTH +ptype=regexp +pattern=^(\w+)\s(\d+)\s(\d\d):(\d\d):(\d\d)\s.+rc1.*TCP-6-BADAUTH:\sNo\sMD5\sdigest\sfrom\s([0-9A-F\.:]+)\(179\).+ +action=create BGP_AUTH_$6 86400 + +type=Single +continue=dontcont +desc=BGP_AUTH +ptype=regexp +pattern=^(\w+)\s(\d+)\s(\d\d):(\d\d):(\d\d)\s.+rc1.*TCP-6-BADAUTH:\sNo\sMD5\sdigest\sfrom\s([0-9A-F\.:]+)\(179\).+ +action=pipe 'type=%s&router=rc1&month=$1&day=$2&hour=$3&minute=$4&second=$5&ip=$6' /home/barryo/Zend/workspaces/DefaultWorkspace7/INEX_IXP/bin/sec-processor.php +context=BGP_AUTH_$6 + + +######################################################################### +# +# Rules for PORT UPDOWN and LINEPROTO UPDOWN +# +# Will supress line protocol up / down alerts that occur within 60 secs +# of a port up / down for the same switch / port. +# +# barryo@inex.ie 20090225 +# +######################################################################### + + +# Feb 25 06:42:50 sw01 37304: Feb 25 06:42:49 GMT: %LINEPROTO-5-UPDOWN: Line protocol on Interface GigabitEthernet1/6, changed state to up +# %LINK-3-UPDOWN: Interface Port-channel3, changed state to down +rem=Let's ignore LINEPROTO-UPDOWN notices if the port is down/up (duh!). +type=Suppress +desc=LINEPROTO_UPDOWN +ptype=regexp +pattern=^(\w+)\s(\d+)\s(\d\d):(\d\d):(\d\d)\s.+(sw\d\d).*LINEPROTO-\d-UPDOWN:\sLine\sprotocol\son\sInterface\s([a-zA-Z0-9/\-]+).* +context=PORT_UPDOWN_$6_$7 + +# Feb 25 06:39:26 sw01 37298: Feb 25 06:39:24 GMT: %LINK-SP-3-UPDOWN: Interface GigabitEthernet2/6, changed state to down +type=Single +continue=TakeNext +desc=PORT_UPDOWN +ptype=regexp +pattern=^(\w+)\s(\d+)\s(\d\d):(\d\d):(\d\d)\s.+(sw\d\d).*LINK-\d-UPDOWN:\sInterface\s([a-zA-Z0-9/\-]+),\schanged\sstate\sto\s(\w+) +action=create PORT_UPDOWN_$6_$7 60 + +type=Single +continue=DontCont +desc=PORT_UPDOWN +ptype=regexp +pattern=^(\w+)\s(\d+)\s(\d\d):(\d\d):(\d\d)\s.+(sw\d\d).*LINK-\d-UPDOWN:\sInterface\s([a-zA-Z0-9/\-]+),\schanged\sstate\sto\s(\w+) +action=pipe 'type=%s&switch=$6&port=$7&state=$8&month=$1&day=$2&hour=$3&minute=$4&second=$5' /home/barryo/Zend/workspaces/DefaultWorkspace7/INEX_IXP/bin/sec-processor.php +context=PORT_UPDOWN_$6_$7 + +type=Single +continue=DontCont +desc=LINEPROTO_UPDOWN +ptype=regexp +pattern=^(\w+)\s(\d+)\s(\d\d):(\d\d):(\d\d)\s.+(sw\d\d).*LINEPROTO-\d-UPDOWN:\sLine\sprotocol\son\sInterface\s([a-zA-Z0-9/\-]+),\schanged\sstate\sto\s(\w+) +action=pipe 'type=%s&switch=$6&port=$7&state=$8&month=$1&day=$2&hour=$3&minute=$4&second=$5' /home/barryo/Zend/workspaces/DefaultWorkspace7/INEX_IXP/bin/sec-processor.php + +# Suppress similar / duplicate UPDOWN messages (of type 'SP') for LINK and LINEPROTO +# These should be all duplicates so we'll use the CONTEXT from above to match and allow a +# default handler at the end of this config catch anything else. +type=Single +continue=DontCont +desc=PORT_UPDOWN +ptype=regexp +pattern=^(\w+)\s(\d+)\s(\d\d):(\d\d):(\d\d)\s.+(sw\d\d).*LINK-SP-\d-UPDOWN:\sInterface\s([a-zA-Z0-9/\-]+),\schanged\sstate\sto\s(\w+) +context=PORT_UPDOWN_$6_$7 +action=none + +type=Single +continue=DontCont +desc=PORT_UPDOWN +ptype=regexp +pattern=^(\w+)\s(\d+)\s(\d\d):(\d\d):(\d\d)\s.+(sw\d\d).*LINEPROTO-SP-\d-UPDOWN:\sLine\sprotocol\son\sInterface\s([a-zA-Z0-9/\-]+).* +context=PORT_UPDOWN_$6_$7 +action=none + + diff --git a/data/oui-update.sh b/data/oui-update.sh new file mode 100755 index 000000000..e8eb1f1f2 --- /dev/null +++ b/data/oui-update.sh @@ -0,0 +1,12 @@ +#! /bin/bash + + +wget -O ./oui-new.txt http://standards.ieee.org/regauth/oui/oui.txt + +if [[ $0 ]]; then + cat oui-new.txt | grep "(hex)" > oui-new-filtered.txt + cat oui-new-filtered.txt >oui.txt + rm oui-new-filtered.txt + rm oui-new.txt +fi + diff --git a/data/oui.txt b/data/oui.txt new file mode 100644 index 000000000..ca60ccf5d --- /dev/null +++ b/data/oui.txt @@ -0,0 +1,13361 @@ +00-00-00 (hex) XEROX CORPORATION +00-00-01 (hex) XEROX CORPORATION +00-00-02 (hex) XEROX CORPORATION +00-00-03 (hex) XEROX CORPORATION +00-00-04 (hex) XEROX CORPORATION +00-00-05 (hex) XEROX CORPORATION +00-00-06 (hex) XEROX CORPORATION +00-00-07 (hex) XEROX CORPORATION +00-00-08 (hex) XEROX CORPORATION +00-00-09 (hex) XEROX CORPORATION +00-00-0A (hex) OMRON TATEISI ELECTRONICS CO. +00-00-0B (hex) MATRIX CORPORATION +00-00-0C (hex) CISCO SYSTEMS, INC. +00-00-0D (hex) FIBRONICS LTD. +00-00-0E (hex) FUJITSU LIMITED +00-00-0F (hex) NEXT, INC. +00-00-10 (hex) SYTEK INC. +00-00-11 (hex) NORMEREL SYSTEMES +00-00-12 (hex) INFORMATION TECHNOLOGY LIMITED +00-00-13 (hex) CAMEX +00-00-14 (hex) NETRONIX +00-00-15 (hex) DATAPOINT CORPORATION +00-00-16 (hex) DU PONT PIXEL SYSTEMS . +00-00-17 (hex) TEKELEC +00-00-18 (hex) WEBSTER COMPUTER CORPORATION +00-00-19 (hex) APPLIED DYNAMICS INTERNATIONAL +00-00-1A (hex) ADVANCED MICRO DEVICES +00-00-1B (hex) NOVELL INC. +00-00-1C (hex) BELL TECHNOLOGIES +00-00-1D (hex) CABLETRON SYSTEMS, INC. +00-00-1E (hex) TELSIST INDUSTRIA ELECTRONICA +00-00-1F (hex) Telco Systems, Inc. +00-00-20 (hex) DATAINDUSTRIER DIAB AB +00-00-21 (hex) SUREMAN COMP. & COMMUN. CORP. +00-00-22 (hex) VISUAL TECHNOLOGY INC. +00-00-23 (hex) ABB INDUSTRIAL SYSTEMS AB +00-00-24 (hex) CONNECT AS +00-00-25 (hex) RAMTEK CORP. +00-00-26 (hex) SHA-KEN CO., LTD. +00-00-27 (hex) JAPAN RADIO COMPANY +00-00-28 (hex) PRODIGY SYSTEMS CORPORATION +00-00-29 (hex) IMC NETWORKS CORP. +00-00-2A (hex) TRW - SEDD/INP +00-00-2B (hex) CRISP AUTOMATION, INC +00-00-2C (hex) AUTOTOTE LIMITED +00-00-2D (hex) CHROMATICS INC +00-00-2E (hex) SOCIETE EVIRA +00-00-2F (hex) TIMEPLEX INC. +00-00-30 (hex) VG LABORATORY SYSTEMS LTD +00-00-31 (hex) QPSX COMMUNICATIONS PTY LTD +00-00-32 (hex) Marconi plc +00-00-33 (hex) EGAN MACHINERY COMPANY +00-00-34 (hex) NETWORK RESOURCES CORPORATION +00-00-35 (hex) SPECTRAGRAPHICS CORPORATION +00-00-36 (hex) ATARI CORPORATION +00-00-37 (hex) OXFORD METRICS LIMITED +00-00-38 (hex) CSS LABS +00-00-39 (hex) TOSHIBA CORPORATION +00-00-3A (hex) CHYRON CORPORATION +00-00-3B (hex) i Controls, Inc. +00-00-3C (hex) AUSPEX SYSTEMS INC. +00-00-3D (hex) UNISYS +00-00-3E (hex) SIMPACT +00-00-3F (hex) SYNTREX, INC. +00-00-40 (hex) APPLICON, INC. +00-00-41 (hex) ICE CORPORATION +00-00-42 (hex) METIER MANAGEMENT SYSTEMS LTD. +00-00-43 (hex) MICRO TECHNOLOGY +00-00-44 (hex) CASTELLE CORPORATION +00-00-45 (hex) FORD AEROSPACE & COMM. CORP. +00-00-46 (hex) OLIVETTI NORTH AMERICA +00-00-47 (hex) NICOLET INSTRUMENTS CORP. +00-00-48 (hex) SEIKO EPSON CORPORATION +00-00-49 (hex) APRICOT COMPUTERS, LTD +00-00-4A (hex) ADC CODENOLL TECHNOLOGY CORP. +00-00-4B (hex) ICL DATA OY +00-00-4C (hex) NEC CORPORATION +00-00-4D (hex) DCI CORPORATION +00-00-4E (hex) AMPEX CORPORATION +00-00-4F (hex) LOGICRAFT, INC. +00-00-50 (hex) RADISYS CORPORATION +00-00-51 (hex) HOB ELECTRONIC GMBH & CO. KG +00-00-52 (hex) Intrusion.com, Inc. +00-00-53 (hex) COMPUCORP +00-00-54 (hex) MODICON, INC. +00-00-55 (hex) COMMISSARIAT A L`ENERGIE ATOM. +00-00-56 (hex) DR. B. STRUCK +00-00-57 (hex) SCITEX CORPORATION LTD. +00-00-58 (hex) RACORE COMPUTER PRODUCTS INC. +00-00-59 (hex) HELLIGE GMBH +00-00-5A (hex) SysKonnect GmbH +00-00-5B (hex) ELTEC ELEKTRONIK AG +00-00-5C (hex) TELEMATICS INTERNATIONAL INC. +00-00-5D (hex) CS TELECOM +00-00-5E (hex) USC INFORMATION SCIENCES INST +00-00-5F (hex) SUMITOMO ELECTRIC IND., LTD. +00-00-60 (hex) KONTRON ELEKTRONIK GMBH +00-00-61 (hex) GATEWAY COMMUNICATIONS +00-00-62 (hex) BULL HN INFORMATION SYSTEMS +00-00-63 (hex) BARCO CONTROL ROOMS GMBH +00-00-64 (hex) YOKOGAWA DIGITAL COMPUTER CORP +00-00-65 (hex) Network General Corporation +00-00-66 (hex) TALARIS SYSTEMS, INC. +00-00-67 (hex) SOFT * RITE, INC. +00-00-68 (hex) ROSEMOUNT CONTROLS +00-00-69 (hex) CONCORD COMMUNICATIONS INC +00-00-6A (hex) COMPUTER CONSOLES INC. +00-00-6B (hex) SILICON GRAPHICS INC./MIPS +00-00-6C (hex) PRIVATE +00-00-6D (hex) CRAY COMMUNICATIONS, LTD. +00-00-6E (hex) ARTISOFT, INC. +00-00-6F (hex) Madge Ltd. +00-00-70 (hex) HCL LIMITED +00-00-71 (hex) ADRA SYSTEMS INC. +00-00-72 (hex) MINIWARE TECHNOLOGY +00-00-73 (hex) SIECOR CORPORATION +00-00-74 (hex) RICOH COMPANY LTD. +00-00-75 (hex) Nortel Networks +00-00-76 (hex) ABEKAS VIDEO SYSTEM +00-00-77 (hex) INTERPHASE CORPORATION +00-00-78 (hex) LABTAM LIMITED +00-00-79 (hex) NETWORTH INCORPORATED +00-00-7A (hex) DANA COMPUTER INC. +00-00-7B (hex) RESEARCH MACHINES +00-00-7C (hex) AMPERE INCORPORATED +00-00-7D (hex) SUN MICROSYSTEMS, INC. +00-00-7E (hex) CLUSTRIX CORPORATION +00-00-7F (hex) LINOTYPE-HELL AG +00-00-80 (hex) CRAY COMMUNICATIONS A/S +00-00-81 (hex) BAY NETWORKS +00-00-82 (hex) LECTRA SYSTEMES SA +00-00-83 (hex) TADPOLE TECHNOLOGY PLC +00-00-84 (hex) SUPERNET +00-00-85 (hex) CANON INC. +00-00-86 (hex) MEGAHERTZ CORPORATION +00-00-87 (hex) HITACHI, LTD. +00-00-88 (hex) Brocade Communications Systems, Inc. +00-00-89 (hex) CAYMAN SYSTEMS INC. +00-00-8A (hex) DATAHOUSE INFORMATION SYSTEMS +00-00-8B (hex) INFOTRON +00-00-8C (hex) Alloy Computer Products (Australia) Pty Ltd +00-00-8D (hex) Cryptek Inc. +00-00-8E (hex) SOLBOURNE COMPUTER, INC. +00-00-8F (hex) Raytheon +00-00-90 (hex) MICROCOM +00-00-91 (hex) ANRITSU CORPORATION +00-00-92 (hex) COGENT DATA TECHNOLOGIES +00-00-93 (hex) PROTEON INC. +00-00-94 (hex) ASANTE TECHNOLOGIES +00-00-95 (hex) SONY TEKTRONIX CORP. +00-00-96 (hex) MARCONI ELECTRONICS LTD. +00-00-97 (hex) EMC Corporation +00-00-98 (hex) CROSSCOMM CORPORATION +00-00-99 (hex) MTX, INC. +00-00-9A (hex) RC COMPUTER A/S +00-00-9B (hex) INFORMATION INTERNATIONAL, INC +00-00-9C (hex) ROLM MIL-SPEC COMPUTERS +00-00-9D (hex) LOCUS COMPUTING CORPORATION +00-00-9E (hex) MARLI S.A. +00-00-9F (hex) AMERISTAR TECHNOLOGIES INC. +00-00-A0 (hex) SANYO Electric Co., Ltd. +00-00-A1 (hex) MARQUETTE ELECTRIC CO. +00-00-A2 (hex) BAY NETWORKS +00-00-A3 (hex) NETWORK APPLICATION TECHNOLOGY +00-00-A4 (hex) ACORN COMPUTERS LIMITED +00-00-A5 (hex) COMPATIBLE SYSTEMS CORP. +00-00-A6 (hex) NETWORK GENERAL CORPORATION +00-00-A7 (hex) NETWORK COMPUTING DEVICES INC. +00-00-A8 (hex) STRATUS COMPUTER INC. +00-00-A9 (hex) NETWORK SYSTEMS CORP. +00-00-AA (hex) XEROX CORPORATION +00-00-AB (hex) LOGIC MODELING CORPORATION +00-00-AC (hex) CONWARE COMPUTER CONSULTING +00-00-AD (hex) BRUKER INSTRUMENTS INC. +00-00-AE (hex) DASSAULT ELECTRONIQUE +00-00-AF (hex) NUCLEAR DATA INSTRUMENTATION +00-00-B0 (hex) RND-RAD NETWORK DEVICES +00-00-B1 (hex) ALPHA MICROSYSTEMS INC. +00-00-B2 (hex) TELEVIDEO SYSTEMS, INC. +00-00-B3 (hex) CIMLINC INCORPORATED +00-00-B4 (hex) EDIMAX COMPUTER COMPANY +00-00-B5 (hex) DATABILITY SOFTWARE SYS. INC. +00-00-B6 (hex) MICRO-MATIC RESEARCH +00-00-B7 (hex) DOVE COMPUTER CORPORATION +00-00-B8 (hex) SEIKOSHA CO., LTD. +00-00-B9 (hex) MCDONNELL DOUGLAS COMPUTER SYS +00-00-BA (hex) SIIG, INC. +00-00-BB (hex) TRI-DATA +00-00-BC (hex) Rockwell Automation +00-00-BD (hex) MITSUBISHI CABLE COMPANY +00-00-BE (hex) THE NTI GROUP +00-00-BF (hex) SYMMETRIC COMPUTER SYSTEMS +00-00-C0 (hex) WESTERN DIGITAL CORPORATION +00-00-C1 (hex) Madge Ltd. +00-00-C2 (hex) INFORMATION PRESENTATION TECH. +00-00-C3 (hex) HARRIS CORP COMPUTER SYS DIV +00-00-C4 (hex) WATERS DIV. OF MILLIPORE +00-00-C5 (hex) FARALLON COMPUTING/NETOPIA +00-00-C6 (hex) EON SYSTEMS +00-00-C7 (hex) ARIX CORPORATION +00-00-C8 (hex) ALTOS COMPUTER SYSTEMS +00-00-C9 (hex) Emulex Corporation +00-00-CA (hex) ARRIS International +00-00-CB (hex) COMPU-SHACK ELECTRONIC GMBH +00-00-CC (hex) DENSAN CO., LTD. +00-00-CD (hex) Allied Telesis Labs Ltd +00-00-CE (hex) MEGADATA CORP. +00-00-CF (hex) HAYES MICROCOMPUTER PRODUCTS +00-00-D0 (hex) DEVELCON ELECTRONICS LTD. +00-00-D1 (hex) ADAPTEC INCORPORATED +00-00-D2 (hex) SBE, INC. +00-00-D3 (hex) WANG LABORATORIES INC. +00-00-D4 (hex) PURE DATA LTD. +00-00-D5 (hex) MICROGNOSIS INTERNATIONAL +00-00-D6 (hex) PUNCH LINE HOLDING +00-00-D7 (hex) DARTMOUTH COLLEGE +00-00-D8 (hex) NOVELL, INC. +00-00-D9 (hex) NIPPON TELEGRAPH & TELEPHONE +00-00-DA (hex) ATEX +00-00-DB (hex) BRITISH TELECOMMUNICATIONS PLC +00-00-DC (hex) HAYES MICROCOMPUTER PRODUCTS +00-00-DD (hex) TCL INCORPORATED +00-00-DE (hex) CETIA +00-00-DF (hex) BELL & HOWELL PUB SYS DIV +00-00-E0 (hex) QUADRAM CORP. +00-00-E1 (hex) GRID SYSTEMS +00-00-E2 (hex) ACER TECHNOLOGIES CORP. +00-00-E3 (hex) INTEGRATED MICRO PRODUCTS LTD +00-00-E4 (hex) IN2 GROUPE INTERTECHNIQUE +00-00-E5 (hex) SIGMEX LTD. +00-00-E6 (hex) APTOR PRODUITS DE COMM INDUST +00-00-E7 (hex) STAR GATE TECHNOLOGIES +00-00-E8 (hex) ACCTON TECHNOLOGY CORP. +00-00-E9 (hex) ISICAD, INC. +00-00-EA (hex) UPNOD AB +00-00-EB (hex) MATSUSHITA COMM. IND. CO. LTD. +00-00-EC (hex) MICROPROCESS +00-00-ED (hex) APRIL +00-00-EE (hex) NETWORK DESIGNERS, LTD. +00-00-EF (hex) KTI +00-00-F0 (hex) SAMSUNG ELECTRONICS CO., LTD. +00-00-F1 (hex) MAGNA COMPUTER CORPORATION +00-00-F2 (hex) SPIDER COMMUNICATIONS +00-00-F3 (hex) GANDALF DATA LIMITED +00-00-F4 (hex) Allied Telesis +00-00-F5 (hex) DIAMOND SALES LIMITED +00-00-F6 (hex) APPLIED MICROSYSTEMS CORP. +00-00-F7 (hex) YOUTH KEEP ENTERPRISE CO LTD +00-00-F8 (hex) DIGITAL EQUIPMENT CORPORATION +00-00-F9 (hex) QUOTRON SYSTEMS INC. +00-00-FA (hex) MICROSAGE COMPUTER SYSTEMS INC +00-00-FB (hex) RECHNER ZUR KOMMUNIKATION +00-00-FC (hex) MEIKO +00-00-FD (hex) HIGH LEVEL HARDWARE +00-00-FE (hex) ANNAPOLIS MICRO SYSTEMS +00-00-FF (hex) CAMTEC ELECTRONICS LTD. +00-01-00 (hex) EQUIP'TRANS +00-01-01 (hex) PRIVATE +00-01-02 (hex) 3COM CORPORATION +00-01-03 (hex) 3COM CORPORATION +00-01-04 (hex) DVICO Co., Ltd. +00-01-05 (hex) Beckhoff Automation GmbH +00-01-06 (hex) Tews Datentechnik GmbH +00-01-07 (hex) Leiser GmbH +00-01-08 (hex) AVLAB Technology, Inc. +00-01-09 (hex) Nagano Japan Radio Co., Ltd. +00-01-0A (hex) CIS TECHNOLOGY INC. +00-01-0B (hex) Space CyberLink, Inc. +00-01-0C (hex) System Talks Inc. +00-01-0D (hex) CORECO, INC. +00-01-0E (hex) Bri-Link Technologies Co., Ltd +00-01-0F (hex) Brocade Communications Systems, Inc. +00-01-10 (hex) Gotham Networks +00-01-11 (hex) iDigm Inc. +00-01-12 (hex) Shark Multimedia Inc. +00-01-13 (hex) OLYMPUS CORPORATION +00-01-14 (hex) KANDA TSUSHIN KOGYO CO., LTD. +00-01-15 (hex) EXTRATECH CORPORATION +00-01-16 (hex) Netspect Technologies, Inc. +00-01-17 (hex) CANAL + +00-01-18 (hex) EZ Digital Co., Ltd. +00-01-19 (hex) RTUnet (Australia) +00-01-1A (hex) EEH DataLink GmbH +00-01-1B (hex) Unizone Technologies, Inc. +00-01-1C (hex) Universal Talkware Corporation +00-01-1D (hex) Centillium Communications +00-01-1E (hex) Precidia Technologies, Inc. +00-01-1F (hex) RC Networks, Inc. +00-01-20 (hex) OSCILLOQUARTZ S.A. +00-01-21 (hex) Watchguard Technologies, Inc. +00-01-22 (hex) Trend Communications, Ltd. +00-01-23 (hex) DIGITAL ELECTRONICS CORP. +00-01-24 (hex) Acer Incorporated +00-01-25 (hex) YAESU MUSEN CO., LTD. +00-01-26 (hex) PAC Labs +00-01-27 (hex) OPEN Networks Pty Ltd +00-01-28 (hex) EnjoyWeb, Inc. +00-01-29 (hex) DFI Inc. +00-01-2A (hex) Telematica Sistems Inteligente +00-01-2B (hex) TELENET Co., Ltd. +00-01-2C (hex) Aravox Technologies, Inc. +00-01-2D (hex) Komodo Technology +00-01-2E (hex) PC Partner Ltd. +00-01-2F (hex) Twinhead International Corp +00-01-30 (hex) Extreme Networks +00-01-31 (hex) Detection Systems, Inc. +00-01-32 (hex) Dranetz - BMI +00-01-33 (hex) KYOWA Electronic Instruments C +00-01-34 (hex) Selectron Systems AG +00-01-35 (hex) KDC Corp. +00-01-36 (hex) CyberTAN Technology, Inc. +00-01-37 (hex) IT Farm Corporation +00-01-38 (hex) XAVi Technologies Corp. +00-01-39 (hex) Point Multimedia Systems +00-01-3A (hex) SHELCAD COMMUNICATIONS, LTD. +00-01-3B (hex) BNA SYSTEMS +00-01-3C (hex) TIW SYSTEMS +00-01-3D (hex) RiscStation Ltd. +00-01-3E (hex) Ascom Tateco AB +00-01-3F (hex) Neighbor World Co., Ltd. +00-01-40 (hex) Sendtek Corporation +00-01-41 (hex) CABLE PRINT +00-01-42 (hex) Cisco Systems, Inc. +00-01-43 (hex) Cisco Systems, Inc. +00-01-44 (hex) EMC Corporation +00-01-45 (hex) WINSYSTEMS, INC. +00-01-46 (hex) Tesco Controls, Inc. +00-01-47 (hex) Zhone Technologies +00-01-48 (hex) X-traWeb Inc. +00-01-49 (hex) T.D.T. Transfer Data Test GmbH +00-01-4A (hex) Sony Corporation +00-01-4B (hex) Ennovate Networks, Inc. +00-01-4C (hex) Berkeley Process Control +00-01-4D (hex) Shin Kin Enterprises Co., Ltd +00-01-4E (hex) WIN Enterprises, Inc. +00-01-4F (hex) ADTRAN INC +00-01-50 (hex) GILAT COMMUNICATIONS, LTD. +00-01-51 (hex) Ensemble Communications +00-01-52 (hex) CHROMATEK INC. +00-01-53 (hex) ARCHTEK TELECOM CORPORATION +00-01-54 (hex) G3M Corporation +00-01-55 (hex) Promise Technology, Inc. +00-01-56 (hex) FIREWIREDIRECT.COM, INC. +00-01-57 (hex) SYSWAVE CO., LTD +00-01-58 (hex) Electro Industries/Gauge Tech +00-01-59 (hex) S1 Corporation +00-01-5A (hex) Digital Video Broadcasting +00-01-5B (hex) ITALTEL S.p.A/RF-UP-I +00-01-5C (hex) CADANT INC. +00-01-5D (hex) Sun Microsystems, Inc +00-01-5E (hex) BEST TECHNOLOGY CO., LTD. +00-01-5F (hex) DIGITAL DESIGN GmbH +00-01-60 (hex) ELMEX Co., LTD. +00-01-61 (hex) Meta Machine Technology +00-01-62 (hex) Cygnet Technologies, Inc. +00-01-63 (hex) Cisco Systems, Inc. +00-01-64 (hex) Cisco Systems, Inc. +00-01-65 (hex) AirSwitch Corporation +00-01-66 (hex) TC GROUP A/S +00-01-67 (hex) HIOKI E.E. CORPORATION +00-01-68 (hex) VITANA CORPORATION +00-01-69 (hex) Celestix Networks Pte Ltd. +00-01-6A (hex) ALITEC +00-01-6B (hex) LightChip, Inc. +00-01-6C (hex) FOXCONN +00-01-6D (hex) CarrierComm Inc. +00-01-6E (hex) Conklin Corporation +00-01-6F (hex) Inkel Corp. +00-01-70 (hex) ESE Embedded System Engineer'g +00-01-71 (hex) Allied Data Technologies +00-01-72 (hex) TechnoLand Co., LTD. +00-01-73 (hex) AMCC +00-01-74 (hex) CyberOptics Corporation +00-01-75 (hex) Radiant Communications Corp. +00-01-76 (hex) Orient Silver Enterprises +00-01-77 (hex) EDSL +00-01-78 (hex) MARGI Systems, Inc. +00-01-79 (hex) WIRELESS TECHNOLOGY, INC. +00-01-7A (hex) Chengdu Maipu Electric Industrial Co., Ltd. +00-01-7B (hex) Heidelberger Druckmaschinen AG +00-01-7C (hex) AG-E GmbH +00-01-7D (hex) ThermoQuest +00-01-7E (hex) ADTEK System Science Co., Ltd. +00-01-7F (hex) Experience Music Project +00-01-80 (hex) AOpen, Inc. +00-01-81 (hex) Nortel Networks +00-01-82 (hex) DICA TECHNOLOGIES AG +00-01-83 (hex) ANITE TELECOMS +00-01-84 (hex) SIEB & MEYER AG +00-01-85 (hex) Aloka Co., Ltd. +00-01-86 (hex) Uwe Disch +00-01-87 (hex) i2SE GmbH +00-01-88 (hex) LXCO Technologies ag +00-01-89 (hex) Refraction Technology, Inc. +00-01-8A (hex) ROI COMPUTER AG +00-01-8B (hex) NetLinks Co., Ltd. +00-01-8C (hex) Mega Vision +00-01-8D (hex) AudeSi Technologies +00-01-8E (hex) Logitec Corporation +00-01-8F (hex) Kenetec, Inc. +00-01-90 (hex) SMK-M +00-01-91 (hex) SYRED Data Systems +00-01-92 (hex) Texas Digital Systems +00-01-93 (hex) Hanbyul Telecom Co., Ltd. +00-01-94 (hex) Capital Equipment Corporation +00-01-95 (hex) Sena Technologies, Inc. +00-01-96 (hex) Cisco Systems, Inc. +00-01-97 (hex) Cisco Systems, Inc. +00-01-98 (hex) Darim Vision +00-01-99 (hex) HeiSei Electronics +00-01-9A (hex) LEUNIG GmbH +00-01-9B (hex) Kyoto Microcomputer Co., Ltd. +00-01-9C (hex) JDS Uniphase Inc. +00-01-9D (hex) E-Control Systems, Inc. +00-01-9E (hex) ESS Technology, Inc. +00-01-9F (hex) Phonex Broadband +00-01-A0 (hex) Infinilink Corporation +00-01-A1 (hex) Mag-Tek, Inc. +00-01-A2 (hex) Logical Co., Ltd. +00-01-A3 (hex) GENESYS LOGIC, INC. +00-01-A4 (hex) Microlink Corporation +00-01-A5 (hex) Nextcomm, Inc. +00-01-A6 (hex) Scientific-Atlanta Arcodan A/S +00-01-A7 (hex) UNEX TECHNOLOGY CORPORATION +00-01-A8 (hex) Welltech Computer Co., Ltd. +00-01-A9 (hex) BMW AG +00-01-AA (hex) Airspan Communications, Ltd. +00-01-AB (hex) Main Street Networks +00-01-AC (hex) Sitara Networks, Inc. +00-01-AD (hex) Coach Master International d.b.a. CMI Worldwide, Inc. +00-01-AE (hex) Trex Enterprises +00-01-AF (hex) Emerson Network Power +00-01-B0 (hex) Fulltek Technology Co., Ltd. +00-01-B1 (hex) General Bandwidth +00-01-B2 (hex) Digital Processing Systems, Inc. +00-01-B3 (hex) Precision Electronic Manufacturing +00-01-B4 (hex) Wayport, Inc. +00-01-B5 (hex) Turin Networks, Inc. +00-01-B6 (hex) SAEJIN T&M Co., Ltd. +00-01-B7 (hex) Centos, Inc. +00-01-B8 (hex) Netsensity, Inc. +00-01-B9 (hex) SKF Condition Monitoring +00-01-BA (hex) IC-Net, Inc. +00-01-BB (hex) Frequentis +00-01-BC (hex) Brains Corporation +00-01-BD (hex) Peterson Electro-Musical Products, Inc. +00-01-BE (hex) Gigalink Co., Ltd. +00-01-BF (hex) Teleforce Co., Ltd. +00-01-C0 (hex) CompuLab, Ltd. +00-01-C1 (hex) Vitesse Semiconductor Corporation +00-01-C2 (hex) ARK Research Corp. +00-01-C3 (hex) Acromag, Inc. +00-01-C4 (hex) NeoWave, Inc. +00-01-C5 (hex) Simpler Networks +00-01-C6 (hex) Quarry Technologies +00-01-C7 (hex) Cisco Systems, Inc. +00-01-C8 (hex) THOMAS CONRAD CORP. +00-01-C8 (hex) CONRAD CORP. +00-01-C9 (hex) Cisco Systems, Inc. +00-01-CA (hex) Geocast Network Systems, Inc. +00-01-CB (hex) EVR +00-01-CC (hex) Japan Total Design Communication Co., Ltd. +00-01-CD (hex) ARtem +00-01-CE (hex) Custom Micro Products, Ltd. +00-01-CF (hex) Alpha Data Parallel Systems, Ltd. +00-01-D0 (hex) VitalPoint, Inc. +00-01-D1 (hex) CoNet Communications, Inc. +00-01-D2 (hex) MacPower Peripherals, Ltd. +00-01-D3 (hex) PAXCOMM, Inc. +00-01-D4 (hex) Leisure Time, Inc. +00-01-D5 (hex) HAEDONG INFO & COMM CO., LTD +00-01-D6 (hex) manroland AG +00-01-D7 (hex) F5 Networks, Inc. +00-01-D8 (hex) Teltronics, Inc. +00-01-D9 (hex) Sigma, Inc. +00-01-DA (hex) WINCOMM Corporation +00-01-DB (hex) Freecom Technologies GmbH +00-01-DC (hex) Activetelco +00-01-DD (hex) Avail Networks +00-01-DE (hex) Trango Systems, Inc. +00-01-DF (hex) ISDN Communications, Ltd. +00-01-E0 (hex) Fast Systems, Inc. +00-01-E1 (hex) Kinpo Electronics, Inc. +00-01-E2 (hex) Ando Electric Corporation +00-01-E3 (hex) Siemens AG +00-01-E4 (hex) Sitera, Inc. +00-01-E5 (hex) Supernet, Inc. +00-01-E6 (hex) Hewlett-Packard Company +00-01-E7 (hex) Hewlett-Packard Company +00-01-E8 (hex) Force10 Networks, Inc. +00-01-E9 (hex) Litton Marine Systems B.V. +00-01-EA (hex) Cirilium Corp. +00-01-EB (hex) C-COM Corporation +00-01-EC (hex) Ericsson Group +00-01-ED (hex) SETA Corp. +00-01-EE (hex) Comtrol Europe, Ltd. +00-01-EF (hex) Camtel Technology Corp. +00-01-F0 (hex) Tridium, Inc. +00-01-F1 (hex) Innovative Concepts, Inc. +00-01-F2 (hex) Mark of the Unicorn, Inc. +00-01-F3 (hex) QPS, Inc. +00-01-F4 (hex) Enterasys Networks +00-01-F5 (hex) ERIM S.A. +00-01-F6 (hex) Association of Musical Electronics Industry +00-01-F7 (hex) Image Display Systems, Inc. +00-01-F8 (hex) Adherent Systems, Ltd. +00-01-F9 (hex) TeraGlobal Communications Corp. +00-01-FA (hex) HOROSCAS +00-01-FB (hex) DoTop Technology, Inc. +00-01-FC (hex) Keyence Corporation +00-01-FD (hex) Digital Voice Systems, Inc. +00-01-FE (hex) DIGITAL EQUIPMENT CORPORATION +00-01-FF (hex) Data Direct Networks, Inc. +00-02-00 (hex) Net & Sys Co., Ltd. +00-02-01 (hex) IFM Electronic gmbh +00-02-02 (hex) Amino Communications, Ltd. +00-02-03 (hex) Woonsang Telecom, Inc. +00-02-04 (hex) Bodmann Industries Elektronik GmbH +00-02-05 (hex) Hitachi Denshi, Ltd. +00-02-06 (hex) Telital R&D Denmark A/S +00-02-07 (hex) VisionGlobal Network Corp. +00-02-08 (hex) Unify Networks, Inc. +00-02-09 (hex) Shenzhen SED Information Technology Co., Ltd. +00-02-0A (hex) Gefran Spa +00-02-0B (hex) Native Networks, Inc. +00-02-0C (hex) Metro-Optix +00-02-0D (hex) Micronpc.com +00-02-0E (hex) ECI Telecom, Ltd., NSD-US +00-02-0F (hex) AATR +00-02-10 (hex) Fenecom +00-02-11 (hex) Nature Worldwide Technology Corp. +00-02-12 (hex) SierraCom +00-02-13 (hex) S.D.E.L. +00-02-14 (hex) DTVRO +00-02-15 (hex) Cotas Computer Technology A/B +00-02-16 (hex) Cisco Systems, Inc. +00-02-17 (hex) Cisco Systems, Inc. +00-02-18 (hex) Advanced Scientific Corp +00-02-19 (hex) Paralon Technologies +00-02-1A (hex) Zuma Networks +00-02-1B (hex) Kollmorgen-Servotronix +00-02-1C (hex) Network Elements, Inc. +00-02-1D (hex) Data General Communication Ltd. +00-02-1E (hex) SIMTEL S.R.L. +00-02-1F (hex) Aculab PLC +00-02-20 (hex) Canon Aptex, Inc. +00-02-21 (hex) DSP Application, Ltd. +00-02-22 (hex) Chromisys, Inc. +00-02-23 (hex) ClickTV +00-02-24 (hex) C-COR +00-02-25 (hex) One Stop Systems +00-02-26 (hex) XESystems, Inc. +00-02-27 (hex) ESD Electronic System Design GmbH +00-02-28 (hex) Necsom, Ltd. +00-02-29 (hex) Adtec Corporation +00-02-2A (hex) Asound Electronic +00-02-2B (hex) SAXA, Inc. +00-02-2C (hex) ABB Bomem, Inc. +00-02-2D (hex) Agere Systems +00-02-2E (hex) TEAC Corp. R& D +00-02-2F (hex) P-Cube, Ltd. +00-02-30 (hex) Intersoft Electronics +00-02-31 (hex) Ingersoll-Rand +00-02-32 (hex) Avision, Inc. +00-02-33 (hex) Mantra Communications, Inc. +00-02-34 (hex) Imperial Technology, Inc. +00-02-35 (hex) Paragon Networks International +00-02-36 (hex) INIT GmbH +00-02-37 (hex) Cosmo Research Corp. +00-02-38 (hex) Serome Technology, Inc. +00-02-39 (hex) Visicom +00-02-3A (hex) ZSK Stickmaschinen GmbH +00-02-3B (hex) Redback Networks +00-02-3C (hex) Creative Technology, Ltd. +00-02-3D (hex) NuSpeed, Inc. +00-02-3E (hex) Selta Telematica S.p.a +00-02-3F (hex) Compal Electronics, Inc. +00-02-40 (hex) Seedek Co., Ltd. +00-02-41 (hex) Amer.com +00-02-42 (hex) Videoframe Systems +00-02-43 (hex) Raysis Co., Ltd. +00-02-44 (hex) SURECOM Technology Co. +00-02-45 (hex) Lampus Co, Ltd. +00-02-46 (hex) All-Win Tech Co., Ltd. +00-02-47 (hex) Great Dragon Information Technology (Group) Co., Ltd. +00-02-48 (hex) Pilz GmbH & Co. +00-02-49 (hex) Aviv Infocom Co, Ltd. +00-02-4A (hex) Cisco Systems, Inc. +00-02-4B (hex) Cisco Systems, Inc. +00-02-4C (hex) SiByte, Inc. +00-02-4D (hex) Mannesman Dematic Colby Pty. Ltd. +00-02-4E (hex) Datacard Group +00-02-4F (hex) IPM Datacom S.R.L. +00-02-50 (hex) Geyser Networks, Inc. +00-02-51 (hex) Soma Networks, Inc. +00-02-52 (hex) Carrier Corporation +00-02-53 (hex) Televideo, Inc. +00-02-54 (hex) WorldGate +00-02-55 (hex) IBM Corporation +00-02-56 (hex) Alpha Processor, Inc. +00-02-57 (hex) Microcom Corp. +00-02-58 (hex) Flying Packets Communications +00-02-59 (hex) Tsann Kuen China (Shanghai)Enterprise Co., Ltd. IT Group +00-02-5A (hex) Catena Networks +00-02-5B (hex) Cambridge Silicon Radio +00-02-5C (hex) SCI Systems (Kunshan) Co., Ltd. +00-02-5D (hex) Calix Networks +00-02-5E (hex) High Technology Ltd +00-02-5F (hex) Nortel Networks +00-02-60 (hex) Accordion Networks, Inc. +00-02-61 (hex) Tilgin AB +00-02-62 (hex) Soyo Group Soyo Com Tech Co., Ltd +00-02-63 (hex) UPS Manufacturing SRL +00-02-64 (hex) AudioRamp.com +00-02-65 (hex) Virditech Co. Ltd. +00-02-66 (hex) Thermalogic Corporation +00-02-67 (hex) NODE RUNNER, INC. +00-02-68 (hex) Harris Government Communications +00-02-69 (hex) Nadatel Co., Ltd +00-02-6A (hex) Cocess Telecom Co., Ltd. +00-02-6B (hex) BCM Computers Co., Ltd. +00-02-6C (hex) Philips CFT +00-02-6D (hex) Adept Telecom +00-02-6E (hex) NeGeN Access, Inc. +00-02-6F (hex) Senao International Co., Ltd. +00-02-70 (hex) Crewave Co., Ltd. +00-02-71 (hex) Vpacket Communications +00-02-72 (hex) CC&C Technologies, Inc. +00-02-73 (hex) Coriolis Networks +00-02-74 (hex) Tommy Technologies Corp. +00-02-75 (hex) SMART Technologies, Inc. +00-02-76 (hex) Primax Electronics Ltd. +00-02-77 (hex) Cash Systemes Industrie +00-02-78 (hex) Samsung Electro-Mechanics Co., Ltd. +00-02-79 (hex) Control Applications, Ltd. +00-02-7A (hex) IOI Technology Corporation +00-02-7B (hex) Amplify Net, Inc. +00-02-7C (hex) Trilithic, Inc. +00-02-7D (hex) Cisco Systems, Inc. +00-02-7E (hex) Cisco Systems, Inc. +00-02-7F (hex) ask-technologies.com +00-02-80 (hex) Mu Net, Inc. +00-02-81 (hex) Madge Ltd. +00-02-82 (hex) ViaClix, Inc. +00-02-83 (hex) Spectrum Controls, Inc. +00-02-84 (hex) AREVA T&D +00-02-85 (hex) Riverstone Networks +00-02-86 (hex) Occam Networks +00-02-87 (hex) Adapcom +00-02-88 (hex) GLOBAL VILLAGE COMMUNICATION +00-02-89 (hex) DNE Technologies +00-02-8A (hex) Ambit Microsystems Corporation +00-02-8B (hex) VDSL Systems OY +00-02-8C (hex) Micrel-Synergy Semiconductor +00-02-8D (hex) Movita Technologies, Inc. +00-02-8E (hex) Rapid 5 Networks, Inc. +00-02-8F (hex) Globetek, Inc. +00-02-90 (hex) Woorigisool, Inc. +00-02-91 (hex) Open Network Co., Ltd. +00-02-92 (hex) Logic Innovations, Inc. +00-02-93 (hex) Solid Data Systems +00-02-94 (hex) Tokyo Sokushin Co., Ltd. +00-02-95 (hex) IP.Access Limited +00-02-96 (hex) Lectron Co,. Ltd. +00-02-97 (hex) C-COR.net +00-02-98 (hex) Broadframe Corporation +00-02-99 (hex) Apex, Inc. +00-02-9A (hex) Storage Apps +00-02-9B (hex) Kreatel Communications AB +00-02-9C (hex) 3COM +00-02-9D (hex) Merix Corp. +00-02-9E (hex) Information Equipment Co., Ltd. +00-02-9F (hex) L-3 Communication Aviation Recorders +00-02-A0 (hex) Flatstack Ltd. +00-02-A1 (hex) World Wide Packets +00-02-A2 (hex) Hilscher GmbH +00-02-A3 (hex) ABB Switzerland Ltd, Power Systems +00-02-A4 (hex) AddPac Technology Co., Ltd. +00-02-A5 (hex) Hewlett Packard +00-02-A6 (hex) Effinet Systems Co., Ltd. +00-02-A7 (hex) Vivace Networks +00-02-A8 (hex) Air Link Technology +00-02-A9 (hex) RACOM, s.r.o. +00-02-AA (hex) PLcom Co., Ltd. +00-02-AB (hex) CTC Union Technologies Co., Ltd. +00-02-AC (hex) 3PAR data +00-02-AD (hex) HOYA Corporation +00-02-AE (hex) Scannex Electronics Ltd. +00-02-AF (hex) TeleCruz Technology, Inc. +00-02-B0 (hex) Hokubu Communication & Industrial Co., Ltd. +00-02-B1 (hex) Anritsu, Ltd. +00-02-B2 (hex) Cablevision +00-02-B3 (hex) Intel Corporation +00-02-B4 (hex) DAPHNE +00-02-B5 (hex) Avnet, Inc. +00-02-B6 (hex) Acrosser Technology Co., Ltd. +00-02-B7 (hex) Watanabe Electric Industry Co., Ltd. +00-02-B8 (hex) WHI KONSULT AB +00-02-B9 (hex) Cisco Systems, Inc. +00-02-BA (hex) Cisco Systems, Inc. +00-02-BB (hex) Continuous Computing Corp +00-02-BC (hex) LVL 7 Systems, Inc. +00-02-BD (hex) Bionet Co., Ltd. +00-02-BE (hex) Totsu Engineering, Inc. +00-02-BF (hex) dotRocket, Inc. +00-02-C0 (hex) Bencent Tzeng Industry Co., Ltd. +00-02-C1 (hex) Innovative Electronic Designs, Inc. +00-02-C2 (hex) Net Vision Telecom +00-02-C3 (hex) Arelnet Ltd. +00-02-C4 (hex) Vector International BVBA +00-02-C5 (hex) Evertz Microsystems Ltd. +00-02-C6 (hex) Data Track Technology PLC +00-02-C7 (hex) ALPS ELECTRIC Co., Ltd. +00-02-C8 (hex) Technocom Communications Technology (pte) Ltd +00-02-C9 (hex) Mellanox Technologies +00-02-CA (hex) EndPoints, Inc. +00-02-CB (hex) TriState Ltd. +00-02-CC (hex) M.C.C.I +00-02-CD (hex) TeleDream, Inc. +00-02-CE (hex) FoxJet, Inc. +00-02-CF (hex) ZyGate Communications, Inc. +00-02-D0 (hex) Comdial Corporation +00-02-D1 (hex) Vivotek, Inc. +00-02-D2 (hex) Workstation AG +00-02-D3 (hex) NetBotz, Inc. +00-02-D4 (hex) PDA Peripherals, Inc. +00-02-D5 (hex) ACR +00-02-D6 (hex) NICE Systems +00-02-D7 (hex) EMPEG Ltd +00-02-D8 (hex) BRECIS Communications Corporation +00-02-D9 (hex) Reliable Controls +00-02-DA (hex) ExiO Communications, Inc. +00-02-DB (hex) NETSEC +00-02-DC (hex) Fujitsu General Limited +00-02-DD (hex) Bromax Communications, Ltd. +00-02-DE (hex) Astrodesign, Inc. +00-02-DF (hex) Net Com Systems, Inc. +00-02-E0 (hex) ETAS GmbH +00-02-E1 (hex) Integrated Network Corporation +00-02-E2 (hex) NDC Infared Engineering +00-02-E3 (hex) LITE-ON Communications, Inc. +00-02-E4 (hex) JC HYUN Systems, Inc. +00-02-E5 (hex) Timeware Ltd. +00-02-E6 (hex) Gould Instrument Systems, Inc. +00-02-E7 (hex) CAB GmbH & Co KG +00-02-E8 (hex) E.D.&A. +00-02-E9 (hex) CS Systemes De Securite - C3S +00-02-EA (hex) Focus Enhancements +00-02-EB (hex) Pico Communications +00-02-EC (hex) Maschoff Design Engineering +00-02-ED (hex) DXO Telecom Co., Ltd. +00-02-EE (hex) Nokia Danmark A/S +00-02-EF (hex) CCC Network Systems Group Ltd. +00-02-F0 (hex) AME Optimedia Technology Co., Ltd. +00-02-F1 (hex) Pinetron Co., Ltd. +00-02-F2 (hex) eDevice, Inc. +00-02-F3 (hex) Media Serve Co., Ltd. +00-02-F4 (hex) PCTEL, Inc. +00-02-F5 (hex) VIVE Synergies, Inc. +00-02-F6 (hex) Equipe Communications +00-02-F7 (hex) ARM +00-02-F8 (hex) SEAKR Engineering, Inc. +00-02-F9 (hex) Mimos Semiconductor SDN BHD +00-02-FA (hex) DX Antenna Co., Ltd. +00-02-FB (hex) Baumuller Aulugen-Systemtechnik GmbH +00-02-FC (hex) Cisco Systems, Inc. +00-02-FD (hex) Cisco Systems, Inc. +00-02-FE (hex) Viditec, Inc. +00-02-FF (hex) Handan BroadInfoCom +00-03-00 (hex) NetContinuum, Inc. +00-03-01 (hex) Avantas Networks Corporation +00-03-02 (hex) Charles Industries, Ltd. +00-03-03 (hex) JAMA Electronics Co., Ltd. +00-03-04 (hex) Pacific Broadband Communications +00-03-05 (hex) MSC Vertriebs GmbH +00-03-06 (hex) Fusion In Tech Co., Ltd. +00-03-07 (hex) Secure Works, Inc. +00-03-08 (hex) AM Communications, Inc. +00-03-09 (hex) Texcel Technology PLC +00-03-0A (hex) Argus Technologies +00-03-0B (hex) Hunter Technology, Inc. +00-03-0C (hex) Telesoft Technologies Ltd. +00-03-0D (hex) Uniwill Computer Corp. +00-03-0E (hex) Core Communications Co., Ltd. +00-03-0F (hex) Digital China (Shanghai) Networks Ltd. +00-03-10 (hex) ITX E-Globaledge Corporation +00-03-11 (hex) Micro Technology Co., Ltd. +00-03-12 (hex) TR-Systemtechnik GmbH +00-03-13 (hex) Access Media SPA +00-03-14 (hex) Teleware Network Systems +00-03-15 (hex) Cidco Incorporated +00-03-16 (hex) Nobell Communications, Inc. +00-03-17 (hex) Merlin Systems, Inc. +00-03-18 (hex) Cyras Systems, Inc. +00-03-19 (hex) Infineon AG +00-03-1A (hex) Beijing Broad Telecom Ltd., China +00-03-1B (hex) Cellvision Systems, Inc. +00-03-1C (hex) Svenska Hardvarufabriken AB +00-03-1D (hex) Taiwan Commate Computer, Inc. +00-03-1E (hex) Optranet, Inc. +00-03-1F (hex) Condev Ltd. +00-03-20 (hex) Xpeed, Inc. +00-03-21 (hex) Reco Research Co., Ltd. +00-03-22 (hex) IDIS Co., Ltd. +00-03-23 (hex) Cornet Technology, Inc. +00-03-24 (hex) SANYO Consumer Electronics Co., Ltd. +00-03-25 (hex) Arima Computer Corp. +00-03-26 (hex) Iwasaki Information Systems Co., Ltd. +00-03-27 (hex) ACT'L +00-03-28 (hex) Mace Group, Inc. +00-03-29 (hex) F3, Inc. +00-03-2A (hex) UniData Communication Systems, Inc. +00-03-2B (hex) GAI Datenfunksysteme GmbH +00-03-2C (hex) ABB Switzerland Ltd +00-03-2D (hex) IBASE Technology, Inc. +00-03-2E (hex) Scope Information Management, Ltd. +00-03-2F (hex) Global Sun Technology, Inc. +00-03-30 (hex) Imagenics, Co., Ltd. +00-03-31 (hex) Cisco Systems, Inc. +00-03-32 (hex) Cisco Systems, Inc. +00-03-33 (hex) Digitel Co., Ltd. +00-03-34 (hex) Newport Electronics +00-03-35 (hex) Mirae Technology +00-03-36 (hex) Zetes Technologies +00-03-37 (hex) Vaone, Inc. +00-03-38 (hex) Oak Technology +00-03-39 (hex) Eurologic Systems, Ltd. +00-03-3A (hex) Silicon Wave, Inc. +00-03-3B (hex) TAMI Tech Co., Ltd. +00-03-3C (hex) Daiden Co., Ltd. +00-03-3D (hex) ILSHin Lab +00-03-3E (hex) Tateyama System Laboratory Co., Ltd. +00-03-3F (hex) BigBand Networks, Ltd. +00-03-40 (hex) Floware Wireless Systems, Ltd. +00-03-41 (hex) Axon Digital Design +00-03-42 (hex) Nortel Networks +00-03-43 (hex) Martin Professional A/S +00-03-44 (hex) Tietech.Co., Ltd. +00-03-45 (hex) Routrek Networks Corporation +00-03-46 (hex) Hitachi Kokusai Electric, Inc. +00-03-47 (hex) Intel Corporation +00-03-48 (hex) Norscan Instruments, Ltd. +00-03-49 (hex) Vidicode Datacommunicatie B.V. +00-03-4A (hex) RIAS Corporation +00-03-4B (hex) Nortel Networks +00-03-4C (hex) Shanghai DigiVision Technology Co., Ltd. +00-03-4D (hex) Chiaro Networks, Ltd. +00-03-4E (hex) Pos Data Company, Ltd. +00-03-4F (hex) Sur-Gard Security +00-03-50 (hex) BTICINO SPA +00-03-51 (hex) Diebold, Inc. +00-03-52 (hex) Colubris Networks +00-03-53 (hex) Mitac, Inc. +00-03-54 (hex) Fiber Logic Communications +00-03-55 (hex) TeraBeam Internet Systems +00-03-56 (hex) Wincor Nixdorf International GmbH +00-03-57 (hex) Intervoice-Brite, Inc. +00-03-58 (hex) Hanyang Digitech Co., Ltd. +00-03-59 (hex) DigitalSis +00-03-5A (hex) Photron Limited +00-03-5B (hex) BridgeWave Communications +00-03-5C (hex) Saint Song Corp. +00-03-5D (hex) Bosung Hi-Net Co., Ltd. +00-03-5E (hex) Metropolitan Area Networks, Inc. +00-03-5F (hex) Prueftechnik Condition Monitoring GmbH & Co. KG +00-03-60 (hex) PAC Interactive Technology, Inc. +00-03-61 (hex) Widcomm, Inc. +00-03-62 (hex) Vodtel Communications, Inc. +00-03-63 (hex) Miraesys Co., Ltd. +00-03-64 (hex) Scenix Semiconductor, Inc. +00-03-65 (hex) Kira Information & Communications, Ltd. +00-03-66 (hex) ASM Pacific Technology +00-03-67 (hex) Jasmine Networks, Inc. +00-03-68 (hex) Embedone Co., Ltd. +00-03-69 (hex) Nippon Antenna Co., Ltd. +00-03-6A (hex) Mainnet, Ltd. +00-03-6B (hex) Cisco Systems, Inc. +00-03-6C (hex) Cisco Systems, Inc. +00-03-6D (hex) Runtop, Inc. +00-03-6E (hex) Nicon Systems (Pty) Limited +00-03-6F (hex) Telsey SPA +00-03-70 (hex) NXTV, Inc. +00-03-71 (hex) Acomz Networks Corp. +00-03-72 (hex) ULAN +00-03-73 (hex) Aselsan A.S +00-03-74 (hex) Control Microsystems +00-03-75 (hex) NetMedia, Inc. +00-03-76 (hex) Graphtec Technology, Inc. +00-03-77 (hex) Gigabit Wireless +00-03-78 (hex) HUMAX Co., Ltd. +00-03-79 (hex) Proscend Communications, Inc. +00-03-7A (hex) Taiyo Yuden Co., Ltd. +00-03-7B (hex) IDEC IZUMI Corporation +00-03-7C (hex) Coax Media +00-03-7D (hex) Stellcom +00-03-7E (hex) PORTech Communications, Inc. +00-03-7F (hex) Atheros Communications, Inc. +00-03-80 (hex) SSH Communications Security Corp. +00-03-81 (hex) Ingenico International +00-03-82 (hex) A-One Co., Ltd. +00-03-83 (hex) Metera Networks, Inc. +00-03-84 (hex) AETA +00-03-85 (hex) Actelis Networks, Inc. +00-03-86 (hex) Ho Net, Inc. +00-03-87 (hex) Blaze Network Products +00-03-88 (hex) Fastfame Technology Co., Ltd. +00-03-89 (hex) Plantronics +00-03-8A (hex) America Online, Inc. +00-03-8B (hex) PLUS-ONE I&T, Inc. +00-03-8C (hex) Total Impact +00-03-8D (hex) PCS Revenue Control Systems, Inc. +00-03-8E (hex) Atoga Systems, Inc. +00-03-8F (hex) Weinschel Corporation +00-03-90 (hex) Digital Video Communications, Inc. +00-03-91 (hex) Advanced Digital Broadcast, Ltd. +00-03-92 (hex) Hyundai Teletek Co., Ltd. +00-03-93 (hex) Apple Computer, Inc. +00-03-94 (hex) Connect One +00-03-95 (hex) California Amplifier +00-03-96 (hex) EZ Cast Co., Ltd. +00-03-97 (hex) Watchfront Limited +00-03-98 (hex) WISI +00-03-99 (hex) Dongju Informations & Communications Co., Ltd. +00-03-9A (hex) SiConnect +00-03-9B (hex) NetChip Technology, Inc. +00-03-9C (hex) OptiMight Communications, Inc. +00-03-9D (hex) Qisda Corporation +00-03-9E (hex) Tera System Co., Ltd. +00-03-9F (hex) Cisco Systems, Inc. +00-03-A0 (hex) Cisco Systems, Inc. +00-03-A1 (hex) HIPER Information & Communication, Inc. +00-03-A2 (hex) Catapult Communications +00-03-A3 (hex) MAVIX, Ltd. +00-03-A4 (hex) Imation Corp. +00-03-A5 (hex) Medea Corporation +00-03-A6 (hex) Traxit Technology, Inc. +00-03-A7 (hex) Unixtar Technology, Inc. +00-03-A8 (hex) IDOT Computers, Inc. +00-03-A9 (hex) AXCENT Media AG +00-03-AA (hex) Watlow +00-03-AB (hex) Bridge Information Systems +00-03-AC (hex) Fronius Schweissmaschinen +00-03-AD (hex) Emerson Energy Systems AB +00-03-AE (hex) Allied Advanced Manufacturing Pte, Ltd. +00-03-AF (hex) Paragea Communications +00-03-B0 (hex) Xsense Technology Corp. +00-03-B1 (hex) Hospira Inc. +00-03-B2 (hex) Radware +00-03-B3 (hex) IA Link Systems Co., Ltd. +00-03-B4 (hex) Macrotek International Corp. +00-03-B5 (hex) Entra Technology Co. +00-03-B6 (hex) QSI Corporation +00-03-B7 (hex) ZACCESS Systems +00-03-B8 (hex) NetKit Solutions, LLC +00-03-B9 (hex) Hualong Telecom Co., Ltd. +00-03-BA (hex) Sun Microsystems Inc. +00-03-BB (hex) Signal Communications Limited +00-03-BC (hex) COT GmbH +00-03-BD (hex) OmniCluster Technologies, Inc. +00-03-BE (hex) Netility +00-03-BF (hex) Centerpoint Broadband Technologies, Inc. +00-03-C0 (hex) RFTNC Co., Ltd. +00-03-C1 (hex) Packet Dynamics Ltd +00-03-C2 (hex) Solphone K.K. +00-03-C3 (hex) Micronik Multimedia +00-03-C4 (hex) Tomra Systems ASA +00-03-C5 (hex) Mobotix AG +00-03-C6 (hex) ICUE Systems, Inc. +00-03-C7 (hex) hopf Elektronik GmbH +00-03-C8 (hex) CML Emergency Services +00-03-C9 (hex) TECOM Co., Ltd. +00-03-CA (hex) MTS Systems Corp. +00-03-CB (hex) Nippon Systems Development Co., Ltd. +00-03-CC (hex) Momentum Computer, Inc. +00-03-CD (hex) Clovertech, Inc. +00-03-CE (hex) ETEN Technologies, Inc. +00-03-CF (hex) Muxcom, Inc. +00-03-D0 (hex) KOANKEISO Co., Ltd. +00-03-D1 (hex) Takaya Corporation +00-03-D2 (hex) Crossbeam Systems, Inc. +00-03-D3 (hex) Internet Energy Systems, Inc. +00-03-D4 (hex) Alloptic, Inc. +00-03-D5 (hex) Advanced Communications Co., Ltd. +00-03-D6 (hex) RADVision, Ltd. +00-03-D7 (hex) NextNet Wireless, Inc. +00-03-D8 (hex) iMPath Networks, Inc. +00-03-D9 (hex) Secheron SA +00-03-DA (hex) Takamisawa Cybernetics Co., Ltd. +00-03-DB (hex) Apogee Electronics Corp. +00-03-DC (hex) Lexar Media, Inc. +00-03-DD (hex) Comark Corp. +00-03-DE (hex) OTC Wireless +00-03-DF (hex) Desana Systems +00-03-E0 (hex) RadioFrame Networks, Inc. +00-03-E1 (hex) Winmate Communication, Inc. +00-03-E2 (hex) Comspace Corporation +00-03-E3 (hex) Cisco Systems, Inc. +00-03-E4 (hex) Cisco Systems, Inc. +00-03-E5 (hex) Hermstedt SG +00-03-E6 (hex) Entone, Inc. +00-03-E7 (hex) Logostek Co. Ltd. +00-03-E8 (hex) Wavelength Digital Limited +00-03-E9 (hex) Akara Canada, Inc. +00-03-EA (hex) Mega System Technologies, Inc. +00-03-EB (hex) Atrica +00-03-EC (hex) ICG Research, Inc. +00-03-ED (hex) Shinkawa Electric Co., Ltd. +00-03-EE (hex) MKNet Corporation +00-03-EF (hex) Oneline AG +00-03-F0 (hex) Redfern Broadband Networks +00-03-F1 (hex) Cicada Semiconductor, Inc. +00-03-F2 (hex) Seneca Networks +00-03-F3 (hex) Dazzle Multimedia, Inc. +00-03-F4 (hex) NetBurner +00-03-F5 (hex) Chip2Chip +00-03-F6 (hex) Allegro Networks, Inc. +00-03-F7 (hex) Plast-Control GmbH +00-03-F8 (hex) SanCastle Technologies, Inc. +00-03-F9 (hex) Pleiades Communications, Inc. +00-03-FA (hex) TiMetra Networks +00-03-FB (hex) ENEGATE Co.,Ltd. +00-03-FC (hex) Intertex Data AB +00-03-FD (hex) Cisco Systems, Inc. +00-03-FE (hex) Cisco Systems, Inc. +00-03-FF (hex) Microsoft Corporation +00-04-00 (hex) LEXMARK INTERNATIONAL, INC. +00-04-01 (hex) Osaki Electric Co., Ltd. +00-04-02 (hex) Nexsan Technologies, Ltd. +00-04-03 (hex) Nexsi Corporation +00-04-04 (hex) Makino Milling Machine Co., Ltd. +00-04-05 (hex) ACN Technologies +00-04-06 (hex) Fa. Metabox AG +00-04-07 (hex) Topcon Positioning Systems, Inc. +00-04-08 (hex) Sanko Electronics Co., Ltd. +00-04-09 (hex) Cratos Networks +00-04-0A (hex) Sage Systems +00-04-0B (hex) 3com Europe Ltd. +00-04-0C (hex) KANNO Work's Ltd. +00-04-0D (hex) Avaya, Inc. +00-04-0E (hex) AVM GmbH +00-04-0F (hex) Asus Network Technologies, Inc. +00-04-10 (hex) Spinnaker Networks, Inc. +00-04-11 (hex) Inkra Networks, Inc. +00-04-12 (hex) WaveSmith Networks, Inc. +00-04-13 (hex) SNOM Technology AG +00-04-14 (hex) Umezawa Musen Denki Co., Ltd. +00-04-15 (hex) Rasteme Systems Co., Ltd. +00-04-16 (hex) Parks S/A Comunicacoes Digitais +00-04-17 (hex) ELAU AG +00-04-18 (hex) Teltronic S.A.U. +00-04-19 (hex) Fibercycle Networks, Inc. +00-04-1A (hex) Ines Test and Measurement GmbH & CoKG +00-04-1B (hex) Bridgeworks Ltd. +00-04-1C (hex) ipDialog, Inc. +00-04-1D (hex) Corega of America +00-04-1E (hex) Shikoku Instrumentation Co., Ltd. +00-04-1F (hex) Sony Computer Entertainment, Inc. +00-04-20 (hex) Slim Devices, Inc. +00-04-21 (hex) Ocular Networks +00-04-22 (hex) Gordon Kapes, Inc. +00-04-23 (hex) Intel Corporation +00-04-24 (hex) TMC s.r.l. +00-04-25 (hex) Atmel Corporation +00-04-26 (hex) Autosys +00-04-27 (hex) Cisco Systems, Inc. +00-04-28 (hex) Cisco Systems, Inc. +00-04-29 (hex) Pixord Corporation +00-04-2A (hex) Wireless Networks, Inc. +00-04-2B (hex) IT Access Co., Ltd. +00-04-2C (hex) Minet, Inc. +00-04-2D (hex) Sarian Systems, Ltd. +00-04-2E (hex) Netous Technologies, Ltd. +00-04-2F (hex) International Communications Products, Inc. +00-04-30 (hex) Netgem +00-04-31 (hex) GlobalStreams, Inc. +00-04-32 (hex) Voyetra Turtle Beach, Inc. +00-04-33 (hex) Cyberboard A/S +00-04-34 (hex) Accelent Systems, Inc. +00-04-35 (hex) Comptek International, Inc. +00-04-36 (hex) ELANsat Technologies, Inc. +00-04-37 (hex) Powin Information Technology, Inc. +00-04-38 (hex) Nortel Networks +00-04-39 (hex) Rosco Entertainment Technology, Inc. +00-04-3A (hex) Intelligent Telecommunications, Inc. +00-04-3B (hex) Lava Computer Mfg., Inc. +00-04-3C (hex) SONOS Co., Ltd. +00-04-3D (hex) INDEL AG +00-04-3E (hex) Telencomm +00-04-3F (hex) ESTeem Wireless Modems, Inc +00-04-40 (hex) cyberPIXIE, Inc. +00-04-41 (hex) Half Dome Systems, Inc. +00-04-42 (hex) NACT +00-04-43 (hex) Agilent Technologies, Inc. +00-04-44 (hex) Western Multiplex Corporation +00-04-45 (hex) LMS Skalar Instruments GmbH +00-04-46 (hex) CYZENTECH Co., Ltd. +00-04-47 (hex) Acrowave Systems Co., Ltd. +00-04-48 (hex) Polaroid Corporation +00-04-49 (hex) Mapletree Networks +00-04-4A (hex) iPolicy Networks, Inc. +00-04-4B (hex) NVIDIA +00-04-4C (hex) JENOPTIK +00-04-4D (hex) Cisco Systems, Inc. +00-04-4E (hex) Cisco Systems, Inc. +00-04-4F (hex) Leukhardt Systemelektronik GmbH +00-04-50 (hex) DMD Computers SRL +00-04-51 (hex) Medrad, Inc. +00-04-52 (hex) RocketLogix, Inc. +00-04-53 (hex) YottaYotta, Inc. +00-04-54 (hex) Quadriga UK +00-04-55 (hex) ANTARA.net +00-04-56 (hex) Motorola PTP Inc +00-04-57 (hex) Universal Access Technology, Inc. +00-04-58 (hex) Fusion X Co., Ltd. +00-04-59 (hex) Veristar Corporation +00-04-5A (hex) The Linksys Group, Inc. +00-04-5B (hex) Techsan Electronics Co., Ltd. +00-04-5C (hex) Mobiwave Pte Ltd +00-04-5D (hex) BEKA Elektronik +00-04-5E (hex) PolyTrax Information Technology AG +00-04-5F (hex) Evalue Technology, Inc. +00-04-60 (hex) Knilink Technology, Inc. +00-04-61 (hex) EPOX Computer Co., Ltd. +00-04-62 (hex) DAKOS Data & Communication Co., Ltd. +00-04-63 (hex) Bosch Security Systems +00-04-64 (hex) Fantasma Networks, Inc. +00-04-65 (hex) i.s.t isdn-support technik GmbH +00-04-66 (hex) ARMITEL Co. +00-04-67 (hex) Wuhan Research Institute of MII +00-04-68 (hex) Vivity, Inc. +00-04-69 (hex) Innocom, Inc. +00-04-6A (hex) Navini Networks +00-04-6B (hex) Palm Wireless, Inc. +00-04-6C (hex) Cyber Technology Co., Ltd. +00-04-6D (hex) Cisco Systems, Inc. +00-04-6E (hex) Cisco Systems, Inc. +00-04-6F (hex) Digitel S/A Industria Eletronica +00-04-70 (hex) ipUnplugged AB +00-04-71 (hex) IPrad +00-04-72 (hex) Telelynx, Inc. +00-04-73 (hex) Photonex Corporation +00-04-74 (hex) LEGRAND +00-04-75 (hex) 3 Com Corporation +00-04-76 (hex) 3 Com Corporation +00-04-77 (hex) Scalant Systems, Inc. +00-04-78 (hex) G. Star Technology Corporation +00-04-79 (hex) Radius Co., Ltd. +00-04-7A (hex) AXXESSIT ASA +00-04-7B (hex) Schlumberger +00-04-7C (hex) Skidata AG +00-04-7D (hex) Pelco +00-04-7E (hex) Optelecom=NKF +00-04-7F (hex) Chr. Mayr GmbH & Co. KG +00-04-80 (hex) Brocade Communications Systems, Inc +00-04-81 (hex) Econolite Control Products, Inc. +00-04-82 (hex) Medialogic Corp. +00-04-83 (hex) Deltron Technology, Inc. +00-04-84 (hex) Amann GmbH +00-04-85 (hex) PicoLight +00-04-86 (hex) ITTC, University of Kansas +00-04-87 (hex) Cogency Semiconductor, Inc. +00-04-88 (hex) Eurotherm Controls +00-04-89 (hex) YAFO Networks, Inc. +00-04-8A (hex) Temia Vertriebs GmbH +00-04-8B (hex) Poscon Corporation +00-04-8C (hex) Nayna Networks, Inc. +00-04-8D (hex) Tone Commander Systems, Inc. +00-04-8E (hex) Ohm Tech Labs, Inc. +00-04-8F (hex) TD Systems Corporation +00-04-90 (hex) Optical Access +00-04-91 (hex) Technovision, Inc. +00-04-92 (hex) Hive Internet, Ltd. +00-04-93 (hex) Tsinghua Unisplendour Co., Ltd. +00-04-94 (hex) Breezecom, Ltd. +00-04-95 (hex) Tejas Networks India Limited +00-04-96 (hex) Extreme Networks +00-04-97 (hex) MacroSystem Digital Video AG +00-04-98 (hex) Mahi Networks +00-04-99 (hex) Chino Corporation +00-04-9A (hex) Cisco Systems, Inc. +00-04-9B (hex) Cisco Systems, Inc. +00-04-9C (hex) Surgient Networks, Inc. +00-04-9D (hex) Ipanema Technologies +00-04-9E (hex) Wirelink Co., Ltd. +00-04-9F (hex) Freescale Semiconductor +00-04-A0 (hex) Verity Instruments, Inc. +00-04-A1 (hex) Pathway Connectivity +00-04-A2 (hex) L.S.I. Japan Co., Ltd. +00-04-A3 (hex) Microchip Technology, Inc. +00-04-A4 (hex) NetEnabled, Inc. +00-04-A5 (hex) Barco Projection Systems NV +00-04-A6 (hex) SAF Tehnika Ltd. +00-04-A7 (hex) FabiaTech Corporation +00-04-A8 (hex) Broadmax Technologies, Inc. +00-04-A9 (hex) SandStream Technologies, Inc. +00-04-AA (hex) Jetstream Communications +00-04-AB (hex) Comverse Network Systems, Inc. +00-04-AC (hex) IBM CORP. +00-04-AD (hex) Malibu Networks +00-04-AE (hex) Sullair Corporation +00-04-AF (hex) Digital Fountain, Inc. +00-04-B0 (hex) ELESIGN Co., Ltd. +00-04-B1 (hex) Signal Technology, Inc. +00-04-B2 (hex) ESSEGI SRL +00-04-B3 (hex) Videotek, Inc. +00-04-B4 (hex) CIAC +00-04-B5 (hex) Equitrac Corporation +00-04-B6 (hex) Stratex Networks, Inc. +00-04-B7 (hex) AMB i.t. Holding +00-04-B8 (hex) Kumahira Co., Ltd. +00-04-B9 (hex) S.I. Soubou, Inc. +00-04-BA (hex) KDD Media Will Corporation +00-04-BB (hex) Bardac Corporation +00-04-BC (hex) Giantec, Inc. +00-04-BD (hex) Motorola BCS +00-04-BE (hex) OptXCon, Inc. +00-04-BF (hex) VersaLogic Corp. +00-04-C0 (hex) Cisco Systems, Inc. +00-04-C1 (hex) Cisco Systems, Inc. +00-04-C2 (hex) Magnipix, Inc. +00-04-C3 (hex) CASTOR Informatique +00-04-C4 (hex) Allen & Heath Limited +00-04-C5 (hex) ASE Technologies, USA +00-04-C6 (hex) Yamaha Motor Co., Ltd. +00-04-C7 (hex) NetMount +00-04-C8 (hex) LIBA Maschinenfabrik GmbH +00-04-C9 (hex) Micro Electron Co., Ltd. +00-04-CA (hex) FreeMs Corp. +00-04-CB (hex) Tdsoft Communication, Ltd. +00-04-CC (hex) Peek Traffic B.V. +00-04-CD (hex) Informedia Research Group +00-04-CE (hex) Patria Ailon +00-04-CF (hex) Seagate Technology +00-04-D0 (hex) Softlink s.r.o. +00-04-D1 (hex) Drew Technologies, Inc. +00-04-D2 (hex) Adcon Telemetry GmbH +00-04-D3 (hex) Toyokeiki Co., Ltd. +00-04-D4 (hex) Proview Electronics Co., Ltd. +00-04-D5 (hex) Hitachi Information & Communication Engineering, Ltd. +00-04-D6 (hex) Takagi Industrial Co., Ltd. +00-04-D7 (hex) Omitec Instrumentation Ltd. +00-04-D8 (hex) IPWireless, Inc. +00-04-D9 (hex) Titan Electronics, Inc. +00-04-DA (hex) Relax Technology, Inc. +00-04-DB (hex) Tellus Group Corp. +00-04-DC (hex) Nortel Networks +00-04-DD (hex) Cisco Systems, Inc. +00-04-DE (hex) Cisco Systems, Inc. +00-04-DF (hex) Teracom Telematica Ltda. +00-04-E0 (hex) Procket Networks +00-04-E1 (hex) Infinior Microsystems +00-04-E2 (hex) SMC Networks, Inc. +00-04-E3 (hex) Accton Technology Corp. +00-04-E4 (hex) Daeryung Ind., Inc. +00-04-E5 (hex) Glonet Systems, Inc. +00-04-E6 (hex) Banyan Network Private Limited +00-04-E7 (hex) Lightpointe Communications, Inc +00-04-E8 (hex) IER, Inc. +00-04-E9 (hex) Infiniswitch Corporation +00-04-EA (hex) Hewlett-Packard Company +00-04-EB (hex) Paxonet Communications, Inc. +00-04-EC (hex) Memobox SA +00-04-ED (hex) Billion Electric Co., Ltd. +00-04-EE (hex) Lincoln Electric Company +00-04-EF (hex) Polestar Corp. +00-04-F0 (hex) International Computers, Ltd +00-04-F1 (hex) WhereNet +00-04-F2 (hex) Polycom +00-04-F3 (hex) FS FORTH-SYSTEME GmbH +00-04-F4 (hex) Infinite Electronics Inc. +00-04-F5 (hex) SnowShore Networks, Inc. +00-04-F6 (hex) Amphus +00-04-F7 (hex) Omega Band, Inc. +00-04-F8 (hex) QUALICABLE TV Industria E Com., Ltda +00-04-F9 (hex) Xtera Communications, Inc. +00-04-FA (hex) NBS Technologies Inc. +00-04-FB (hex) Commtech, Inc. +00-04-FC (hex) Stratus Computer (DE), Inc. +00-04-FD (hex) Japan Control Engineering Co., Ltd. +00-04-FE (hex) Pelago Networks +00-04-FF (hex) Acronet Co., Ltd. +00-05-00 (hex) Cisco Systems, Inc. +00-05-01 (hex) Cisco Systems, Inc. +00-05-02 (hex) APPLE COMPUTER +00-05-03 (hex) ICONAG +00-05-04 (hex) Naray Information & Communication Enterprise +00-05-05 (hex) Systems Integration Solutions, Inc. +00-05-06 (hex) Reddo Networks AB +00-05-07 (hex) Fine Appliance Corp. +00-05-08 (hex) Inetcam, Inc. +00-05-09 (hex) AVOC Nishimura Ltd. +00-05-0A (hex) ICS Spa +00-05-0B (hex) SICOM Systems, Inc. +00-05-0C (hex) Network Photonics, Inc. +00-05-0D (hex) Midstream Technologies, Inc. +00-05-0E (hex) 3ware, Inc. +00-05-0F (hex) Tanaka S/S Ltd. +00-05-10 (hex) Infinite Shanghai Communication Terminals Ltd. +00-05-11 (hex) Complementary Technologies Ltd +00-05-12 (hex) MeshNetworks, Inc. +00-05-13 (hex) VTLinx Multimedia Systems, Inc. +00-05-14 (hex) KDT Systems Co., Ltd. +00-05-15 (hex) Nuark Co., Ltd. +00-05-16 (hex) SMART Modular Technologies +00-05-17 (hex) Shellcomm, Inc. +00-05-18 (hex) Jupiters Technology +00-05-19 (hex) Siemens Building Technologies AG, +00-05-1A (hex) 3Com Europe Ltd. +00-05-1B (hex) Magic Control Technology Corporation +00-05-1C (hex) Xnet Technology Corp. +00-05-1D (hex) Airocon, Inc. +00-05-1E (hex) Brocade Communications Systems, Inc. +00-05-1F (hex) Taijin Media Co., Ltd. +00-05-20 (hex) Smartronix, Inc. +00-05-21 (hex) Control Microsystems +00-05-22 (hex) LEA*D Corporation, Inc. +00-05-23 (hex) AVL List GmbH +00-05-24 (hex) BTL System (HK) Limited +00-05-25 (hex) Puretek Industrial Co., Ltd. +00-05-26 (hex) IPAS GmbH +00-05-27 (hex) SJ Tek Co. Ltd +00-05-28 (hex) New Focus, Inc. +00-05-29 (hex) Shanghai Broadan Communication Technology Co., Ltd +00-05-2A (hex) Ikegami Tsushinki Co., Ltd. +00-05-2B (hex) HORIBA, Ltd. +00-05-2C (hex) Supreme Magic Corporation +00-05-2D (hex) Zoltrix International Limited +00-05-2E (hex) Cinta Networks +00-05-2F (hex) Leviton Network Solutions +00-05-30 (hex) Andiamo Systems, Inc. +00-05-31 (hex) Cisco Systems, Inc. +00-05-32 (hex) Cisco Systems, Inc. +00-05-33 (hex) Brocade Communications Systems, Inc. +00-05-34 (hex) Northstar Engineering Ltd. +00-05-35 (hex) Chip PC Ltd. +00-05-36 (hex) Danam Communications, Inc. +00-05-37 (hex) Nets Technology Co., Ltd. +00-05-38 (hex) Merilus, Inc. +00-05-39 (hex) A Brand New World in Sweden AB +00-05-3A (hex) Willowglen Services Pte Ltd +00-05-3B (hex) Harbour Networks Ltd., Co. Beijing +00-05-3C (hex) Xircom +00-05-3D (hex) Agere Systems +00-05-3E (hex) KID Systeme GmbH +00-05-3F (hex) VisionTek, Inc. +00-05-40 (hex) FAST Corporation +00-05-41 (hex) Advanced Systems Co., Ltd. +00-05-42 (hex) Otari, Inc. +00-05-43 (hex) IQ Wireless GmbH +00-05-44 (hex) Valley Technologies, Inc. +00-05-45 (hex) Internet Photonics +00-05-46 (hex) KDDI Network & Solultions Inc. +00-05-47 (hex) Starent Networks +00-05-48 (hex) Disco Corporation +00-05-49 (hex) Salira Optical Network Systems +00-05-4A (hex) Ario Data Networks, Inc. +00-05-4B (hex) Micro Innovation AG +00-05-4C (hex) RF Innovations Pty Ltd +00-05-4D (hex) Brans Technologies, Inc. +00-05-4E (hex) Philips +00-05-4F (hex) PRIVATE +00-05-50 (hex) Vcomms Connect Limited +00-05-51 (hex) F & S Elektronik Systeme GmbH +00-05-52 (hex) Xycotec Computer GmbH +00-05-53 (hex) DVC Company, Inc. +00-05-54 (hex) Rangestar Wireless +00-05-55 (hex) Japan Cash Machine Co., Ltd. +00-05-56 (hex) 360 Systems +00-05-57 (hex) Agile TV Corporation +00-05-58 (hex) Synchronous, Inc. +00-05-59 (hex) Intracom S.A. +00-05-5A (hex) Power Dsine Ltd. +00-05-5B (hex) Charles Industries, Ltd. +00-05-5C (hex) Kowa Company, Ltd. +00-05-5D (hex) D-Link Systems, Inc. +00-05-5E (hex) Cisco Systems, Inc. +00-05-5F (hex) Cisco Systems, Inc. +00-05-60 (hex) LEADER COMM.CO., LTD +00-05-61 (hex) nac Image Technology, Inc. +00-05-62 (hex) Digital View Limited +00-05-63 (hex) J-Works, Inc. +00-05-64 (hex) Tsinghua Bitway Co., Ltd. +00-05-65 (hex) Tailyn Communication Company Ltd. +00-05-66 (hex) Secui.com Corporation +00-05-67 (hex) Etymonic Design, Inc. +00-05-68 (hex) Piltofish Networks AB +00-05-69 (hex) VMware, Inc. +00-05-6A (hex) Heuft Systemtechnik GmbH +00-05-6B (hex) C.P. Technology Co., Ltd. +00-05-6C (hex) Hung Chang Co., Ltd. +00-05-6D (hex) Pacific Corporation +00-05-6E (hex) National Enhance Technology, Inc. +00-05-6F (hex) Innomedia Technologies Pvt. Ltd. +00-05-70 (hex) Baydel Ltd. +00-05-71 (hex) Seiwa Electronics Co. +00-05-72 (hex) Deonet Co., Ltd. +00-05-73 (hex) Cisco Systems, Inc. +00-05-74 (hex) Cisco Systems, Inc. +00-05-75 (hex) CDS-Electronics BV +00-05-76 (hex) NSM Technology Ltd. +00-05-77 (hex) SM Information & Communication +00-05-78 (hex) PRIVATE +00-05-79 (hex) Universal Control Solution Corp. +00-05-7A (hex) Hatteras Networks +00-05-7B (hex) Chung Nam Electronic Co., Ltd. +00-05-7C (hex) RCO Security AB +00-05-7D (hex) Sun Communications, Inc. +00-05-7E (hex) Eckelmann Steuerungstechnik GmbH +00-05-7F (hex) Acqis Technology +00-05-80 (hex) Fibrolan Ltd. +00-05-81 (hex) Snell & Wilcox Ltd. +00-05-82 (hex) ClearCube Technology +00-05-83 (hex) ImageCom Limited +00-05-84 (hex) AbsoluteValue Systems, Inc. +00-05-85 (hex) Juniper Networks, Inc. +00-05-86 (hex) Lucent Technologies +00-05-87 (hex) Locus, Incorporated +00-05-88 (hex) Sensoria Corp. +00-05-89 (hex) National Datacomputer +00-05-8A (hex) Netcom Co., Ltd. +00-05-8B (hex) IPmental, Inc. +00-05-8C (hex) Opentech Inc. +00-05-8D (hex) Lynx Photonic Networks, Inc. +00-05-8E (hex) Flextronics International GmbH & Co. Nfg. KG +00-05-8F (hex) CLCsoft co. +00-05-90 (hex) Swissvoice Ltd. +00-05-91 (hex) Active Silicon Ltd. +00-05-92 (hex) Pultek Corp. +00-05-93 (hex) Grammar Engine Inc. +00-05-94 (hex) IXXAT Automation GmbH +00-05-95 (hex) Alesis Corporation +00-05-96 (hex) Genotech Co., Ltd. +00-05-97 (hex) Eagle Traffic Control Systems +00-05-98 (hex) CRONOS S.r.l. +00-05-99 (hex) DRS Test and Energy Management or DRS-TEM +00-05-9A (hex) Cisco Systems, Inc. +00-05-9B (hex) Cisco Systems, Inc. +00-05-9C (hex) Kleinknecht GmbH, Ing. Buero +00-05-9D (hex) Daniel Computing Systems, Inc. +00-05-9E (hex) Zinwell Corporation +00-05-9F (hex) Yotta Networks, Inc. +00-05-A0 (hex) MOBILINE Kft. +00-05-A1 (hex) Zenocom +00-05-A2 (hex) CELOX Networks +00-05-A3 (hex) QEI, Inc. +00-05-A4 (hex) Lucid Voice Ltd. +00-05-A5 (hex) KOTT +00-05-A6 (hex) Extron Electronics +00-05-A7 (hex) Hyperchip, Inc. +00-05-A8 (hex) WYLE ELECTRONICS +00-05-A9 (hex) Princeton Networks, Inc. +00-05-AA (hex) Moore Industries International Inc. +00-05-AB (hex) Cyber Fone, Inc. +00-05-AC (hex) Northern Digital, Inc. +00-05-AD (hex) Topspin Communications, Inc. +00-05-AE (hex) Mediaport USA +00-05-AF (hex) InnoScan Computing A/S +00-05-B0 (hex) Korea Computer Technology Co., Ltd. +00-05-B1 (hex) ASB Technology BV +00-05-B2 (hex) Medison Co., Ltd. +00-05-B3 (hex) Asahi-Engineering Co., Ltd. +00-05-B4 (hex) Aceex Corporation +00-05-B5 (hex) Broadcom Technologies +00-05-B6 (hex) INSYS Microelectronics GmbH +00-05-B7 (hex) Arbor Technology Corp. +00-05-B8 (hex) Electronic Design Associates, Inc. +00-05-B9 (hex) Airvana, Inc. +00-05-BA (hex) Area Netwoeks, Inc. +00-05-BB (hex) Myspace AB +00-05-BC (hex) Resorsys Ltd. +00-05-BD (hex) ROAX BV +00-05-BE (hex) Kongsberg Seatex AS +00-05-BF (hex) JustEzy Technology, Inc. +00-05-C0 (hex) Digital Network Alacarte Co., Ltd. +00-05-C1 (hex) A-Kyung Motion, Inc. +00-05-C2 (hex) Soronti, Inc. +00-05-C3 (hex) Pacific Instruments, Inc. +00-05-C4 (hex) Telect, Inc. +00-05-C5 (hex) Flaga HF +00-05-C6 (hex) Triz Communications +00-05-C7 (hex) I/F-COM A/S +00-05-C8 (hex) VERYTECH +00-05-C9 (hex) LG Innotek Co., Ltd. +00-05-CA (hex) Hitron Technology, Inc. +00-05-CB (hex) ROIS Technologies, Inc. +00-05-CC (hex) Sumtel Communications, Inc. +00-05-CD (hex) Denon, Ltd. +00-05-CE (hex) Prolink Microsystems Corporation +00-05-CF (hex) Thunder River Technologies, Inc. +00-05-D0 (hex) Solinet Systems +00-05-D1 (hex) Metavector Technologies +00-05-D2 (hex) DAP Technologies +00-05-D3 (hex) eProduction Solutions, Inc. +00-05-D4 (hex) FutureSmart Networks, Inc. +00-05-D5 (hex) Speedcom Wireless +00-05-D6 (hex) Titan Wireless +00-05-D7 (hex) Vista Imaging, Inc. +00-05-D8 (hex) Arescom, Inc. +00-05-D9 (hex) Techno Valley, Inc. +00-05-DA (hex) Apex Automationstechnik +00-05-DB (hex) NENTEC Netzwerktechnologie GmbH +00-05-DC (hex) Cisco Systems, Inc. +00-05-DD (hex) Cisco Systems, Inc. +00-05-DE (hex) Gi Fone Korea, Inc. +00-05-DF (hex) Electronic Innovation, Inc. +00-05-E0 (hex) Empirix Corp. +00-05-E1 (hex) Trellis Photonics, Ltd. +00-05-E2 (hex) Creativ Network Technologies +00-05-E3 (hex) LightSand Communications, Inc. +00-05-E4 (hex) Red Lion Controls Inc. +00-05-E5 (hex) Renishaw PLC +00-05-E6 (hex) Egenera, Inc. +00-05-E7 (hex) Netrake an AudioCodes Company +00-05-E8 (hex) TurboWave, Inc. +00-05-E9 (hex) Unicess Network, Inc. +00-05-EA (hex) Rednix +00-05-EB (hex) Blue Ridge Networks, Inc. +00-05-EC (hex) Mosaic Systems Inc. +00-05-ED (hex) Technikum Joanneum GmbH +00-05-EE (hex) BEWATOR Group +00-05-EF (hex) ADOIR Digital Technology +00-05-F0 (hex) SATEC +00-05-F1 (hex) Vrcom, Inc. +00-05-F2 (hex) Power R, Inc. +00-05-F3 (hex) Weboyn +00-05-F4 (hex) System Base Co., Ltd. +00-05-F5 (hex) OYO Geospace +00-05-F6 (hex) Young Chang Co. Ltd. +00-05-F7 (hex) Analog Devices, Inc. +00-05-F8 (hex) Real Time Access, Inc. +00-05-F9 (hex) TOA Corporation +00-05-FA (hex) IPOptical, Inc. +00-05-FB (hex) ShareGate, Inc. +00-05-FC (hex) Schenck Pegasus Corp. +00-05-FD (hex) PacketLight Networks Ltd. +00-05-FE (hex) Traficon N.V. +00-05-FF (hex) SNS Solutions, Inc. +00-06-00 (hex) Toshiba Teli Corporation +00-06-01 (hex) Otanikeiki Co., Ltd. +00-06-02 (hex) Cirkitech Electronics Co. +00-06-03 (hex) Baker Hughes Inc. +00-06-04 (hex) @Track Communications, Inc. +00-06-05 (hex) Inncom International, Inc. +00-06-06 (hex) RapidWAN, Inc. +00-06-07 (hex) Omni Directional Control Technology Inc. +00-06-08 (hex) At-Sky SAS +00-06-09 (hex) Crossport Systems +00-06-0A (hex) Blue2space +00-06-0B (hex) Paceline Systems Corporation +00-06-0C (hex) Melco Industries, Inc. +00-06-0D (hex) Wave7 Optics +00-06-0E (hex) IGYS Systems, Inc. +00-06-0F (hex) Narad Networks Inc +00-06-10 (hex) Abeona Networks Inc +00-06-11 (hex) Zeus Wireless, Inc. +00-06-12 (hex) Accusys, Inc. +00-06-13 (hex) Kawasaki Microelectronics Incorporated +00-06-14 (hex) Prism Holdings +00-06-15 (hex) Kimoto Electric Co., Ltd. +00-06-16 (hex) Tel Net Co., Ltd. +00-06-17 (hex) Redswitch Inc. +00-06-18 (hex) DigiPower Manufacturing Inc. +00-06-19 (hex) Connection Technology Systems +00-06-1A (hex) Zetari Inc. +00-06-1B (hex) Notebook Development Lab. Lenovo Japan Ltd. +00-06-1C (hex) Hoshino Metal Industries, Ltd. +00-06-1D (hex) MIP Telecom, Inc. +00-06-1E (hex) Maxan Systems +00-06-1F (hex) Vision Components GmbH +00-06-20 (hex) Serial System Ltd. +00-06-21 (hex) Hinox, Co., Ltd. +00-06-22 (hex) Chung Fu Chen Yeh Enterprise Corp. +00-06-23 (hex) MGE UPS Systems France +00-06-24 (hex) Gentner Communications Corp. +00-06-25 (hex) The Linksys Group, Inc. +00-06-26 (hex) MWE GmbH +00-06-27 (hex) Uniwide Technologies, Inc. +00-06-28 (hex) Cisco Systems, Inc. +00-06-29 (hex) IBM CORPORATION +00-06-2A (hex) Cisco Systems, Inc. +00-06-2B (hex) INTRASERVER TECHNOLOGY +00-06-2C (hex) Bivio Networks +00-06-2D (hex) TouchStar Technologies, L.L.C. +00-06-2E (hex) Aristos Logic Corp. +00-06-2F (hex) Pivotech Systems Inc. +00-06-30 (hex) Adtranz Sweden +00-06-31 (hex) Optical Solutions, Inc. +00-06-32 (hex) Mesco Engineering GmbH +00-06-33 (hex) Cross Match Technologies GmbH +00-06-34 (hex) GTE Airfone Inc. +00-06-35 (hex) PacketAir Networks, Inc. +00-06-36 (hex) Jedai Broadband Networks +00-06-37 (hex) Toptrend-Meta Information (ShenZhen) Inc. +00-06-38 (hex) Sungjin C&C Co., Ltd. +00-06-39 (hex) Newtec +00-06-3A (hex) Dura Micro, Inc. +00-06-3B (hex) Arcturus Networks, Inc. +00-06-3C (hex) Intrinsyc Europe Ltd +00-06-3D (hex) Microwave Data Systems Inc. +00-06-3E (hex) Opthos Inc. +00-06-3F (hex) Everex Communications Inc. +00-06-40 (hex) White Rock Networks +00-06-41 (hex) ITCN +00-06-42 (hex) Genetel Systems Inc. +00-06-43 (hex) SONO Computer Co., Ltd. +00-06-44 (hex) Neix,Inc +00-06-45 (hex) Meisei Electric Co. Ltd. +00-06-46 (hex) ShenZhen XunBao Network Technology Co Ltd +00-06-47 (hex) Etrali S.A. +00-06-48 (hex) Seedsware, Inc. +00-06-49 (hex) 3M Deutschland GmbH +00-06-4A (hex) Honeywell Co., Ltd. (KOREA) +00-06-4B (hex) Alexon Co., Ltd. +00-06-4C (hex) Invicta Networks, Inc. +00-06-4D (hex) Sencore +00-06-4E (hex) Broad Net Technology Inc. +00-06-4F (hex) PRO-NETS Technology Corporation +00-06-50 (hex) Tiburon Networks, Inc. +00-06-51 (hex) Aspen Networks Inc. +00-06-52 (hex) Cisco Systems, Inc. +00-06-53 (hex) Cisco Systems, Inc. +00-06-54 (hex) Winpresa Building Automation Technologies GmbH +00-06-55 (hex) Yipee, Inc. +00-06-56 (hex) Tactel AB +00-06-57 (hex) Market Central, Inc. +00-06-58 (hex) Helmut Fischer GmbH Institut für Elektronik und Messtechnik +00-06-59 (hex) EAL (Apeldoorn) B.V. +00-06-5A (hex) Strix Systems +00-06-5B (hex) Dell Computer Corp. +00-06-5C (hex) Malachite Technologies, Inc. +00-06-5D (hex) Heidelberg Web Systems +00-06-5E (hex) Photuris, Inc. +00-06-5F (hex) ECI Telecom - NGTS Ltd. +00-06-60 (hex) NADEX Co., Ltd. +00-06-61 (hex) NIA Home Technologies Corp. +00-06-62 (hex) MBM Technology Ltd. +00-06-63 (hex) Human Technology Co., Ltd. +00-06-64 (hex) Fostex Corporation +00-06-65 (hex) Sunny Giken, Inc. +00-06-66 (hex) Roving Networks +00-06-67 (hex) Tripp Lite +00-06-68 (hex) Vicon Industries Inc. +00-06-69 (hex) Datasound Laboratories Ltd +00-06-6A (hex) InfiniCon Systems, Inc. +00-06-6B (hex) Sysmex Corporation +00-06-6C (hex) Robinson Corporation +00-06-6D (hex) Compuprint S.P.A. +00-06-6E (hex) Delta Electronics, Inc. +00-06-6F (hex) Korea Data Systems +00-06-70 (hex) Upponetti Oy +00-06-71 (hex) Softing AG +00-06-72 (hex) Netezza +00-06-73 (hex) Optelecom-nkf +00-06-74 (hex) Spectrum Control, Inc. +00-06-75 (hex) Banderacom, Inc. +00-06-76 (hex) Novra Technologies Inc. +00-06-77 (hex) SICK AG +00-06-78 (hex) Marantz Brand Company +00-06-79 (hex) Konami Corporation +00-06-7A (hex) JMP Systems +00-06-7B (hex) Toplink C&C Corporation +00-06-7C (hex) CISCO SYSTEMS, INC. +00-06-7D (hex) Takasago Ltd. +00-06-7E (hex) WinCom Systems, Inc. +00-06-7F (hex) Digeo, Inc. +00-06-80 (hex) Card Access, Inc. +00-06-81 (hex) Goepel Electronic GmbH +00-06-82 (hex) Convedia +00-06-83 (hex) Bravara Communications, Inc. +00-06-84 (hex) Biacore AB +00-06-85 (hex) NetNearU Corporation +00-06-86 (hex) ZARDCOM Co., Ltd. +00-06-87 (hex) Omnitron Systems Technology, Inc. +00-06-88 (hex) Telways Communication Co., Ltd. +00-06-89 (hex) yLez Technologies Pte Ltd +00-06-8A (hex) NeuronNet Co. Ltd. R&D Center +00-06-8B (hex) AirRunner Technologies, Inc. +00-06-8C (hex) 3Com Corporation +00-06-8D (hex) SEPATON, Inc. +00-06-8E (hex) HID Corporation +00-06-8F (hex) Telemonitor, Inc. +00-06-90 (hex) Euracom Communication GmbH +00-06-91 (hex) PT Inovacao +00-06-92 (hex) Intruvert Networks, Inc. +00-06-93 (hex) Flexus Computer Technology, Inc. +00-06-94 (hex) Mobillian Corporation +00-06-95 (hex) Ensure Technologies, Inc. +00-06-96 (hex) Advent Networks +00-06-97 (hex) R & D Center +00-06-98 (hex) egnite Software GmbH +00-06-99 (hex) Vida Design Co. +00-06-9A (hex) e & Tel +00-06-9B (hex) AVT Audio Video Technologies GmbH +00-06-9C (hex) Transmode Systems AB +00-06-9D (hex) Petards Mobile Intelligence +00-06-9E (hex) UNIQA, Inc. +00-06-9F (hex) Kuokoa Networks +00-06-A0 (hex) Mx Imaging +00-06-A1 (hex) Celsian Technologies, Inc. +00-06-A2 (hex) Microtune, Inc. +00-06-A3 (hex) Bitran Corporation +00-06-A4 (hex) INNOWELL Corp. +00-06-A5 (hex) PINON Corp. +00-06-A6 (hex) Artistic Licence (UK) Ltd +00-06-A7 (hex) Primarion +00-06-A8 (hex) KC Technology, Inc. +00-06-A9 (hex) Universal Instruments Corp. +00-06-AA (hex) VT Miltope +00-06-AB (hex) W-Link Systems, Inc. +00-06-AC (hex) Intersoft Co. +00-06-AD (hex) KB Electronics Ltd. +00-06-AE (hex) Himachal Futuristic Communications Ltd +00-06-AF (hex) Xalted Networks +00-06-B0 (hex) Comtech EF Data Corp. +00-06-B1 (hex) Sonicwall +00-06-B2 (hex) Linxtek Co. +00-06-B3 (hex) Diagraph Corporation +00-06-B4 (hex) Vorne Industries, Inc. +00-06-B5 (hex) Luminent, Inc. +00-06-B6 (hex) Nir-Or Israel Ltd. +00-06-B7 (hex) TELEM GmbH +00-06-B8 (hex) Bandspeed Pty Ltd +00-06-B9 (hex) A5TEK Corp. +00-06-BA (hex) Westwave Communications +00-06-BB (hex) ATI Technologies Inc. +00-06-BC (hex) Macrolink, Inc. +00-06-BD (hex) BNTECHNOLOGY Co., Ltd. +00-06-BE (hex) Baumer Optronic GmbH +00-06-BF (hex) Accella Technologies Co., Ltd. +00-06-C0 (hex) United Internetworks, Inc. +00-06-C1 (hex) CISCO SYSTEMS, INC. +00-06-C2 (hex) Smartmatic Corporation +00-06-C3 (hex) Schindler Elevator Ltd. +00-06-C4 (hex) Piolink Inc. +00-06-C5 (hex) INNOVI Technologies Limited +00-06-C6 (hex) lesswire AG +00-06-C7 (hex) RFNET Technologies Pte Ltd (S) +00-06-C8 (hex) Sumitomo Metal Micro Devices, Inc. +00-06-C9 (hex) Technical Marketing Research, Inc. +00-06-CA (hex) American Computer & Digital Components, Inc. (ACDC) +00-06-CB (hex) Jotron Electronics A/S +00-06-CC (hex) JMI Electronics Co., Ltd. +00-06-CD (hex) Leaf Imaging Ltd. +00-06-CE (hex) DATENO +00-06-CF (hex) Thales Avionics In-Flight Systems, LLC +00-06-D0 (hex) Elgar Electronics Corp. +00-06-D1 (hex) Tahoe Networks, Inc. +00-06-D2 (hex) Tundra Semiconductor Corp. +00-06-D3 (hex) Alpha Telecom, Inc. U.S.A. +00-06-D4 (hex) Interactive Objects, Inc. +00-06-D5 (hex) Diamond Systems Corp. +00-06-D6 (hex) Cisco Systems, Inc. +00-06-D7 (hex) Cisco Systems, Inc. +00-06-D8 (hex) Maple Optical Systems +00-06-D9 (hex) IPM-Net S.p.A. +00-06-DA (hex) ITRAN Communications Ltd. +00-06-DB (hex) ICHIPS Co., Ltd. +00-06-DC (hex) Syabas Technology (Amquest) +00-06-DD (hex) AT & T Laboratories - Cambridge Ltd +00-06-DE (hex) Flash Technology +00-06-DF (hex) AIDONIC Corporation +00-06-E0 (hex) MAT Co., Ltd. +00-06-E1 (hex) Techno Trade s.a +00-06-E2 (hex) Ceemax Technology Co., Ltd. +00-06-E3 (hex) Quantitative Imaging Corporation +00-06-E4 (hex) Citel Technologies Ltd. +00-06-E5 (hex) Fujian Newland Computer Ltd. Co. +00-06-E6 (hex) DongYang Telecom Co., Ltd. +00-06-E7 (hex) Bit Blitz Communications Inc. +00-06-E8 (hex) Optical Network Testing, Inc. +00-06-E9 (hex) Intime Corp. +00-06-EA (hex) ELZET80 Mikrocomputer GmbH&Co. KG +00-06-EB (hex) Global Data +00-06-EC (hex) Harris Corporation +00-06-ED (hex) Inara Networks +00-06-EE (hex) Shenyang Neu-era Information & Technology Stock Co., Ltd +00-06-EF (hex) Maxxan Systems, Inc. +00-06-F0 (hex) Digeo, Inc. +00-06-F1 (hex) Optillion +00-06-F2 (hex) Platys Communications +00-06-F3 (hex) AcceLight Networks +00-06-F4 (hex) Prime Electronics & Satellitics Inc. +00-06-F8 (hex) CPU Technology, Inc. +00-06-F9 (hex) Mitsui Zosen Systems Research Inc. +00-06-FA (hex) IP SQUARE Co, Ltd. +00-06-FB (hex) Hitachi Printing Solutions, Ltd. +00-06-FC (hex) Fnet Co., Ltd. +00-06-FD (hex) Comjet Information Systems Corp. +00-06-FE (hex) Ambrado, Inc +00-06-FF (hex) Sheba Systems Co., Ltd. +00-07-00 (hex) Zettamedia Korea +00-07-01 (hex) RACAL-DATACOM +00-07-02 (hex) Varian Medical Systems +00-07-03 (hex) CSEE Transport +00-07-05 (hex) Endress & Hauser GmbH & Co +00-07-06 (hex) Sanritz Corporation +00-07-07 (hex) Interalia Inc. +00-07-08 (hex) Bitrage Inc. +00-07-09 (hex) Westerstrand Urfabrik AB +00-07-0A (hex) Unicom Automation Co., Ltd. +00-07-0B (hex) Novabase SGPS, SA +00-07-0C (hex) SVA-Intrusion.com Co. Ltd. +00-07-0D (hex) Cisco Systems Inc. +00-07-0E (hex) Cisco Systems Inc. +00-07-0F (hex) Fujant, Inc. +00-07-10 (hex) Adax, Inc. +00-07-11 (hex) Acterna +00-07-12 (hex) JAL Information Technology +00-07-13 (hex) IP One, Inc. +00-07-14 (hex) Brightcom +00-07-15 (hex) General Research of Electronics, Inc. +00-07-16 (hex) J & S Marine Ltd. +00-07-17 (hex) Wieland Electric GmbH +00-07-18 (hex) iCanTek Co., Ltd. +00-07-19 (hex) Mobiis Co., Ltd. +00-07-1A (hex) Finedigital Inc. +00-07-1B (hex) CDV Americas Ltd +00-07-1C (hex) AT&T Fixed Wireless Services +00-07-1D (hex) Satelsa Sistemas Y Aplicaciones De Telecomunicaciones, S.A. +00-07-1E (hex) Tri-M Engineering / Nupak Dev. Corp. +00-07-1F (hex) European Systems Integration +00-07-20 (hex) Trutzschler GmbH & Co. KG +00-07-21 (hex) Formac Elektronik GmbH +00-07-22 (hex) The Nielsen Company +00-07-23 (hex) ELCON Systemtechnik GmbH +00-07-24 (hex) Telemax Co., Ltd. +00-07-25 (hex) Bematech International Corp. +00-07-27 (hex) Zi Corporation (HK) Ltd. +00-07-28 (hex) Neo Telecom +00-07-29 (hex) Kistler Instrumente AG +00-07-2A (hex) Innovance Networks +00-07-2B (hex) Jung Myung Telecom Co., Ltd. +00-07-2C (hex) Fabricom +00-07-2D (hex) CNSystems +00-07-2E (hex) North Node AB +00-07-2F (hex) Intransa, Inc. +00-07-30 (hex) Hutchison OPTEL Telecom Technology Co., Ltd. +00-07-31 (hex) Ophir-Spiricon Inc +00-07-32 (hex) AAEON Technology Inc. +00-07-33 (hex) DANCONTROL Engineering +00-07-34 (hex) ONStor, Inc. +00-07-35 (hex) Flarion Technologies, Inc. +00-07-36 (hex) Data Video Technologies Co., Ltd. +00-07-37 (hex) Soriya Co. Ltd. +00-07-38 (hex) Young Technology Co., Ltd. +00-07-39 (hex) Scotty Group Austria Gmbh +00-07-3A (hex) Inventel Systemes +00-07-3B (hex) Tenovis GmbH & Co KG +00-07-3C (hex) Telecom Design +00-07-3D (hex) Nanjing Postel Telecommunications Co., Ltd. +00-07-3E (hex) China Great-Wall Computer Shenzhen Co., Ltd. +00-07-3F (hex) Woojyun Systec Co., Ltd. +00-07-40 (hex) Buffalo, Inc +00-07-41 (hex) Sierra Automated Systems +00-07-42 (hex) Current Technologies, LLC +00-07-43 (hex) Chelsio Communications +00-07-44 (hex) Unico, Inc. +00-07-45 (hex) Radlan Computer Communications Ltd. +00-07-46 (hex) TURCK, Inc. +00-07-47 (hex) Mecalc +00-07-48 (hex) The Imaging Source Europe +00-07-49 (hex) CENiX Inc. +00-07-4A (hex) Carl Valentin GmbH +00-07-4B (hex) Daihen Corporation +00-07-4C (hex) Beicom Inc. +00-07-4D (hex) Zebra Technologies Corp. +00-07-4E (hex) Naughty boy co., Ltd. +00-07-4F (hex) Cisco Systems, Inc. +00-07-50 (hex) Cisco Systems, Inc. +00-07-51 (hex) m·u·t AG +00-07-52 (hex) Rhythm Watch Co., Ltd. +00-07-53 (hex) Beijing Qxcomm Technology Co., Ltd. +00-07-54 (hex) Xyterra Computing, Inc. +00-07-55 (hex) Lafon SA +00-07-56 (hex) Juyoung Telecom +00-07-57 (hex) Topcall International AG +00-07-58 (hex) Dragonwave +00-07-59 (hex) Boris Manufacturing Corp. +00-07-5A (hex) Air Products and Chemicals, Inc. +00-07-5B (hex) Gibson Guitars +00-07-5C (hex) Eastman Kodak Company +00-07-5D (hex) Celleritas Inc. +00-07-5E (hex) Ametek Power Instruments +00-07-5F (hex) VCS Video Communication Systems AG +00-07-60 (hex) TOMIS Information & Telecom Corp. +00-07-61 (hex) Logitech SA +00-07-62 (hex) Group Sense Limited +00-07-63 (hex) Sunniwell Cyber Tech. Co., Ltd. +00-07-64 (hex) YoungWoo Telecom Co. Ltd. +00-07-65 (hex) Jade Quantum Technologies, Inc. +00-07-66 (hex) Chou Chin Industrial Co., Ltd. +00-07-67 (hex) Yuxing Electronics Company Limited +00-07-68 (hex) Danfoss A/S +00-07-69 (hex) Italiana Macchi SpA +00-07-6A (hex) NEXTEYE Co., Ltd. +00-07-6B (hex) Stralfors AB +00-07-6C (hex) Daehanet, Inc. +00-07-6D (hex) Flexlight Networks +00-07-6E (hex) Sinetica Corporation Limited +00-07-6F (hex) Synoptics Limited +00-07-70 (hex) Locusnetworks Corporation +00-07-71 (hex) Embedded System Corporation +00-07-72 (hex) Alcatel Shanghai Bell Co., Ltd. +00-07-73 (hex) Ascom Powerline Communications Ltd. +00-07-74 (hex) GuangZhou Thinker Technology Co. Ltd. +00-07-75 (hex) Valence Semiconductor, Inc. +00-07-76 (hex) Federal APD +00-07-77 (hex) Motah Ltd. +00-07-78 (hex) GERSTEL GmbH & Co. KG +00-07-79 (hex) Sungil Telecom Co., Ltd. +00-07-7A (hex) Infoware System Co., Ltd. +00-07-7B (hex) Millimetrix Broadband Networks +00-07-7C (hex) Westermo Teleindustri AB +00-07-7E (hex) Elrest GmbH +00-07-7F (hex) J Communications Co., Ltd. +00-07-80 (hex) Bluegiga Technologies OY +00-07-81 (hex) Itron Inc. +00-07-82 (hex) Sun Microsystems, Inc. +00-07-83 (hex) SynCom Network, Inc. +00-07-84 (hex) Cisco Systems Inc. +00-07-85 (hex) Cisco Systems Inc. +00-07-86 (hex) Wireless Networks Inc. +00-07-87 (hex) Idea System Co., Ltd. +00-07-88 (hex) Clipcomm, Inc. +00-07-89 (hex) Eastel Systems Corporation +00-07-8A (hex) Mentor Data System Inc. +00-07-8B (hex) Wegener Communications, Inc. +00-07-8C (hex) Elektronikspecialisten i Borlange AB +00-07-8D (hex) NetEngines Ltd. +00-07-8E (hex) Garz & Friche GmbH +00-07-8F (hex) Emkay Innovative Products +00-07-90 (hex) Tri-M Technologies (s) Limited +00-07-91 (hex) International Data Communications, Inc. +00-07-92 (hex) Suetron Electronic GmbH +00-07-93 (hex) Shin Satellite Public Company Limited +00-07-94 (hex) Simple Devices, Inc. +00-07-95 (hex) Elitegroup Computer System Co. (ECS) +00-07-96 (hex) LSI Systems, Inc. +00-07-97 (hex) Netpower Co., Ltd. +00-07-98 (hex) Selea SRL +00-07-99 (hex) Tipping Point Technologies, Inc. +00-07-9A (hex) Verint Systems Inc +00-07-9B (hex) Aurora Networks +00-07-9C (hex) Golden Electronics Technology Co., Ltd. +00-07-9D (hex) Musashi Co., Ltd. +00-07-9E (hex) Ilinx Co., Ltd. +00-07-9F (hex) Action Digital Inc. +00-07-A0 (hex) e-Watch Inc. +00-07-A1 (hex) VIASYS Healthcare GmbH +00-07-A2 (hex) Opteon Corporation +00-07-A3 (hex) Ositis Software, Inc. +00-07-A4 (hex) GN Netcom Ltd. +00-07-A5 (hex) Y.D.K Co. Ltd. +00-07-A6 (hex) Home Automation, Inc. +00-07-A7 (hex) A-Z Inc. +00-07-A8 (hex) Haier Group Technologies Ltd. +00-07-A9 (hex) Novasonics +00-07-AA (hex) Quantum Data Inc. +00-07-AC (hex) Eolring +00-07-AD (hex) Pentacon GmbH Foto-und Feinwerktechnik +00-07-AE (hex) Britestream Networks, Inc. +00-07-AF (hex) N-Tron Corp. +00-07-B0 (hex) Office Details, Inc. +00-07-B1 (hex) Equator Technologies +00-07-B2 (hex) Transaccess S.A. +00-07-B3 (hex) Cisco Systems Inc. +00-07-B4 (hex) Cisco Systems Inc. +00-07-B5 (hex) Any One Wireless Ltd. +00-07-B6 (hex) Telecom Technology Ltd. +00-07-B7 (hex) Samurai Ind. Prods Eletronicos Ltda +00-07-B8 (hex) Corvalent Corporation +00-07-B9 (hex) Ginganet Corporation +00-07-BA (hex) UTStarcom, Inc. +00-07-BB (hex) Candera Inc. +00-07-BC (hex) Identix Inc. +00-07-BD (hex) Radionet Ltd. +00-07-BE (hex) DataLogic SpA +00-07-BF (hex) Armillaire Technologies, Inc. +00-07-C0 (hex) NetZerver Inc. +00-07-C1 (hex) Overture Networks, Inc. +00-07-C2 (hex) Netsys Telecom +00-07-C3 (hex) Thomson +00-07-C4 (hex) JEAN Co. Ltd. +00-07-C5 (hex) Gcom, Inc. +00-07-C6 (hex) VDS Vosskuhler GmbH +00-07-C7 (hex) Synectics Systems Limited +00-07-C8 (hex) Brain21, Inc. +00-07-C9 (hex) Technol Seven Co., Ltd. +00-07-CA (hex) Creatix Polymedia Ges Fur Kommunikaitonssysteme +00-07-CB (hex) Freebox SA +00-07-CC (hex) Kaba Benzing GmbH +00-07-CD (hex) NMTEL Co., Ltd. +00-07-CE (hex) Cabletime Limited +00-07-CF (hex) Anoto AB +00-07-D0 (hex) Automat Engenharia de Automaoa Ltda. +00-07-D1 (hex) Spectrum Signal Processing Inc. +00-07-D2 (hex) Logopak Systeme +00-07-D3 (hex) Stork Digital Imaging B.V. +00-07-D4 (hex) Zhejiang Yutong Network Communication Co Ltd. +00-07-D5 (hex) 3e Technologies Int;., Inc. +00-07-D6 (hex) Commil Ltd. +00-07-D7 (hex) Caporis Networks AG +00-07-D8 (hex) Hitron Systems Inc. +00-07-D9 (hex) Splicecom +00-07-DA (hex) Neuro Telecom Co., Ltd. +00-07-DB (hex) Kirana Networks, Inc. +00-07-DC (hex) Atek Co, Ltd. +00-07-DD (hex) Cradle Technologies +00-07-DE (hex) eCopilt AB +00-07-DF (hex) Vbrick Systems Inc. +00-07-E0 (hex) Palm Inc. +00-07-E1 (hex) WIS Communications Co. Ltd. +00-07-E2 (hex) Bitworks, Inc. +00-07-E3 (hex) Navcom Technology, Inc. +00-07-E4 (hex) SoftRadio Co., Ltd. +00-07-E5 (hex) Coup Corporation +00-07-E6 (hex) edgeflow Canada Inc. +00-07-E7 (hex) FreeWave Technologies +00-07-E8 (hex) St. Bernard Software +00-07-E9 (hex) Intel Corporation +00-07-EA (hex) Massana, Inc. +00-07-EB (hex) Cisco Systems Inc. +00-07-EC (hex) Cisco Systems Inc. +00-07-ED (hex) Altera Corporation +00-07-EE (hex) telco Informationssysteme GmbH +00-07-EF (hex) Lockheed Martin Tactical Systems +00-07-F0 (hex) Beckett LogiSync LLC +00-07-F1 (hex) TeraBurst Networks Inc. +00-07-F2 (hex) IOA Corporation +00-07-F3 (hex) Thinkengine Networks +00-07-F4 (hex) Eletex Co., Ltd. +00-07-F5 (hex) Bridgeco Co AG +00-07-F6 (hex) Qqest Software Systems +00-07-F7 (hex) Galtronics +00-07-F8 (hex) ITDevices, Inc. +00-07-F9 (hex) Phonetics, Inc. +00-07-FA (hex) ITT Co., Ltd. +00-07-FB (hex) Giga Stream UMTS Technologies GmbH +00-07-FC (hex) Adept Systems Inc. +00-07-FD (hex) LANergy Ltd. +00-07-FE (hex) Rigaku Corporation +00-07-FF (hex) Gluon Networks +00-08-00 (hex) MULTITECH SYSTEMS, INC. +00-08-01 (hex) HighSpeed Surfing Inc. +00-08-02 (hex) Hewlett Packard +00-08-03 (hex) Cos Tron +00-08-04 (hex) ICA Inc. +00-08-05 (hex) Techno-Holon Corporation +00-08-06 (hex) Raonet Systems, Inc. +00-08-07 (hex) Access Devices Limited +00-08-08 (hex) PPT Vision, Inc. +00-08-09 (hex) Systemonic AG +00-08-0A (hex) Espera-Werke GmbH +00-08-0B (hex) Birka BPA Informationssystem AB +00-08-0C (hex) VDA Elettronica spa +00-08-0D (hex) Toshiba +00-08-0E (hex) Motorola, BCS +00-08-0F (hex) Proximion Fiber Optics AB +00-08-10 (hex) Key Technology, Inc. +00-08-11 (hex) VOIX Corporation +00-08-12 (hex) GM-2 Corporation +00-08-13 (hex) Diskbank, Inc. +00-08-14 (hex) TIL Technologies +00-08-15 (hex) CATS Co., Ltd. +00-08-16 (hex) Bluetags A/S +00-08-17 (hex) EmergeCore Networks LLC +00-08-18 (hex) Pixelworks, Inc. +00-08-19 (hex) Banksys +00-08-1A (hex) Sanrad Intelligence Storage Communications (2000) Ltd. +00-08-1B (hex) Windigo Systems +00-08-1C (hex) @pos.com +00-08-1D (hex) Ipsil, Incorporated +00-08-1E (hex) Repeatit AB +00-08-1F (hex) Pou Yuen Tech Corp. Ltd. +00-08-20 (hex) Cisco Systems Inc. +00-08-21 (hex) Cisco Systems Inc. +00-08-22 (hex) InPro Comm +00-08-23 (hex) Texa Corp. +00-08-24 (hex) Copitrak Inc +00-08-25 (hex) Acme Packet +00-08-26 (hex) Colorado Med Tech +00-08-27 (hex) Pirelli Broadband Solutions +00-08-28 (hex) Koei Engineering Ltd. +00-08-29 (hex) Aval Nagasaki Corporation +00-08-2A (hex) Powerwallz Network Security +00-08-2B (hex) Wooksung Electronics, Inc. +00-08-2C (hex) Homag AG +00-08-2D (hex) Indus Teqsite Private Limited +00-08-2E (hex) Multitone Electronics PLC +00-08-4E (hex) DivergeNet, Inc. +00-08-4F (hex) Qualstar Corporation +00-08-50 (hex) Arizona Instrument Corp. +00-08-51 (hex) Canadian Bank Note Company, Ltd. +00-08-52 (hex) Davolink Co. Inc. +00-08-53 (hex) Schleicher GmbH & Co. Relaiswerke KG +00-08-54 (hex) Netronix, Inc. +00-08-55 (hex) NASA-Goddard Space Flight Center +00-08-56 (hex) Gamatronic Electronic Industries Ltd. +00-08-57 (hex) Polaris Networks, Inc. +00-08-58 (hex) Novatechnology Inc. +00-08-59 (hex) ShenZhen Unitone Electronics Co., Ltd. +00-08-5A (hex) IntiGate Inc. +00-08-5B (hex) Hanbit Electronics Co., Ltd. +00-08-5C (hex) Shanghai Dare Technologies Co. Ltd. +00-08-5D (hex) Aastra +00-08-5E (hex) PCO AG +00-08-5F (hex) Picanol N.V. +00-08-60 (hex) LodgeNet Entertainment Corp. +00-08-61 (hex) SoftEnergy Co., Ltd. +00-08-62 (hex) NEC Eluminant Technologies, Inc. +00-08-63 (hex) Entrisphere Inc. +00-08-64 (hex) Fasy S.p.A. +00-08-65 (hex) JASCOM CO., LTD +00-08-66 (hex) DSX Access Systems, Inc. +00-08-67 (hex) Uptime Devices +00-08-68 (hex) PurOptix +00-08-69 (hex) Command-e Technology Co.,Ltd. +00-08-6A (hex) Industrie Technik IPS GmbH +00-08-6B (hex) MIPSYS +00-08-6C (hex) Plasmon LMS +00-08-6D (hex) Missouri FreeNet +00-08-6E (hex) Hyglo AB +00-08-6F (hex) Resources Computer Network Ltd. +00-08-70 (hex) Rasvia Systems, Inc. +00-08-71 (hex) NORTHDATA Co., Ltd. +00-08-72 (hex) Sorenson Communications +00-08-73 (hex) DAP Design B.V. +00-08-74 (hex) Dell Computer Corp. +00-08-75 (hex) Acorp Electronics Corp. +00-08-76 (hex) SDSystem +00-08-77 (hex) Liebert-Hiross Spa +00-08-78 (hex) Benchmark Storage Innovations +00-08-79 (hex) CEM Corporation +00-08-7A (hex) Wipotec GmbH +00-08-7B (hex) RTX Telecom A/S +00-08-7C (hex) Cisco Systems, Inc. +00-08-7D (hex) Cisco Systems Inc. +00-08-7E (hex) Bon Electro-Telecom Inc. +00-08-7F (hex) SPAUN electronic GmbH & Co. KG +00-08-80 (hex) BroadTel Canada Communications inc. +00-08-81 (hex) DIGITAL HANDS CO.,LTD. +00-08-82 (hex) SIGMA CORPORATION +00-08-83 (hex) Hewlett-Packard Company +00-08-84 (hex) Index Braille AB +00-08-85 (hex) EMS Dr. Thomas Wuensche +00-08-86 (hex) Hansung Teliann, Inc. +00-08-87 (hex) Maschinenfabrik Reinhausen GmbH +00-08-88 (hex) OULLIM Information Technology Inc,. +00-08-89 (hex) Echostar Technologies Corp +00-08-8A (hex) Minds@Work +00-08-8B (hex) Tropic Networks Inc. +00-08-8C (hex) Quanta Network Systems Inc. +00-08-8D (hex) Sigma-Links Inc. +00-08-8E (hex) Nihon Computer Co., Ltd. +00-08-8F (hex) ADVANCED DIGITAL TECHNOLOGY +00-08-90 (hex) AVILINKS SA +00-08-91 (hex) Lyan Inc. +00-08-92 (hex) EM Solutions +00-08-93 (hex) LE INFORMATION COMMUNICATION INC. +00-08-94 (hex) InnoVISION Multimedia Ltd. +00-08-95 (hex) DIRC Technologie GmbH & Co.KG +00-08-96 (hex) Printronix, Inc. +00-08-97 (hex) Quake Technologies +00-08-98 (hex) Gigabit Optics Corporation +00-08-99 (hex) Netbind, Inc. +00-08-9A (hex) Alcatel Microelectronics +00-08-9B (hex) ICP Electronics Inc. +00-08-9C (hex) Elecs Industry Co., Ltd. +00-08-9D (hex) UHD-Elektronik +00-08-9E (hex) Beijing Enter-Net co.LTD +00-08-9F (hex) EFM Networks +00-08-A0 (hex) Stotz Feinmesstechnik GmbH +00-08-A1 (hex) CNet Technology Inc. +00-08-A2 (hex) ADI Engineering, Inc. +00-08-A3 (hex) Cisco Systems +00-08-A4 (hex) Cisco Systems +00-08-A5 (hex) Peninsula Systems Inc. +00-08-A6 (hex) Multiware & Image Co., Ltd. +00-08-A7 (hex) iLogic Inc. +00-08-A8 (hex) Systec Co., Ltd. +00-08-A9 (hex) SangSang Technology, Inc. +00-08-AA (hex) KARAM +00-08-AB (hex) EnerLinx.com, Inc. +00-08-AC (hex) Eltromat GmbH +00-08-AD (hex) Toyo-Linx Co., Ltd. +00-08-AE (hex) PacketFront Sweden AB +00-08-AF (hex) Novatec Corporation +00-08-B0 (hex) BKtel communications GmbH +00-08-B1 (hex) ProQuent Systems +00-08-B2 (hex) SHENZHEN COMPASS TECHNOLOGY DEVELOPMENT CO.,LTD +00-08-B3 (hex) Fastwel +00-08-B4 (hex) SYSPOL +00-08-B5 (hex) TAI GUEN ENTERPRISE CO., LTD +00-08-B6 (hex) RouteFree, Inc. +00-08-B7 (hex) HIT Incorporated +00-08-B8 (hex) E.F. Johnson +00-08-B9 (hex) KAON MEDIA Co., Ltd. +00-08-BA (hex) Erskine Systems Ltd +00-08-BB (hex) NetExcell +00-08-BC (hex) Ilevo AB +00-08-BD (hex) TEPG-US +00-08-BE (hex) XENPAK MSA Group +00-08-BF (hex) Aptus Elektronik AB +00-08-C0 (hex) ASA SYSTEMS +00-08-C1 (hex) Avistar Communications Corporation +00-08-C2 (hex) Cisco Systems +00-08-C3 (hex) Contex A/S +00-08-C4 (hex) Hikari Co.,Ltd. +00-08-C5 (hex) Liontech Co., Ltd. +00-08-C6 (hex) Philips Consumer Communications +00-08-C7 (hex) Hewlett Packard +00-08-C8 (hex) Soneticom, Inc. +00-08-C9 (hex) TechniSat Digital GmbH +00-08-CA (hex) TwinHan Technology Co.,Ltd +00-08-CB (hex) Zeta Broadband Inc. +00-08-CC (hex) Remotec, Inc. +00-08-CD (hex) With-Net Inc +00-08-CE (hex) IPMobileNet Inc. +00-08-CF (hex) Nippon Koei Power Systems Co., Ltd. +00-08-D0 (hex) Musashi Engineering Co., LTD. +00-08-D1 (hex) KAREL INC. +00-08-D2 (hex) ZOOM Networks Inc. +00-08-D3 (hex) Hercules Technologies S.A. +00-08-D4 (hex) IneoQuest Technologies, Inc +00-08-D5 (hex) Vanguard Networks Solutions, LLC +00-08-D6 (hex) HASSNET Inc. +00-08-D7 (hex) HOW CORPORATION +00-08-D8 (hex) Dowkey Microwave +00-08-D9 (hex) Mitadenshi Co.,LTD +00-08-DA (hex) SofaWare Technologies Ltd. +00-08-DB (hex) Corrigent Systems +00-08-DC (hex) Wiznet +00-08-DD (hex) Telena Communications, Inc. +00-08-DE (hex) 3UP Systems +00-08-DF (hex) Alistel Inc. +00-08-E0 (hex) ATO Technology Ltd. +00-08-E1 (hex) Barix AG +00-08-E2 (hex) Cisco Systems +00-08-E3 (hex) Cisco Systems +00-08-E4 (hex) Envenergy Inc +00-08-E5 (hex) IDK Corporation +00-08-E6 (hex) Littlefeet +00-08-E7 (hex) SHI ControlSystems,Ltd. +00-08-E8 (hex) Excel Master Ltd. +00-08-E9 (hex) NextGig +00-08-EA (hex) Motion Control Engineering, Inc +00-08-EB (hex) ROMWin Co.,Ltd. +00-08-EC (hex) Zonu, Inc. +00-08-ED (hex) ST&T Instrument Corp. +00-08-EE (hex) Logic Product Development +00-08-EF (hex) DIBAL,S.A. +00-08-F0 (hex) Next Generation Systems, Inc. +00-08-F1 (hex) Voltaire +00-08-F2 (hex) C&S Technology +00-08-F3 (hex) WANY +00-08-F4 (hex) Bluetake Technology Co., Ltd. +00-08-F5 (hex) YESTECHNOLOGY Co.,Ltd. +00-08-F6 (hex) Sumitomo Electric System Solutions Co.,Ltd. +00-08-F7 (hex) Hitachi Ltd, Semiconductor & Integrated Circuits Gr +00-08-F8 (hex) Guardall Ltd +00-08-F9 (hex) Padcom, Inc. +00-08-FA (hex) Karl E.Brinkmann GmbH +00-08-FB (hex) SonoSite, Inc. +00-08-FC (hex) Gigaphoton Inc. +00-08-FD (hex) BlueKorea Co., Ltd. +00-08-FE (hex) UNIK C&C Co.,Ltd. +00-08-FF (hex) Trilogy Communications Ltd +00-09-00 (hex) TMT +00-09-01 (hex) Shenzhen Shixuntong Information & Technoligy Co +00-09-02 (hex) Redline Communications Inc. +00-09-03 (hex) Panasas, Inc +00-09-04 (hex) MONDIAL electronic +00-09-05 (hex) iTEC Technologies Ltd. +00-09-06 (hex) Esteem Networks +00-09-07 (hex) Chrysalis Development +00-09-08 (hex) VTech Technology Corp. +00-09-09 (hex) Telenor Connect A/S +00-09-0A (hex) SnedFar Technology Co., Ltd. +00-09-0B (hex) MTL Instruments PLC +00-09-0C (hex) Mayekawa Mfg. Co. Ltd. +00-09-0D (hex) LEADER ELECTRONICS CORP. +00-09-0E (hex) Helix Technology Inc. +00-09-0F (hex) Fortinet Inc. +00-09-10 (hex) Simple Access Inc. +00-09-11 (hex) Cisco Systems +00-09-12 (hex) Cisco Systems +00-09-13 (hex) SystemK Corporation +00-09-14 (hex) COMPUTROLS INC. +00-09-15 (hex) CAS Corp. +00-09-16 (hex) Listman Home Technologies, Inc. +00-09-17 (hex) WEM Technology Inc +00-09-18 (hex) SAMSUNG TECHWIN CO.,LTD +00-09-19 (hex) MDS Gateways +00-09-1A (hex) Macat Optics & Electronics Co., Ltd. +00-09-1B (hex) Digital Generation Inc. +00-09-1C (hex) CacheVision, Inc +00-09-1D (hex) Proteam Computer Corporation +00-09-1E (hex) Firstech Technology Corp. +00-09-1F (hex) A&D Co., Ltd. +00-09-20 (hex) EpoX COMPUTER CO.,LTD. +00-09-21 (hex) Planmeca Oy +00-09-22 (hex) TST Biometrics GmbH +00-09-23 (hex) Heaman System Co., Ltd +00-09-24 (hex) Telebau GmbH +00-09-25 (hex) VSN Systemen BV +00-09-26 (hex) YODA COMMUNICATIONS, INC. +00-09-27 (hex) TOYOKEIKI CO.,LTD. +00-09-28 (hex) Telecore +00-09-29 (hex) Sanyo Industries (UK) Limited +00-09-2A (hex) MYTECS Co.,Ltd. +00-09-2B (hex) iQstor Networks, Inc. +00-09-2C (hex) Hitpoint Inc. +00-09-2D (hex) HTC Corporation +00-09-2E (hex) B&Tech System Inc. +00-09-2F (hex) Akom Technology Corporation +00-09-30 (hex) AeroConcierge Inc. +00-09-31 (hex) Future Internet, Inc. +00-09-32 (hex) Omnilux +00-09-33 (hex) OPTOVALLEY Co. Ltd. +00-09-34 (hex) Dream-Multimedia-Tv GmbH +00-09-35 (hex) Sandvine Incorporated +00-09-36 (hex) Ipetronik GmbH & Co.KG +00-09-37 (hex) Inventec Appliance Corp +00-09-38 (hex) Allot Communications +00-09-39 (hex) ShibaSoku Co.,Ltd. +00-09-3A (hex) Molex Fiber Optics +00-09-3B (hex) HYUNDAI NETWORKS INC. +00-09-3C (hex) Jacques Technologies P/L +00-09-3D (hex) Newisys,Inc. +00-09-3E (hex) C&I Technologies +00-09-3F (hex) Double-Win Enterpirse CO., LTD +00-09-40 (hex) AGFEO GmbH & Co. KG +00-09-41 (hex) Allied Telesis K.K. +00-09-42 (hex) CRESCO, LTD. +00-09-43 (hex) Cisco Systems +00-09-44 (hex) Cisco Systems +00-09-45 (hex) Palmmicro Communications Inc +00-09-46 (hex) Cluster Labs GmbH +00-09-47 (hex) Aztek, Inc. +00-09-48 (hex) Vista Control Systems, Corp. +00-09-49 (hex) Glyph Technologies Inc. +00-09-4A (hex) Homenet Communications +00-09-4B (hex) FillFactory NV +00-09-4C (hex) Communication Weaver Co.,Ltd. +00-09-4D (hex) Braintree Communications Pty Ltd +00-09-4E (hex) BARTECH SYSTEMS INTERNATIONAL, INC +00-09-4F (hex) elmegt GmbH & Co. KG +00-09-50 (hex) Independent Storage Corporation +00-09-51 (hex) Apogee Instruments, Inc +00-09-52 (hex) Auerswald GmbH & Co. KG +00-09-53 (hex) Linkage System Integration Co.Ltd. +00-09-54 (hex) AMiT spol. s. r. o. +00-09-55 (hex) Young Generation International Corp. +00-09-56 (hex) Network Systems Group, Ltd. (NSG) +00-09-57 (hex) Supercaller, Inc. +00-09-58 (hex) INTELNET S.A. +00-09-59 (hex) Sitecsoft +00-09-5A (hex) RACEWOOD TECHNOLOGY +00-09-5B (hex) Netgear, Inc. +00-09-5C (hex) Philips Medical Systems - Cardiac and Monitoring Systems (CM +00-09-5D (hex) Dialogue Technology Corp. +00-09-5E (hex) Masstech Group Inc. +00-09-5F (hex) Telebyte, Inc. +00-09-60 (hex) YOZAN Inc. +00-09-61 (hex) Switchgear and Instrumentation Ltd +00-09-62 (hex) Sonitor Technologies AS +00-09-63 (hex) Dominion Lasercom Inc. +00-09-64 (hex) Hi-Techniques, Inc. +00-09-65 (hex) HyunJu Computer Co., Ltd. +00-09-66 (hex) Thales Navigation +00-09-67 (hex) Tachyon, Inc +00-09-68 (hex) TECHNOVENTURE, INC. +00-09-69 (hex) Meret Optical Communications +00-09-6A (hex) Cloverleaf Communications Inc. +00-09-6B (hex) IBM Corporation +00-09-6C (hex) Imedia Semiconductor Corp. +00-09-6D (hex) Powernet Technologies Corp. +00-09-6E (hex) GIANT ELECTRONICS LTD. +00-09-6F (hex) Beijing Zhongqing Elegant Tech. Corp.,Limited +00-09-70 (hex) Vibration Research Corporation +00-09-71 (hex) Time Management, Inc. +00-09-72 (hex) Securebase,Inc +00-09-73 (hex) Lenten Technology Co., Ltd. +00-09-74 (hex) Innopia Technologies, Inc. +00-09-75 (hex) fSONA Communications Corporation +00-09-76 (hex) Datasoft ISDN Systems GmbH +00-09-77 (hex) Brunner Elektronik AG +00-09-78 (hex) AIJI System Co., Ltd. +00-09-79 (hex) Advanced Television Systems Committee, Inc. +00-09-7A (hex) Louis Design Labs. +00-09-7B (hex) Cisco Systems +00-09-7C (hex) Cisco Systems +00-09-7D (hex) SecWell Networks Oy +00-09-7E (hex) IMI TECHNOLOGY CO., LTD +00-09-7F (hex) Vsecure 2000 LTD. +00-09-80 (hex) Power Zenith Inc. +00-09-81 (hex) Newport Networks +00-09-82 (hex) Loewe Opta GmbH +00-09-83 (hex) Gvision Incorporated +00-09-84 (hex) MyCasa Network Inc. +00-09-85 (hex) Auto Telecom Company +00-09-86 (hex) Metalink LTD. +00-09-87 (hex) NISHI NIPPON ELECTRIC WIRE & CABLE CO.,LTD. +00-09-88 (hex) Nudian Electron Co., Ltd. +00-09-89 (hex) VividLogic Inc. +00-09-8A (hex) EqualLogic Inc +00-09-8B (hex) Entropic Communications, Inc. +00-09-8C (hex) Option Wireless Sweden +00-09-8D (hex) Velocity Semiconductor +00-09-8E (hex) ipcas GmbH +00-09-8F (hex) Cetacean Networks +00-09-90 (hex) ACKSYS Communications & systems +00-09-91 (hex) GE Fanuc Automation Manufacturing, Inc. +00-09-92 (hex) InterEpoch Technology,INC. +00-09-93 (hex) Visteon Corporation +00-09-94 (hex) Cronyx Engineering +00-09-95 (hex) Castle Technology Ltd +00-09-96 (hex) RDI +00-09-97 (hex) Nortel Networks +00-09-98 (hex) Capinfo Company Limited +00-09-99 (hex) CP GEORGES RENAULT +00-09-9A (hex) ELMO COMPANY, LIMITED +00-09-9B (hex) Western Telematic Inc. +00-09-9C (hex) Naval Research Laboratory +00-09-9D (hex) Haliplex Communications +00-09-9E (hex) Testech, Inc. +00-09-9F (hex) VIDEX INC. +00-09-A0 (hex) Microtechno Corporation +00-09-A1 (hex) Telewise Communications, Inc. +00-09-A2 (hex) Interface Co., Ltd. +00-09-A3 (hex) Leadfly Techologies Corp. Ltd. +00-09-A4 (hex) HARTEC Corporation +00-09-A5 (hex) HANSUNG ELETRONIC INDUSTRIES DEVELOPMENT CO., LTD +00-09-A6 (hex) Ignis Optics, Inc. +00-09-A7 (hex) Bang & Olufsen A/S +00-09-A8 (hex) Eastmode Pte Ltd +00-09-A9 (hex) Ikanos Communications +00-09-AA (hex) Data Comm for Business, Inc. +00-09-AB (hex) Netcontrol Oy +00-09-AC (hex) LANVOICE +00-09-AD (hex) HYUNDAI SYSCOMM, INC. +00-09-AE (hex) OKANO ELECTRIC CO.,LTD +00-09-AF (hex) e-generis +00-09-B0 (hex) Onkyo Corporation +00-09-B1 (hex) Kanematsu Electronics, Ltd. +00-09-B2 (hex) L&F Inc. +00-09-B3 (hex) MCM Systems Ltd +00-09-B4 (hex) KISAN TELECOM CO., LTD. +00-09-B5 (hex) 3J Tech. Co., Ltd. +00-09-B6 (hex) Cisco Systems +00-09-B7 (hex) Cisco Systems +00-09-B8 (hex) Entise Systems +00-09-B9 (hex) Action Imaging Solutions +00-09-BA (hex) MAKU Informationstechik GmbH +00-09-BB (hex) MathStar, Inc. +00-09-BC (hex) Digital Safety Technologies, Inc +00-09-BD (hex) Epygi Technologies, Ltd. +00-09-BE (hex) Mamiya-OP Co.,Ltd. +00-09-BF (hex) Nintendo Co.,Ltd. +00-09-C0 (hex) 6WIND +00-09-C1 (hex) PROCES-DATA A/S +00-09-C2 (hex) Onity, Inc. +00-09-C3 (hex) NETAS +00-09-C4 (hex) Medicore Co., Ltd +00-09-C5 (hex) KINGENE Technology Corporation +00-09-C6 (hex) Visionics Corporation +00-09-C7 (hex) Movistec +00-09-C8 (hex) SINAGAWA TSUSHIN KEISOU SERVICE +00-09-C9 (hex) BlueWINC Co., Ltd. +00-09-CA (hex) iMaxNetworks(Shenzhen)Limited. +00-09-CB (hex) HBrain +00-09-CC (hex) Moog GmbH +00-09-CD (hex) HUDSON SOFT CO.,LTD. +00-09-CE (hex) SpaceBridge Semiconductor Corp. +00-09-CF (hex) iAd GmbH +00-09-D0 (hex) Solacom Technologies Inc. +00-09-D1 (hex) SERANOA NETWORKS INC +00-09-D2 (hex) Mai Logic Inc. +00-09-D3 (hex) Western DataCom Co., Inc. +00-09-D4 (hex) Transtech Networks +00-09-D5 (hex) Signal Communication, Inc. +00-09-D6 (hex) KNC One GmbH +00-09-D7 (hex) DC Security Products +00-09-D8 (hex) Fält Communications AB +00-09-D9 (hex) Neoscale Systems, Inc +00-09-DA (hex) Control Module Inc. +00-09-DB (hex) eSpace +00-09-DC (hex) Galaxis Technology AG +00-09-DD (hex) Mavin Technology Inc. +00-09-DE (hex) Samjin Information & Communications Co., Ltd. +00-09-DF (hex) Vestel Komunikasyon Sanayi ve Ticaret A.S. +00-09-E0 (hex) XEMICS S.A. +00-09-E1 (hex) Gemtek Technology Co., Ltd. +00-09-E2 (hex) Sinbon Electronics Co., Ltd. +00-09-E3 (hex) Angel Iglesias S.A. +00-09-E4 (hex) K Tech Infosystem Inc. +00-09-E5 (hex) Hottinger Baldwin Messtechnik GmbH +00-09-E6 (hex) Cyber Switching Inc. +00-09-E7 (hex) ADC Techonology +00-09-E8 (hex) Cisco Systems +00-09-E9 (hex) Cisco Systems +00-09-EA (hex) YEM Inc. +00-09-EB (hex) HuMANDATA LTD. +00-09-EC (hex) Daktronics, Inc. +00-09-ED (hex) CipherOptics +00-09-EE (hex) MEIKYO ELECTRIC CO.,LTD +00-09-EF (hex) Vocera Communications +00-09-F0 (hex) Shimizu Technology Inc. +00-09-F1 (hex) Yamaki Electric Corporation +00-09-F2 (hex) Cohu, Inc., Electronics Division +00-09-F3 (hex) WELL Communication Corp. +00-09-F4 (hex) Alcon Laboratories, Inc. +00-09-F5 (hex) Emerson Network Power Co.,Ltd +00-09-F6 (hex) Shenzhen Eastern Digital Tech Ltd. +00-09-F7 (hex) SED, a division of Calian +00-09-F8 (hex) UNIMO TECHNOLOGY CO., LTD. +00-09-F9 (hex) ART JAPAN CO., LTD. +00-09-FB (hex) Philips Patient Monitoring +00-09-FC (hex) IPFLEX Inc. +00-09-FD (hex) Ubinetics Limited +00-09-FE (hex) Daisy Technologies, Inc. +00-09-FF (hex) X.net 2000 GmbH +00-0A-00 (hex) Mediatek Corp. +00-0A-01 (hex) SOHOware, Inc. +00-0A-02 (hex) ANNSO CO., LTD. +00-0A-03 (hex) ENDESA SERVICIOS, S.L. +00-0A-04 (hex) 3Com Ltd +00-0A-05 (hex) Widax Corp. +00-0A-06 (hex) Teledex LLC +00-0A-07 (hex) WebWayOne Ltd +00-0A-08 (hex) ALPINE ELECTRONICS, INC. +00-0A-09 (hex) TaraCom Integrated Products, Inc. +00-0A-0A (hex) SUNIX Co., Ltd. +00-0A-0B (hex) Sealevel Systems, Inc. +00-0A-0C (hex) Scientific Research Corporation +00-0A-0D (hex) MergeOptics GmbH +00-0A-0E (hex) Invivo Research Inc. +00-0A-0F (hex) Ilryung Telesys, Inc +00-0A-10 (hex) FAST media integrations AG +00-0A-11 (hex) ExPet Technologies, Inc +00-0A-12 (hex) Azylex Technology, Inc +00-0A-13 (hex) Honeywell Video Systems +00-0A-14 (hex) TECO a.s. +00-0A-15 (hex) Silicon Data, Inc +00-0A-16 (hex) Lassen Research +00-0A-17 (hex) NESTAR COMMUNICATIONS, INC +00-0A-18 (hex) Vichel Inc. +00-0A-19 (hex) Valere Power, Inc. +00-0A-1A (hex) Imerge Ltd +00-0A-1B (hex) Stream Labs +00-0A-1C (hex) Bridge Information Co., Ltd. +00-0A-1D (hex) Optical Communications Products Inc. +00-0A-1E (hex) Red-M Products Limited +00-0A-1F (hex) ART WARE Telecommunication Co., Ltd. +00-0A-20 (hex) SVA Networks, Inc. +00-0A-21 (hex) Integra Telecom Co. Ltd +00-0A-22 (hex) Amperion Inc +00-0A-23 (hex) Parama Networks Inc +00-0A-24 (hex) Octave Communications +00-0A-25 (hex) CERAGON NETWORKS +00-0A-26 (hex) CEIA S.p.A. +00-0A-27 (hex) Apple Computer, Inc. +00-0A-28 (hex) Motorola +00-0A-29 (hex) Pan Dacom Networking AG +00-0A-2A (hex) QSI Systems Inc. +00-0A-2B (hex) Etherstuff +00-0A-2C (hex) Active Tchnology Corporation +00-0A-2D (hex) Cabot Communications Limited +00-0A-2E (hex) MAPLE NETWORKS CO., LTD +00-0A-2F (hex) Artnix Inc. +00-0A-30 (hex) Johnson Controls-ASG +00-0A-31 (hex) HCV Wireless +00-0A-32 (hex) Xsido Corporation +00-0A-33 (hex) Emulex Corporation +00-0A-34 (hex) Identicard Systems Incorporated +00-0A-35 (hex) Xilinx +00-0A-36 (hex) Synelec Telecom Multimedia +00-0A-37 (hex) Procera Networks, Inc. +00-0A-38 (hex) Apani Networks +00-0A-39 (hex) LoPA Information Technology +00-0A-3A (hex) J-THREE INTERNATIONAL Holding Co., Ltd. +00-0A-3B (hex) GCT Semiconductor, Inc +00-0A-3C (hex) Enerpoint Ltd. +00-0A-3D (hex) Elo Sistemas Eletronicos S.A. +00-0A-3E (hex) EADS Telecom +00-0A-3F (hex) Data East Corporation +00-0A-40 (hex) Crown Audio -- Harmanm International +00-0A-41 (hex) Cisco Systems +00-0A-42 (hex) Cisco Systems +00-0A-43 (hex) Chunghwa Telecom Co., Ltd. +00-0A-44 (hex) Avery Dennison Deutschland GmbH +00-0A-45 (hex) Audio-Technica Corp. +00-0A-46 (hex) ARO Controls SAS +00-0A-47 (hex) Allied Vision Technologies +00-0A-48 (hex) Albatron Technology +00-0A-49 (hex) F5 Networks, Inc. +00-0A-4A (hex) Targa Systems Ltd. +00-0A-4B (hex) DataPower Technology, Inc. +00-0A-4C (hex) Molecular Devices Corporation +00-0A-4D (hex) Noritz Corporation +00-0A-4E (hex) UNITEK Electronics INC. +00-0A-4F (hex) Brain Boxes Limited +00-0A-50 (hex) REMOTEK CORPORATION +00-0A-51 (hex) GyroSignal Technology Co., Ltd. +00-0A-52 (hex) AsiaRF Ltd. +00-0A-53 (hex) Intronics, Incorporated +00-0A-54 (hex) Laguna Hills, Inc. +00-0A-55 (hex) MARKEM Corporation +00-0A-56 (hex) HITACHI Maxell Ltd. +00-0A-57 (hex) Hewlett-Packard Company - Standards +00-0A-58 (hex) Ingenieur-Buero Freyer & Siegel +00-0A-59 (hex) HW server +00-0A-5A (hex) GreenNET Technologies Co.,Ltd. +00-0A-5B (hex) Power-One as +00-0A-5C (hex) Carel s.p.a. +00-0A-5D (hex) PUC Founder (MSC) Berhad +00-0A-5E (hex) 3COM Corporation +00-0A-5F (hex) almedio inc. +00-0A-60 (hex) Autostar Technology Pte Ltd +00-0A-61 (hex) Cellinx Systems Inc. +00-0A-62 (hex) Crinis Networks, Inc. +00-0A-63 (hex) DHD GmbH +00-0A-64 (hex) Eracom Technologies +00-0A-65 (hex) GentechMedia.co.,ltd. +00-0A-66 (hex) MITSUBISHI ELECTRIC SYSTEM & SERVICE CO.,LTD. +00-0A-67 (hex) OngCorp +00-0A-68 (hex) SolarFlare Communications, Inc. +00-0A-69 (hex) SUNNY bell Technology Co., Ltd. +00-0A-6A (hex) SVM Microwaves s.r.o. +00-0A-6B (hex) Tadiran Telecom Business Systems LTD +00-0A-6C (hex) Walchem Corporation +00-0A-6D (hex) EKS Elektronikservice GmbH +00-0A-6E (hex) Broadcast Technology Limited +00-0A-6F (hex) ZyFLEX Technologies Inc +00-0A-70 (hex) MPLS Forum +00-0A-71 (hex) Avrio Technologies, Inc +00-0A-72 (hex) STEC, INC. +00-0A-73 (hex) Scientific Atlanta +00-0A-74 (hex) Manticom Networks Inc. +00-0A-75 (hex) Caterpillar, Inc +00-0A-76 (hex) Beida Jade Bird Huaguang Technology Co.,Ltd +00-0A-77 (hex) Bluewire Technologies LLC +00-0A-78 (hex) OLITEC +00-0A-79 (hex) Allied Telesis K.K. corega division +00-0A-7A (hex) Kyoritsu Electric Co., Ltd. +00-0A-7B (hex) Cornelius Consult +00-0A-7C (hex) Tecton Ltd +00-0A-7D (hex) Valo, Inc. +00-0A-7E (hex) The Advantage Group +00-0A-7F (hex) Teradon Industries, Inc +00-0A-80 (hex) Telkonet Inc. +00-0A-81 (hex) TEIMA Audiotex S.L. +00-0A-82 (hex) TATSUTA SYSTEM ELECTRONICS CO.,LTD. +00-0A-83 (hex) SALTO SYSTEMS S.L. +00-0A-84 (hex) Rainsun Enterprise Co., Ltd. +00-0A-85 (hex) PLAT'C2,Inc +00-0A-86 (hex) Lenze +00-0A-87 (hex) Integrated Micromachines Inc. +00-0A-88 (hex) InCypher S.A. +00-0A-89 (hex) Creval Systems, Inc. +00-0A-8A (hex) Cisco Systems +00-0A-8B (hex) Cisco Systems +00-0A-8C (hex) Guardware Systems Ltd. +00-0A-8D (hex) EUROTHERM LIMITED +00-0A-8E (hex) Invacom Ltd +00-0A-8F (hex) Aska International Inc. +00-0A-90 (hex) Bayside Interactive, Inc. +00-0A-91 (hex) HemoCue AB +00-0A-92 (hex) Presonus Corporation +00-0A-93 (hex) W2 Networks, Inc. +00-0A-94 (hex) ShangHai cellink CO., LTD +00-0A-95 (hex) Apple Computer, Inc. +00-0A-96 (hex) MEWTEL TECHNOLOGY INC. +00-0A-97 (hex) SONICblue, Inc. +00-0A-98 (hex) M+F Gwinner GmbH & Co +00-0A-99 (hex) Dataradio Inc. +00-0A-9A (hex) Aiptek International Inc +00-0A-9B (hex) Towa Meccs Corporation +00-0A-9C (hex) Server Technology, Inc. +00-0A-9D (hex) King Young Technology Co. Ltd. +00-0A-9E (hex) BroadWeb Corportation +00-0A-9F (hex) Pannaway Technologies, Inc. +00-0A-A0 (hex) Cedar Point Communications +00-0A-A1 (hex) V V S Limited +00-0A-A2 (hex) SYSTEK INC. +00-0A-A3 (hex) SHIMAFUJI ELECTRIC CO.,LTD. +00-0A-A4 (hex) SHANGHAI SURVEILLANCE TECHNOLOGY CO,LTD +00-0A-A5 (hex) MAXLINK INDUSTRIES LIMITED +00-0A-A6 (hex) Hochiki Corporation +00-0A-A7 (hex) FEI Electron Optics +00-0A-A8 (hex) ePipe Pty. Ltd. +00-0A-A9 (hex) Brooks Automation GmbH +00-0A-AA (hex) AltiGen Communications Inc. +00-0A-AB (hex) Toyota Technical Development Corporation +00-0A-AC (hex) TerraTec Electronic GmbH +00-0A-AD (hex) Stargames Corporation +00-0A-AE (hex) Rosemount Process Analytical +00-0A-AF (hex) Pipal Systems +00-0A-B0 (hex) LOYTEC electronics GmbH +00-0A-B1 (hex) GENETEC Corporation +00-0A-B2 (hex) Fresnel Wireless Systems +00-0A-B3 (hex) Fa. GIRA +00-0A-B4 (hex) ETIC Telecommunications +00-0A-B5 (hex) Digital Electronic Network +00-0A-B6 (hex) COMPUNETIX, INC +00-0A-B7 (hex) Cisco Systems +00-0A-B8 (hex) Cisco Systems +00-0A-B9 (hex) Astera Technologies Corp. +00-0A-BA (hex) Arcon Technology Limited +00-0A-BB (hex) Taiwan Secom Co,. Ltd +00-0A-BC (hex) Seabridge Ltd. +00-0A-BD (hex) Rupprecht & Patashnick Co. +00-0A-BE (hex) OPNET Technologies CO., LTD. +00-0A-BF (hex) HIROTA SS +00-0A-C0 (hex) Fuyoh Video Industry CO., LTD. +00-0A-C1 (hex) Futuretel +00-0A-C2 (hex) FiberHome Telecommunication Technologies CO.,LTD +00-0A-C3 (hex) eM Technics Co., Ltd. +00-0A-C4 (hex) Daewoo Teletech Co., Ltd +00-0A-C5 (hex) Color Kinetics +00-0A-C6 (hex) Ceterus Networks, Inc. +00-0A-C7 (hex) Unication Group +00-0A-C8 (hex) ZPSYS CO.,LTD. (Planning&Management) +00-0A-C9 (hex) Zambeel Inc +00-0A-CA (hex) YOKOYAMA SHOKAI CO.,Ltd. +00-0A-CB (hex) XPAK MSA Group +00-0A-CC (hex) Winnow Networks, Inc. +00-0A-CD (hex) Sunrich Technology Limited +00-0A-CE (hex) RADIANTECH, INC. +00-0A-CF (hex) PROVIDEO Multimedia Co. Ltd. +00-0A-D0 (hex) Niigata Develoment Center, F.I.T. Co., Ltd. +00-0A-D1 (hex) MWS +00-0A-D2 (hex) JEPICO Corporation +00-0A-D3 (hex) INITECH Co., Ltd +00-0A-D4 (hex) CoreBell Systems Inc. +00-0A-D5 (hex) Brainchild Electronic Co., Ltd. +00-0A-D6 (hex) BeamReach Networks +00-0A-D7 (hex) Origin ELECTRIC CO.,LTD. +00-0A-D8 (hex) IPCserv Technology Corp. +00-0A-D9 (hex) Sony Ericsson Mobile Communications AB +00-0A-DA (hex) Vindicator Technologies +00-0A-DB (hex) SkyPilot Network, Inc +00-0A-DC (hex) RuggedCom Inc. +00-0A-DD (hex) Allworx Corp. +00-0A-DE (hex) Happy Communication Co., Ltd. +00-0A-DF (hex) Gennum Corporation +00-0A-E0 (hex) Fujitsu Softek +00-0A-E1 (hex) EG Technology +00-0A-E2 (hex) Binatone Electronics International, Ltd +00-0A-E3 (hex) YANG MEI TECHNOLOGY CO., LTD +00-0A-E4 (hex) Wistron Corp. +00-0A-E5 (hex) ScottCare Corporation +00-0A-E6 (hex) Elitegroup Computer System Co. (ECS) +00-0A-E7 (hex) ELIOP S.A. +00-0A-E8 (hex) Cathay Roxus Information Technology Co. LTD +00-0A-E9 (hex) AirVast Technology Inc. +00-0A-EA (hex) ADAM ELEKTRONIK LTD.STI. +00-0A-EB (hex) Shenzhen Tp-Link Technology Co; Ltd. +00-0A-EC (hex) Koatsu Gas Kogyo Co., Ltd. +00-0A-ED (hex) HARTING Systems GmbH & Co KG +00-0A-EE (hex) GCD Hard- & Software GmbH +00-0A-EF (hex) OTRUM ASA +00-0A-F0 (hex) SHIN-OH ELECTRONICS CO., LTD. R&D +00-0A-F1 (hex) Clarity Design, Inc. +00-0A-F2 (hex) NeoAxiom Corp. +00-0A-F3 (hex) Cisco Systems +00-0A-F4 (hex) Cisco Systems +00-0A-F5 (hex) Airgo Networks, Inc. +00-0A-F6 (hex) Emerson Climate Technologies Retail Solutions, Inc. +00-0A-F7 (hex) Broadcom Corp. +00-0A-F8 (hex) American Telecare Inc. +00-0A-F9 (hex) HiConnect, Inc. +00-0A-FA (hex) Traverse Technologies Australia +00-0A-FB (hex) Ambri Limited +00-0A-FC (hex) Core Tec Communications, LLC +00-0A-FD (hex) Viking Electronic Services +00-0A-FE (hex) NovaPal Ltd +00-0A-FF (hex) Kilchherr Elektronik AG +00-0B-00 (hex) FUJIAN START COMPUTER EQUIPMENT CO.,LTD +00-0B-01 (hex) DAIICHI ELECTRONICS CO., LTD. +00-0B-02 (hex) Dallmeier electronic +00-0B-03 (hex) Taekwang Industrial Co., Ltd +00-0B-04 (hex) Volktek Corporation +00-0B-05 (hex) Pacific Broadband Networks +00-0B-06 (hex) Motorola BCS +00-0B-07 (hex) Voxpath Networks +00-0B-08 (hex) Pillar Data Systems +00-0B-09 (hex) Ifoundry Systems Singapore +00-0B-0A (hex) dBm Optics +00-0B-0B (hex) Corrent Corporation +00-0B-0C (hex) Agile Systems Inc. +00-0B-0D (hex) Air2U, Inc. +00-0B-0E (hex) Trapeze Networks +00-0B-0F (hex) Nyquist Industrial Control BV +00-0B-10 (hex) 11wave Technonlogy Co.,Ltd +00-0B-11 (hex) HIMEJI ABC TRADING CO.,LTD. +00-0B-12 (hex) NURI Telecom Co., Ltd. +00-0B-13 (hex) ZETRON INC +00-0B-14 (hex) ViewSonic Corporation +00-0B-15 (hex) Platypus Technology +00-0B-16 (hex) Communication Machinery Corporation +00-0B-17 (hex) MKS Instruments +00-0B-18 (hex) PRIVATE +00-0B-19 (hex) Vernier Networks, Inc. +00-0B-1A (hex) Industrial Defender, Inc. +00-0B-1B (hex) Systronix, Inc. +00-0B-1C (hex) SIBCO bv +00-0B-1D (hex) LayerZero Power Systems, Inc. +00-0B-1E (hex) KAPPA opto-electronics GmbH +00-0B-1F (hex) I CON Computer Co. +00-0B-20 (hex) Hirata corporation +00-0B-21 (hex) G-Star Communications Inc. +00-0B-22 (hex) Environmental Systems and Services +00-0B-23 (hex) Siemens Subscriber Networks +00-0B-24 (hex) AirLogic +00-0B-25 (hex) Aeluros +00-0B-26 (hex) Wetek Corporation +00-0B-27 (hex) Scion Corporation +00-0B-28 (hex) Quatech Inc. +00-0B-29 (hex) LS(LG) Industrial Systems co.,Ltd +00-0B-2A (hex) HOWTEL Co., Ltd. +00-0B-2B (hex) HOSTNET CORPORATION +00-0B-2C (hex) Eiki Industrial Co. Ltd. +00-0B-2D (hex) Danfoss Inc. +00-0B-2E (hex) Cal-Comp Electronics (Thailand) Public Company Limited Taipe +00-0B-2F (hex) bplan GmbH +00-0B-30 (hex) Beijing Gongye Science & Technology Co.,Ltd +00-0B-31 (hex) Yantai ZhiYang Scientific and technology industry CO., LTD +00-0B-32 (hex) VORMETRIC, INC. +00-0B-33 (hex) Vivato +00-0B-34 (hex) ShangHai Broadband Technologies CO.LTD +00-0B-35 (hex) Quad Bit System co., Ltd. +00-0B-36 (hex) Productivity Systems, Inc. +00-0B-37 (hex) MANUFACTURE DES MONTRES ROLEX SA +00-0B-38 (hex) Knuerr AG +00-0B-39 (hex) Keisoku Giken Co.,Ltd. +00-0B-3A (hex) QuStream Corporation +00-0B-3B (hex) devolo AG +00-0B-3C (hex) Cygnal Integrated Products, Inc. +00-0B-3D (hex) CONTAL OK Ltd. +00-0B-3E (hex) BittWare, Inc +00-0B-3F (hex) Anthology Solutions Inc. +00-0B-40 (hex) OpNext Inc. +00-0B-41 (hex) Ing. Buero Dr. Beutlhauser +00-0B-42 (hex) commax Co., Ltd. +00-0B-43 (hex) Microscan Systems, Inc. +00-0B-44 (hex) Concord IDea Corp. +00-0B-45 (hex) Cisco +00-0B-46 (hex) Cisco +00-0B-47 (hex) Advanced Energy +00-0B-48 (hex) sofrel +00-0B-49 (hex) RF-Link System Inc. +00-0B-4A (hex) Visimetrics (UK) Ltd +00-0B-4B (hex) VISIOWAVE SA +00-0B-4C (hex) Clarion (M) Sdn Bhd +00-0B-4D (hex) Emuzed +00-0B-4E (hex) VertexRSI, General Dynamics SatCOM Technologies, Inc. +00-0B-4F (hex) Verifone, INC. +00-0B-50 (hex) Oxygnet +00-0B-51 (hex) Micetek International Inc. +00-0B-52 (hex) JOYMAX ELECTRONICS CORP. +00-0B-53 (hex) INITIUM Co., Ltd. +00-0B-54 (hex) BiTMICRO Networks, Inc. +00-0B-55 (hex) ADInstruments +00-0B-56 (hex) Cybernetics +00-0B-57 (hex) Silicon Laboratories +00-0B-58 (hex) Astronautics C.A LTD +00-0B-59 (hex) ScriptPro, LLC +00-0B-5A (hex) HyperEdge +00-0B-5B (hex) Rincon Research Corporation +00-0B-5C (hex) Newtech Co.,Ltd +00-0B-5D (hex) FUJITSU LIMITED +00-0B-5E (hex) Audio Engineering Society Inc. +00-0B-5F (hex) Cisco Systems +00-0B-60 (hex) Cisco Systems +00-0B-61 (hex) Friedrich Lütze GmbH &Co. +00-0B-62 (hex) Ingenieurbuero fuer Elektronikdesign Ingo Mohnen +00-0B-63 (hex) Kaleidescape +00-0B-64 (hex) Kieback & Peter GmbH & Co KG +00-0B-65 (hex) Sy.A.C. srl +00-0B-66 (hex) Teralink Communications +00-0B-67 (hex) Topview Technology Corporation +00-0B-68 (hex) Addvalue Communications Pte Ltd +00-0B-69 (hex) Franke Finland Oy +00-0B-6A (hex) Asiarock Incorporation +00-0B-6B (hex) Wistron Neweb Corp. +00-0B-6C (hex) Sychip Inc. +00-0B-6D (hex) SOLECTRON JAPAN NAKANIIDA +00-0B-6E (hex) Neff Instrument Corp. +00-0B-6F (hex) Media Streaming Networks Inc +00-0B-70 (hex) Load Technology, Inc. +00-0B-71 (hex) Litchfield Communications Inc. +00-0B-72 (hex) Lawo AG +00-0B-73 (hex) Kodeos Communications +00-0B-74 (hex) Kingwave Technology Co., Ltd. +00-0B-75 (hex) Iosoft Ltd. +00-0B-76 (hex) ET&T Technology Co. Ltd. +00-0B-77 (hex) Cogent Systems, Inc. +00-0B-78 (hex) TAIFATECH INC. +00-0B-79 (hex) X-COM, Inc. +00-0B-7A (hex) Wave Science Inc. +00-0B-7B (hex) Test-Um Inc. +00-0B-7C (hex) Telex Communications +00-0B-7D (hex) SOLOMON EXTREME INTERNATIONAL LTD. +00-0B-7E (hex) SAGINOMIYA Seisakusho Inc. +00-0B-7F (hex) OmniWerks +00-0B-80 (hex) Lycium Networks +00-0B-81 (hex) Kaparel Corporation +00-0B-82 (hex) Grandstream Networks, Inc. +00-0B-83 (hex) DATAWATT B.V. +00-0B-84 (hex) BODET +00-0B-85 (hex) Cisco Systems +00-0B-86 (hex) Aruba Networks +00-0B-87 (hex) American Reliance Inc. +00-0B-88 (hex) Vidisco ltd. +00-0B-89 (hex) Top Global Technology, Ltd. +00-0B-8A (hex) MITEQ Inc. +00-0B-8B (hex) KERAJET, S.A. +00-0B-8C (hex) Flextronics +00-0B-8D (hex) Avvio Networks +00-0B-8E (hex) Ascent Corporation +00-0B-8F (hex) AKITA ELECTRONICS SYSTEMS CO.,LTD. +00-0B-90 (hex) Adva Optical Networking Inc. +00-0B-91 (hex) Aglaia Gesellschaft für Bildverarbeitung und Kommunikation m +00-0B-92 (hex) Ascom Danmark A/S +00-0B-93 (hex) Ritter Elektronik +00-0B-94 (hex) Digital Monitoring Products, Inc. +00-0B-95 (hex) eBet Gaming Systems Pty Ltd +00-0B-96 (hex) Innotrac Diagnostics Oy +00-0B-97 (hex) Matsushita Electric Industrial Co.,Ltd. +00-0B-98 (hex) NiceTechVision +00-0B-99 (hex) SensAble Technologies, Inc. +00-0B-9A (hex) Shanghai Ulink Telecom Equipment Co. Ltd. +00-0B-9B (hex) Sirius System Co, Ltd. +00-0B-9C (hex) TriBeam Technologies, Inc. +00-0B-9D (hex) TwinMOS Technologies Inc. +00-0B-9E (hex) Yasing Technology Corp. +00-0B-9F (hex) Neue ELSA GmbH +00-0B-A0 (hex) T&L Information Inc. +00-0B-A1 (hex) SYSCOM Ltd. +00-0B-A2 (hex) Sumitomo Electric Networks, Inc +00-0B-A3 (hex) Siemens AG, I&S +00-0B-A4 (hex) Shiron Satellite Communications Ltd. (1996) +00-0B-A5 (hex) Quasar Cipta Mandiri, PT +00-0B-A6 (hex) Miyakawa Electric Works Ltd. +00-0B-A7 (hex) Maranti Networks +00-0B-A8 (hex) HANBACK ELECTRONICS CO., LTD. +00-0B-A9 (hex) CloudShield Technologies, Inc. +00-0B-AA (hex) Aiphone co.,Ltd +00-0B-AB (hex) Advantech Technology (CHINA) Co., Ltd. +00-0B-AC (hex) 3Com Ltd +00-0B-AD (hex) PC-PoS Inc. +00-0B-AE (hex) Vitals System Inc. +00-0B-AF (hex) WOOJU COMMUNICATIONS Co,.Ltd +00-0B-B0 (hex) Sysnet Telematica srl +00-0B-B1 (hex) Super Star Technology Co., Ltd. +00-0B-B2 (hex) SMALLBIG TECHNOLOGY +00-0B-B3 (hex) RiT technologies Ltd. +00-0B-B4 (hex) RDC Semiconductor Inc., +00-0B-B5 (hex) nStor Technologies, Inc. +00-0B-B6 (hex) Mototech Inc. +00-0B-B7 (hex) Micro Systems Co.,Ltd. +00-0B-B8 (hex) Kihoku Electronic Co. +00-0B-B9 (hex) Imsys AB +00-0B-BA (hex) Harmonic Broadband Access Networks +00-0B-BB (hex) Etin Systems Co., Ltd +00-0B-BC (hex) En Garde Systems, Inc. +00-0B-BD (hex) Connexionz Limited +00-0B-BE (hex) Cisco Systems +00-0B-BF (hex) Cisco Systems +00-0B-C0 (hex) China IWNComm Co., Ltd. +00-0B-C1 (hex) Bay Microsystems, Inc. +00-0B-C2 (hex) Corinex Communication Corp. +00-0B-C3 (hex) Multiplex, Inc. +00-0B-C4 (hex) BIOTRONIK GmbH & Co +00-0B-C5 (hex) SMC Networks, Inc. +00-0B-C6 (hex) ISAC, Inc. +00-0B-C7 (hex) ICET S.p.A. +00-0B-C8 (hex) AirFlow Networks +00-0B-C9 (hex) Electroline Equipment +00-0B-CA (hex) DATAVAN International Corporation +00-0B-CB (hex) Fagor Automation , S. Coop +00-0B-CC (hex) JUSAN, S.A. +00-0B-CD (hex) Hewlett Packard +00-0B-CE (hex) Free2move AB +00-0B-CF (hex) AGFA NDT INC. +00-0B-D0 (hex) XiMeta Technology Americas Inc. +00-0B-D1 (hex) Aeronix, Inc. +00-0B-D2 (hex) Remopro Technology Inc. +00-0B-D3 (hex) cd3o +00-0B-D4 (hex) Beijing Wise Technology & Science Development Co.Ltd +00-0B-D5 (hex) Nvergence, Inc. +00-0B-D6 (hex) Paxton Access Ltd +00-0B-D7 (hex) DORMA Time + Access GmbH +00-0B-D8 (hex) Industrial Scientific Corp. +00-0B-D9 (hex) General Hydrogen +00-0B-DA (hex) EyeCross Co.,Inc. +00-0B-DB (hex) Dell ESG PCBA Test +00-0B-DC (hex) AKCP +00-0B-DD (hex) TOHOKU RICOH Co., LTD. +00-0B-DE (hex) TELDIX GmbH +00-0B-DF (hex) Shenzhen RouterD Networks Limited +00-0B-E0 (hex) SercoNet Ltd. +00-0B-E1 (hex) Nokia NET Product Operations +00-0B-E2 (hex) Lumenera Corporation +00-0B-E3 (hex) Key Stream Co., Ltd. +00-0B-E4 (hex) Hosiden Corporation +00-0B-E5 (hex) HIMS Korea Co., Ltd. +00-0B-E6 (hex) Datel Electronics +00-0B-E7 (hex) COMFLUX TECHNOLOGY INC. +00-0B-E8 (hex) AOIP +00-0B-E9 (hex) Actel Corporation +00-0B-EA (hex) Zultys Technologies +00-0B-EB (hex) Systegra AG +00-0B-EC (hex) NIPPON ELECTRIC INSTRUMENT, INC. +00-0B-ED (hex) ELM Inc. +00-0B-EE (hex) inc.jet, Incorporated +00-0B-EF (hex) Code Corporation +00-0B-F0 (hex) MoTEX Products Co., Ltd. +00-0B-F1 (hex) LAP Laser Applikations +00-0B-F2 (hex) Chih-Kan Technology Co., Ltd. +00-0B-F3 (hex) BAE SYSTEMS +00-0B-F4 (hex) PRIVATE +00-0B-F5 (hex) Shanghai Sibo Telecom Technology Co.,Ltd +00-0B-F6 (hex) Nitgen Co., Ltd +00-0B-F7 (hex) NIDEK CO.,LTD +00-0B-F8 (hex) Infinera +00-0B-F9 (hex) Gemstone communications, Inc. +00-0B-FA (hex) EXEMYS SRL +00-0B-FB (hex) D-NET International Corporation +00-0B-FC (hex) Cisco Systems +00-0B-FD (hex) Cisco Systems +00-0B-FE (hex) CASTEL Broadband Limited +00-0B-FF (hex) Berkeley Camera Engineering +00-0C-00 (hex) BEB Industrie-Elektronik AG +00-0C-01 (hex) Abatron AG +00-0C-02 (hex) ABB Oy +00-0C-03 (hex) HDMI Licensing, LLC +00-0C-04 (hex) Tecnova +00-0C-05 (hex) RPA Reserch Co., Ltd. +00-0C-06 (hex) Nixvue Systems Pte Ltd +00-0C-07 (hex) Iftest AG +00-0C-08 (hex) HUMEX Technologies Corp. +00-0C-09 (hex) Hitachi IE Systems Co., Ltd +00-0C-0A (hex) Guangdong Province Electronic Technology Research Institute +00-0C-0B (hex) Broadbus Technologies +00-0C-0C (hex) APPRO TECHNOLOGY INC. +00-0C-0D (hex) Communications & Power Industries / Satcom Division +00-0C-0E (hex) XtremeSpectrum, Inc. +00-0C-0F (hex) Techno-One Co., Ltd +00-0C-10 (hex) PNI Corporation +00-0C-11 (hex) NIPPON DEMPA CO.,LTD. +00-0C-12 (hex) Micro-Optronic-Messtechnik GmbH +00-0C-13 (hex) MediaQ +00-0C-14 (hex) Diagnostic Instruments, Inc. +00-0C-15 (hex) CyberPower Systems, Inc. +00-0C-16 (hex) Concorde Microsystems Inc. +00-0C-17 (hex) AJA Video Systems Inc +00-0C-18 (hex) Zenisu Keisoku Inc. +00-0C-19 (hex) Telio Communications GmbH +00-0C-1A (hex) Quest Technical Solutions Inc. +00-0C-1B (hex) ORACOM Co, Ltd. +00-0C-1C (hex) MicroWeb Co., Ltd. +00-0C-1D (hex) Mettler & Fuchs AG +00-0C-1E (hex) Global Cache +00-0C-1F (hex) Glimmerglass Networks +00-0C-20 (hex) Fi WIn, Inc. +00-0C-21 (hex) Faculty of Science and Technology, Keio University +00-0C-22 (hex) Double D Electronics Ltd +00-0C-23 (hex) Beijing Lanchuan Tech. Co., Ltd. +00-0C-24 (hex) ANATOR +00-0C-25 (hex) Allied Telesyn Networks +00-0C-26 (hex) Weintek Labs. Inc. +00-0C-27 (hex) Sammy Corporation +00-0C-28 (hex) RIFATRON +00-0C-29 (hex) VMware, Inc. +00-0C-2A (hex) OCTTEL Communication Co., Ltd. +00-0C-2B (hex) ELIAS Technology, Inc. +00-0C-2C (hex) Enwiser Inc. +00-0C-2D (hex) FullWave Technology Co., Ltd. +00-0C-2E (hex) Openet information technology(shenzhen) Co., Ltd. +00-0C-2F (hex) SeorimTechnology Co.,Ltd. +00-0C-30 (hex) Cisco +00-0C-31 (hex) Cisco +00-0C-32 (hex) Avionic Design Development GmbH +00-0C-33 (hex) Compucase Enterprise Co. Ltd. +00-0C-34 (hex) Vixen Co., Ltd. +00-0C-35 (hex) KaVo Dental GmbH & Co. KG +00-0C-36 (hex) SHARP TAKAYA ELECTRONICS INDUSTRY CO.,LTD. +00-0C-37 (hex) Geomation, Inc. +00-0C-38 (hex) TelcoBridges Inc. +00-0C-39 (hex) Sentinel Wireless Inc. +00-0C-3A (hex) Oxance +00-0C-3B (hex) Orion Electric Co., Ltd. +00-0C-3C (hex) MediaChorus, Inc. +00-0C-3D (hex) Glsystech Co., Ltd. +00-0C-3E (hex) Crest Audio +00-0C-3F (hex) Cogent Defence & Security Networks, +00-0C-40 (hex) Altech Controls +00-0C-41 (hex) Cisco-Linksys +00-0C-42 (hex) Routerboard.com +00-0C-43 (hex) Ralink Technology, Corp. +00-0C-44 (hex) Automated Interfaces, Inc. +00-0C-45 (hex) Animation Technologies Inc. +00-0C-46 (hex) Allied Telesyn Inc. +00-0C-47 (hex) SK Teletech(R&D Planning Team) +00-0C-48 (hex) QoStek Corporation +00-0C-49 (hex) Dangaard Telecom RTC Division A/S +00-0C-4A (hex) Cygnus Microsystems (P) Limited +00-0C-4B (hex) Cheops Elektronik +00-0C-4C (hex) Arcor AG&Co. +00-0C-4D (hex) ACRA CONTROL +00-0C-4E (hex) Winbest Technology CO,LT +00-0C-4F (hex) UDTech Japan Corporation +00-0C-50 (hex) Seagate Technology +00-0C-51 (hex) Scientific Technologies Inc. +00-0C-52 (hex) Roll Systems Inc. +00-0C-53 (hex) PRIVATE +00-0C-54 (hex) Pedestal Networks, Inc +00-0C-55 (hex) Microlink Communications Inc. +00-0C-56 (hex) Megatel Computer (1986) Corp. +00-0C-57 (hex) MACKIE Engineering Services Belgium BVBA +00-0C-58 (hex) M&S Systems +00-0C-59 (hex) Indyme Electronics, Inc. +00-0C-5A (hex) IBSmm Industrieelektronik Multimedia +00-0C-5B (hex) HANWANG TECHNOLOGY CO.,LTD +00-0C-5C (hex) GTN Systems B.V. +00-0C-5D (hex) CHIC TECHNOLOGY (CHINA) CORP. +00-0C-5E (hex) Calypso Medical +00-0C-5F (hex) Avtec, Inc. +00-0C-60 (hex) ACM Systems +00-0C-61 (hex) AC Tech corporation DBA Advanced Digital +00-0C-62 (hex) ABB Automation Technology Products AB, Control +00-0C-63 (hex) Zenith Electronics Corporation +00-0C-64 (hex) X2 MSA Group +00-0C-65 (hex) Sunin Telecom +00-0C-66 (hex) Pronto Networks Inc +00-0C-67 (hex) OYO ELECTRIC CO.,LTD +00-0C-68 (hex) SigmaTel, Inc. +00-0C-69 (hex) National Radio Astronomy Observatory +00-0C-6A (hex) MBARI +00-0C-6B (hex) Kurz Industrie-Elektronik GmbH +00-0C-6C (hex) Elgato Systems LLC +00-0C-6D (hex) Edwards Ltd. +00-0C-6E (hex) ASUSTEK COMPUTER INC. +00-0C-6F (hex) Amtek system co.,LTD. +00-0C-70 (hex) ACC GmbH +00-0C-71 (hex) Wybron, Inc +00-0C-72 (hex) Tempearl Industrial Co., Ltd. +00-0C-73 (hex) TELSON ELECTRONICS CO., LTD +00-0C-74 (hex) RIVERTEC CORPORATION +00-0C-75 (hex) Oriental integrated electronics. LTD +00-0C-76 (hex) MICRO-STAR INTERNATIONAL CO., LTD. +00-0C-77 (hex) Life Racing Ltd +00-0C-78 (hex) In-Tech Electronics Limited +00-0C-79 (hex) Extel Communications P/L +00-0C-7A (hex) DaTARIUS Technologies GmbH +00-0C-7B (hex) ALPHA PROJECT Co.,Ltd. +00-0C-7C (hex) Internet Information Image Inc. +00-0C-7D (hex) TEIKOKU ELECTRIC MFG. CO., LTD +00-0C-7E (hex) Tellium Incorporated +00-0C-7F (hex) synertronixx GmbH +00-0C-80 (hex) Opelcomm Inc. +00-0C-81 (hex) Nulec Industries Pty Ltd +00-0C-82 (hex) NETWORK TECHNOLOGIES INC +00-0C-83 (hex) Logical Solutions +00-0C-84 (hex) Eazix, Inc. +00-0C-85 (hex) Cisco Systems +00-0C-86 (hex) Cisco Systems +00-0C-87 (hex) AMD +00-0C-88 (hex) Apache Micro Peripherals, Inc. +00-0C-89 (hex) AC Electric Vehicles, Ltd. +00-0C-8A (hex) Bose Corporation +00-0C-8B (hex) Connect Tech Inc +00-0C-8C (hex) KODICOM CO.,LTD. +00-0C-8D (hex) MATRIX VISION GmbH +00-0C-8E (hex) Mentor Engineering Inc +00-0C-8F (hex) Nergal s.r.l. +00-0C-90 (hex) Octasic Inc. +00-0C-91 (hex) Riverhead Networks Inc. +00-0C-92 (hex) WolfVision Gmbh +00-0C-93 (hex) Xeline Co., Ltd. +00-0C-94 (hex) United Electronic Industries, Inc. (EUI) +00-0C-95 (hex) PrimeNet +00-0C-96 (hex) OQO, Inc. +00-0C-97 (hex) NV ADB TTV Technologies SA +00-0C-98 (hex) LETEK Communications Inc. +00-0C-99 (hex) HITEL LINK Co.,Ltd +00-0C-9A (hex) Hitech Electronics Corp. +00-0C-9B (hex) EE Solutions, Inc +00-0C-9C (hex) Chongho information & communications +00-0C-9D (hex) AirWalk Communications, Inc. +00-0C-9E (hex) MemoryLink Corp. +00-0C-9F (hex) NKE Corporation +00-0C-A0 (hex) StorCase Technology, Inc. +00-0C-A1 (hex) SIGMACOM Co., LTD. +00-0C-A2 (hex) Scopus Network Technologies Ltd +00-0C-A3 (hex) Rancho Technology, Inc. +00-0C-A4 (hex) Prompttec Product Management GmbH +00-0C-A5 (hex) Naman NZ LTd +00-0C-A6 (hex) Mintera Corporation +00-0C-A7 (hex) Metro (Suzhou) Technologies Co., Ltd. +00-0C-A8 (hex) Garuda Networks Corporation +00-0C-A9 (hex) Ebtron Inc. +00-0C-AA (hex) Cubic Transportation Systems Inc +00-0C-AB (hex) COMMEND International +00-0C-AC (hex) Citizen Watch Co., Ltd. +00-0C-AD (hex) BTU International +00-0C-AE (hex) Ailocom Oy +00-0C-AF (hex) TRI TERM CO.,LTD. +00-0C-B0 (hex) Star Semiconductor Corporation +00-0C-B1 (hex) Salland Engineering (Europe) BV +00-0C-B2 (hex) Comstar Co., Ltd. +00-0C-B3 (hex) ROUND Co.,Ltd. +00-0C-B4 (hex) AutoCell Laboratories, Inc. +00-0C-B5 (hex) Premier Technolgies, Inc +00-0C-B6 (hex) NANJING SEU MOBILE & INTERNET TECHNOLOGY CO.,LTD +00-0C-B7 (hex) Nanjing Huazhuo Electronics Co., Ltd. +00-0C-B8 (hex) MEDION AG +00-0C-B9 (hex) LEA +00-0C-BA (hex) Jamex, Inc. +00-0C-BB (hex) ISKRAEMECO +00-0C-BC (hex) Iscutum +00-0C-BD (hex) Interface Masters, Inc +00-0C-BE (hex) Innominate Security Technologies AG +00-0C-BF (hex) Holy Stone Ent. Co., Ltd. +00-0C-C0 (hex) Genera Oy +00-0C-C1 (hex) Cooper Industries Inc. +00-0C-C2 (hex) ControlNet (India) Private Limited +00-0C-C3 (hex) BeWAN systems +00-0C-C4 (hex) Tiptel AG +00-0C-C5 (hex) Nextlink Co., Ltd. +00-0C-C6 (hex) Ka-Ro electronics GmbH +00-0C-C7 (hex) Intelligent Computer Solutions Inc. +00-0C-C8 (hex) Xytronix Research & Design, Inc. +00-0C-C9 (hex) ILWOO DATA & TECHNOLOGY CO.,LTD +00-0C-CA (hex) Hitachi Global Storage Technologies +00-0C-CB (hex) Design Combus Ltd +00-0C-CC (hex) Aeroscout Ltd. +00-0C-CD (hex) IEC - TC57 +00-0C-CE (hex) Cisco Systems +00-0C-CF (hex) Cisco Systems +00-0C-D0 (hex) Symetrix +00-0C-D1 (hex) SFOM Technology Corp. +00-0C-D2 (hex) Schaffner EMV AG +00-0C-D3 (hex) Prettl Elektronik Radeberg GmbH +00-0C-D4 (hex) Positron Public Safety Systems inc. +00-0C-D5 (hex) Passave Inc. +00-0C-D6 (hex) PARTNER TECH +00-0C-D7 (hex) Nallatech Ltd +00-0C-D8 (hex) M. K. Juchheim GmbH & Co +00-0C-D9 (hex) Itcare Co., Ltd +00-0C-DA (hex) FreeHand Systems, Inc. +00-0C-DB (hex) Brocade Communications Systems, Inc +00-0C-DC (hex) BECS Technology, Inc +00-0C-DD (hex) AOS Technologies AG +00-0C-DE (hex) ABB STOTZ-KONTAKT GmbH +00-0C-DF (hex) PULNiX America, Inc +00-0C-E0 (hex) Trek Diagnostics Inc. +00-0C-E1 (hex) The Open Group +00-0C-E2 (hex) Rolls-Royce +00-0C-E3 (hex) Option International N.V. +00-0C-E4 (hex) NeuroCom International, Inc. +00-0C-E5 (hex) Motorola BCS +00-0C-E6 (hex) Meru Networks Inc +00-0C-E7 (hex) MediaTek Inc. +00-0C-E8 (hex) GuangZhou AnJuBao Co., Ltd +00-0C-E9 (hex) BLOOMBERG L.P. +00-0C-EA (hex) aphona Kommunikationssysteme +00-0C-EB (hex) CNMP Networks, Inc. +00-0C-EC (hex) Spectracom Corp. +00-0C-ED (hex) Real Digital Media +00-0C-EE (hex) jp-embedded +00-0C-EF (hex) Open Networks Engineering Ltd +00-0C-F0 (hex) M & N GmbH +00-0C-F1 (hex) Intel Corporation +00-0C-F2 (hex) GAMESA EÓLICA +00-0C-F3 (hex) CALL IMAGE SA +00-0C-F4 (hex) AKATSUKI ELECTRIC MFG.CO.,LTD. +00-0C-F5 (hex) InfoExpress +00-0C-F6 (hex) Sitecom Europe BV +00-0C-F7 (hex) Nortel Networks +00-0C-F8 (hex) Nortel Networks +00-0C-F9 (hex) ITT Flygt AB +00-0C-FA (hex) Digital Systems Corp +00-0C-FB (hex) Korea Network Systems +00-0C-FC (hex) S2io Technologies Corp +00-0C-FD (hex) Hyundai ImageQuest Co.,Ltd. +00-0C-FE (hex) Grand Electronic Co., Ltd +00-0C-FF (hex) MRO-TEK LIMITED +00-0D-00 (hex) Seaway Networks Inc. +00-0D-01 (hex) P&E Microcomputer Systems, Inc. +00-0D-02 (hex) NEC AccessTechnica,Ltd +00-0D-03 (hex) Matrics, Inc. +00-0D-04 (hex) Foxboro Eckardt Development GmbH +00-0D-05 (hex) cybernet manufacturing inc. +00-0D-06 (hex) Compulogic Limited +00-0D-07 (hex) Calrec Audio Ltd +00-0D-08 (hex) AboveCable, Inc. +00-0D-09 (hex) Yuehua(Zhuhai) Electronic CO. LTD +00-0D-0A (hex) Projectiondesign as +00-0D-0B (hex) Buffalo Inc. +00-0D-0C (hex) MDI Security Systems +00-0D-0D (hex) ITSupported, LLC +00-0D-0E (hex) Inqnet Systems, Inc. +00-0D-0F (hex) Finlux Ltd +00-0D-10 (hex) Embedtronics Oy +00-0D-11 (hex) DENTSPLY - Gendex +00-0D-12 (hex) AXELL Corporation +00-0D-13 (hex) Wilhelm Rutenbeck GmbH&Co. +00-0D-14 (hex) Vtech Innovation LP dba Advanced American Telephones +00-0D-15 (hex) Voipac s.r.o. +00-0D-16 (hex) UHS Systems Pty Ltd +00-0D-17 (hex) Turbo Networks Co.Ltd +00-0D-18 (hex) Mega-Trend Electronics CO., LTD. +00-0D-19 (hex) ROBE Show lighting +00-0D-1A (hex) Mustek System Inc. +00-0D-1B (hex) Kyoto Electronics Manufacturing Co., Ltd. +00-0D-1C (hex) Amesys Defense +00-0D-1D (hex) HIGH-TEK HARNESS ENT. CO., LTD. +00-0D-1E (hex) Control Techniques +00-0D-1F (hex) AV Digital +00-0D-20 (hex) ASAHIKASEI TECHNOSYSTEM CO.,LTD. +00-0D-21 (hex) WISCORE Inc. +00-0D-22 (hex) Unitronics LTD +00-0D-23 (hex) Smart Solution, Inc +00-0D-24 (hex) SENTEC E&E CO., LTD. +00-0D-25 (hex) SANDEN CORPORATION +00-0D-26 (hex) Primagraphics Limited +00-0D-27 (hex) MICROPLEX Printware AG +00-0D-28 (hex) Cisco +00-0D-29 (hex) Cisco +00-0D-2A (hex) Scanmatic AS +00-0D-2B (hex) Racal Instruments +00-0D-2C (hex) Patapsco Designs Ltd +00-0D-2D (hex) NCT Deutschland GmbH +00-0D-2E (hex) Matsushita Avionics Systems Corporation +00-0D-2F (hex) AIN Comm.Tech.Co., LTD +00-0D-30 (hex) IceFyre Semiconductor +00-0D-31 (hex) Compellent Technologies, Inc. +00-0D-32 (hex) DispenseSource, Inc. +00-0D-33 (hex) Prediwave Corp. +00-0D-34 (hex) Shell International Exploration and Production, Inc. +00-0D-35 (hex) PAC International Ltd +00-0D-36 (hex) Wu Han Routon Electronic Co., Ltd +00-0D-37 (hex) WIPLUG +00-0D-38 (hex) NISSIN INC. +00-0D-39 (hex) Network Electronics +00-0D-3A (hex) Microsoft Corp. +00-0D-3B (hex) Microelectronics Technology Inc. +00-0D-3C (hex) i.Tech Dynamic Ltd +00-0D-3D (hex) Hammerhead Systems, Inc. +00-0D-3E (hex) APLUX Communications Ltd. +00-0D-3F (hex) VTI Instruments Corporation +00-0D-40 (hex) Verint Loronix Video Solutions +00-0D-41 (hex) Siemens AG ICM MP UC RD IT KLF1 +00-0D-42 (hex) Newbest Development Limited +00-0D-43 (hex) DRS Tactical Systems Inc. +00-0D-44 (hex) Audio BU - Logitech +00-0D-45 (hex) Tottori SANYO Electric Co., Ltd. +00-0D-46 (hex) Parker SSD Drives +00-0D-47 (hex) Collex +00-0D-48 (hex) AEWIN Technologies Co., Ltd. +00-0D-49 (hex) Triton Systems of Delaware, Inc. +00-0D-4A (hex) Steag ETA-Optik +00-0D-4B (hex) Roku, LLC +00-0D-4C (hex) Outline Electronics Ltd. +00-0D-4D (hex) Ninelanes +00-0D-4E (hex) NDR Co.,LTD. +00-0D-4F (hex) Kenwood Corporation +00-0D-50 (hex) Galazar Networks +00-0D-51 (hex) DIVR Systems, Inc. +00-0D-52 (hex) Comart system +00-0D-53 (hex) Beijing 5w Communication Corp. +00-0D-54 (hex) 3Com Ltd +00-0D-55 (hex) SANYCOM Technology Co.,Ltd +00-0D-56 (hex) Dell PCBA Test +00-0D-57 (hex) Fujitsu I-Network Systems Limited. +00-0D-58 (hex) PRIVATE +00-0D-59 (hex) Amity Systems, Inc. +00-0D-5A (hex) Tiesse SpA +00-0D-5B (hex) Smart Empire Investments Limited +00-0D-5C (hex) Robert Bosch GmbH, VT-ATMO +00-0D-5D (hex) Raritan Computer, Inc +00-0D-5E (hex) NEC Personal Products +00-0D-5F (hex) Minds Inc +00-0D-60 (hex) IBM Corporation +00-0D-61 (hex) Giga-Byte Technology Co., Ltd. +00-0D-62 (hex) Funkwerk Dabendorf GmbH +00-0D-63 (hex) DENT Instruments, Inc. +00-0D-64 (hex) COMAG Handels AG +00-0D-65 (hex) Cisco Systems +00-0D-66 (hex) Cisco Systems +00-0D-67 (hex) BelAir Networks Inc. +00-0D-68 (hex) Vinci Systems, Inc. +00-0D-69 (hex) TMT&D Corporation +00-0D-6A (hex) Redwood Technologies LTD +00-0D-6B (hex) Mita-Teknik A/S +00-0D-6C (hex) M-Audio +00-0D-6D (hex) K-Tech Devices Corp. +00-0D-6E (hex) K-Patents Oy +00-0D-6F (hex) Ember Corporation +00-0D-70 (hex) Datamax Corporation +00-0D-71 (hex) boca systems +00-0D-72 (hex) 2Wire, Inc +00-0D-73 (hex) Technical Support, Inc. +00-0D-74 (hex) Sand Network Systems, Inc. +00-0D-75 (hex) Kobian Pte Ltd - Taiwan Branch +00-0D-76 (hex) Hokuto Denshi Co,. Ltd. +00-0D-77 (hex) FalconStor Software +00-0D-78 (hex) Engineering & Security +00-0D-79 (hex) Dynamic Solutions Co,.Ltd. +00-0D-7A (hex) DiGATTO Asia Pacific Pte Ltd +00-0D-7B (hex) Consensys Computers Inc. +00-0D-7C (hex) Codian Ltd +00-0D-7D (hex) Afco Systems +00-0D-7E (hex) Axiowave Networks, Inc. +00-0D-7F (hex) MIDAS COMMUNICATION TECHNOLOGIES PTE LTD ( Foreign Branch) +00-0D-80 (hex) Online Development Inc +00-0D-81 (hex) Pepperl+Fuchs GmbH +00-0D-82 (hex) PHS srl +00-0D-83 (hex) Sanmina-SCI Hungary Ltd. +00-0D-84 (hex) Makus Inc. +00-0D-85 (hex) Tapwave, Inc. +00-0D-86 (hex) Huber + Suhner AG +00-0D-87 (hex) Elitegroup Computer System Co. (ECS) +00-0D-88 (hex) D-Link Corporation +00-0D-89 (hex) Bils Technology Inc +00-0D-8A (hex) Winners Electronics Co., Ltd. +00-0D-8B (hex) T&D Corporation +00-0D-8C (hex) Shanghai Wedone Digital Ltd. CO. +00-0D-8D (hex) ProLinx Communication Gateways, Inc. +00-0D-8E (hex) Koden Electronics Co., Ltd. +00-0D-8F (hex) King Tsushin Kogyo Co., LTD. +00-0D-90 (hex) Factum Electronics AB +00-0D-91 (hex) Eclipse (HQ Espana) S.L. +00-0D-92 (hex) Arima Communication Corporation +00-0D-93 (hex) Apple Computer +00-0D-94 (hex) AFAR Communications,Inc +00-0D-95 (hex) Opti-cell, Inc. +00-0D-96 (hex) Vtera Technology Inc. +00-0D-97 (hex) Tropos Networks, Inc. +00-0D-98 (hex) S.W.A.C. Schmitt-Walter Automation Consult GmbH +00-0D-99 (hex) Orbital Sciences Corp.; Launch Systems Group +00-0D-9A (hex) INFOTEC LTD +00-0D-9B (hex) Heraeus Electro-Nite International N.V. +00-0D-9C (hex) Elan GmbH & Co KG +00-0D-9D (hex) Hewlett Packard +00-0D-9E (hex) TOKUDEN OHIZUMI SEISAKUSYO Co.,Ltd. +00-0D-9F (hex) RF Micro Devices +00-0D-A0 (hex) NEDAP N.V. +00-0D-A1 (hex) MIRAE ITS Co.,LTD. +00-0D-A2 (hex) Infrant Technologies, Inc. +00-0D-A3 (hex) Emerging Technologies Limited +00-0D-A4 (hex) DOSCH & AMAND SYSTEMS AG +00-0D-A5 (hex) Fabric7 Systems, Inc +00-0D-A6 (hex) Universal Switching Corporation +00-0D-A7 (hex) PRIVATE +00-0D-A8 (hex) Teletronics Technology Corporation +00-0D-A9 (hex) T.E.A.M. S.L. +00-0D-AA (hex) S.A.Tehnology co.,Ltd. +00-0D-AB (hex) Parker Hannifin GmbH Electromechanical Division Europe +00-0D-AC (hex) Japan CBM Corporation +00-0D-AD (hex) Dataprobe Inc +00-0D-AE (hex) SAMSUNG HEAVY INDUSTRIES CO., LTD. +00-0D-AF (hex) Plexus Corp (UK) Ltd +00-0D-B0 (hex) Olym-tech Co.,Ltd. +00-0D-B1 (hex) Japan Network Service Co., Ltd. +00-0D-B2 (hex) Ammasso, Inc. +00-0D-B3 (hex) SDO Communication Corperation +00-0D-B4 (hex) NETASQ +00-0D-B5 (hex) GLOBALSAT TECHNOLOGY CORPORATION +00-0D-B6 (hex) Teknovus, Inc. +00-0D-B7 (hex) SANKO ELECTRIC CO,.LTD +00-0D-B8 (hex) SCHILLER AG +00-0D-B9 (hex) PC Engines GmbH +00-0D-BA (hex) Océ Document Technologies GmbH +00-0D-BB (hex) Nippon Dentsu Co.,Ltd. +00-0D-BC (hex) Cisco Systems +00-0D-BD (hex) Cisco Systems +00-0D-BE (hex) Bel Fuse Europe Ltd.,UK +00-0D-BF (hex) TekTone Sound & Signal Mfg., Inc. +00-0D-C0 (hex) Spagat AS +00-0D-C1 (hex) SafeWeb Inc +00-0D-C2 (hex) PRIVATE +00-0D-C3 (hex) First Communication, Inc. +00-0D-C4 (hex) Emcore Corporation +00-0D-C5 (hex) EchoStar International Corporation +00-0D-C6 (hex) DigiRose Technology Co., Ltd. +00-0D-C7 (hex) COSMIC ENGINEERING INC. +00-0D-C8 (hex) AirMagnet, Inc +00-0D-C9 (hex) THALES Elektronik Systeme GmbH +00-0D-CA (hex) Tait Electronics +00-0D-CB (hex) Petcomkorea Co., Ltd. +00-0D-CC (hex) NEOSMART Corp. +00-0D-CD (hex) GROUPE TXCOM +00-0D-CE (hex) Dynavac Technology Pte Ltd +00-0D-CF (hex) Cidra Corp. +00-0D-D0 (hex) TetraTec Instruments GmbH +00-0D-D1 (hex) Stryker Corporation +00-0D-D2 (hex) Simrad Optronics ASA +00-0D-D3 (hex) SAMWOO Telecommunication Co.,Ltd. +00-0D-D4 (hex) Symantec Corporation +00-0D-D5 (hex) O'RITE TECHNOLOGY CO.,LTD +00-0D-D6 (hex) ITI LTD +00-0D-D7 (hex) Bright +00-0D-D8 (hex) BBN +00-0D-D9 (hex) Anton Paar GmbH +00-0D-DA (hex) ALLIED TELESIS K.K. +00-0D-DB (hex) AIRWAVE TECHNOLOGIES INC. +00-0D-DC (hex) VAC +00-0D-DD (hex) PROFÝLO TELRA ELEKTRONÝK SANAYÝ VE TÝCARET A.Þ. +00-0D-DE (hex) Joyteck Co., Ltd. +00-0D-DF (hex) Japan Image & Network Inc. +00-0D-E0 (hex) ICPDAS Co.,LTD +00-0D-E1 (hex) Control Products, Inc. +00-0D-E2 (hex) CMZ Sistemi Elettronici +00-0D-E3 (hex) AT Sweden AB +00-0D-E4 (hex) DIGINICS, Inc. +00-0D-E5 (hex) Samsung Thales +00-0D-E6 (hex) YOUNGBO ENGINEERING CO.,LTD +00-0D-E7 (hex) Snap-on OEM Group +00-0D-E8 (hex) Nasaco Electronics Pte. Ltd +00-0D-E9 (hex) Napatech Aps +00-0D-EA (hex) Kingtel Telecommunication Corp. +00-0D-EB (hex) CompXs Limited +00-0D-EC (hex) Cisco Systems +00-0D-ED (hex) Cisco Systems +00-0D-EE (hex) Andrew RF Power Amplifier Group +00-0D-EF (hex) Soc. Coop. Bilanciai +00-0D-F0 (hex) QCOM TECHNOLOGY INC. +00-0D-F1 (hex) IONIX INC. +00-0D-F2 (hex) PRIVATE +00-0D-F3 (hex) Asmax Solutions +00-0D-F4 (hex) Watertek Co. +00-0D-F5 (hex) Teletronics International Inc. +00-0D-F6 (hex) Technology Thesaurus Corp. +00-0D-F7 (hex) Space Dynamics Lab +00-0D-F8 (hex) ORGA Kartensysteme GmbH +00-0D-F9 (hex) NDS Limited +00-0D-FA (hex) Micro Control Systems Ltd. +00-0D-FB (hex) Komax AG +00-0D-FC (hex) ITFOR Inc. +00-0D-FD (hex) Huges Hi-Tech Inc., +00-0D-FE (hex) Hauppauge Computer Works, Inc. +00-0D-FF (hex) CHENMING MOLD INDUSTRY CORP. +00-0E-00 (hex) Atrie +00-0E-01 (hex) ASIP Technologies Inc. +00-0E-02 (hex) Advantech AMT Inc. +00-0E-03 (hex) Emulex +00-0E-04 (hex) CMA/Microdialysis AB +00-0E-05 (hex) WIRELESS MATRIX CORP. +00-0E-06 (hex) Team Simoco Ltd +00-0E-07 (hex) Sony Ericsson Mobile Communications AB +00-0E-08 (hex) Cisco Linksys LLC +00-0E-09 (hex) Shenzhen Coship Software Co.,LTD. +00-0E-0A (hex) SAKUMA DESIGN OFFICE +00-0E-0B (hex) Netac Technology Co., Ltd. +00-0E-0C (hex) Intel Corporation +00-0E-0D (hex) HESCH Schröder GmbH +00-0E-0E (hex) ESA elettronica S.P.A. +00-0E-0F (hex) ERMME +00-0E-10 (hex) C-guys, Inc. +00-0E-11 (hex) BDT Büro- und Datentechnik GmbH & Co. KG +00-0E-12 (hex) Adaptive Micro Systems Inc. +00-0E-13 (hex) Accu-Sort Systems inc. +00-0E-14 (hex) Visionary Solutions, Inc. +00-0E-15 (hex) Tadlys LTD +00-0E-16 (hex) SouthWing S.L. +00-0E-17 (hex) PRIVATE +00-0E-18 (hex) MyA Technology +00-0E-19 (hex) LogicaCMG Pty Ltd +00-0E-1A (hex) JPS Communications +00-0E-1B (hex) IAV GmbH +00-0E-1C (hex) Hach Company +00-0E-1D (hex) ARION Technology Inc. +00-0E-1E (hex) NetXen, Inc. +00-0E-1F (hex) TCL Networks Equipment Co., Ltd. +00-0E-20 (hex) ACCESS Systems Americas, Inc. +00-0E-21 (hex) MTU Friedrichshafen GmbH +00-0E-22 (hex) PRIVATE +00-0E-23 (hex) Incipient, Inc. +00-0E-24 (hex) Huwell Technology Inc. +00-0E-25 (hex) Hannae Technology Co., Ltd +00-0E-26 (hex) Gincom Technology Corp. +00-0E-27 (hex) Crere Networks, Inc. +00-0E-28 (hex) Dynamic Ratings P/L +00-0E-29 (hex) Shester Communications Inc +00-0E-2A (hex) PRIVATE +00-0E-2B (hex) Safari Technologies +00-0E-2C (hex) Netcodec co. +00-0E-2D (hex) Hyundai Digital Technology Co.,Ltd. +00-0E-2E (hex) Edimax Technology Co., Ltd. +00-0E-2F (hex) Disetronic Medical Systems AG +00-0E-30 (hex) AERAS Networks, Inc. +00-0E-31 (hex) Olympus Soft Imaging Solutions GmbH +00-0E-32 (hex) Kontron Medical +00-0E-33 (hex) Shuko Electronics Co.,Ltd +00-0E-34 (hex) NexGen City, LP +00-0E-35 (hex) Intel Corp +00-0E-36 (hex) HEINESYS, Inc. +00-0E-37 (hex) Harms & Wende GmbH & Co.KG +00-0E-38 (hex) Cisco Systems +00-0E-39 (hex) Cisco Systems +00-0E-3A (hex) Cirrus Logic +00-0E-3B (hex) Hawking Technologies, Inc. +00-0E-3C (hex) Transact Technologies Inc +00-0E-3D (hex) Televic N.V. +00-0E-3E (hex) Sun Optronics Inc +00-0E-3F (hex) Soronti, Inc. +00-0E-40 (hex) Nortel Networks +00-0E-41 (hex) NIHON MECHATRONICS CO.,LTD. +00-0E-42 (hex) Motic Incoporation Ltd. +00-0E-43 (hex) G-Tek Electronics Sdn. Bhd. +00-0E-44 (hex) Digital 5, Inc. +00-0E-45 (hex) Beijing Newtry Electronic Technology Ltd +00-0E-46 (hex) Niigata Seimitsu Co.,Ltd. +00-0E-47 (hex) NCI System Co.,Ltd. +00-0E-48 (hex) Lipman TransAction Solutions +00-0E-49 (hex) Forsway Scandinavia AB +00-0E-4A (hex) Changchun Huayu WEBPAD Co.,LTD +00-0E-4B (hex) atrium c and i +00-0E-4C (hex) Bermai Inc. +00-0E-4D (hex) Numesa Inc. +00-0E-4E (hex) Waveplus Technology Co., Ltd. +00-0E-4F (hex) Trajet GmbH +00-0E-50 (hex) Thomson Telecom Belgium +00-0E-51 (hex) tecna elettronica srl +00-0E-52 (hex) Optium Corporation +00-0E-53 (hex) AV TECH CORPORATION +00-0E-54 (hex) AlphaCell Wireless Ltd. +00-0E-55 (hex) AUVITRAN +00-0E-56 (hex) 4G Systems GmbH & Co. KG +00-0E-57 (hex) Iworld Networking, Inc. +00-0E-58 (hex) Sonos, Inc. +00-0E-59 (hex) SAGEM SA +00-0E-5A (hex) TELEFIELD inc. +00-0E-5B (hex) ParkerVision - Direct2Data +00-0E-5C (hex) Motorola BCS +00-0E-5D (hex) Triple Play Technologies A/S +00-0E-5E (hex) Raisecom Technology +00-0E-5F (hex) activ-net GmbH & Co. KG +00-0E-60 (hex) 360SUN Digital Broadband Corporation +00-0E-61 (hex) MICROTROL LIMITED +00-0E-62 (hex) Nortel Networks +00-0E-63 (hex) Lemke Diagnostics GmbH +00-0E-64 (hex) Elphel, Inc +00-0E-65 (hex) TransCore +00-0E-66 (hex) Hitachi Advanced Digital, Inc. +00-0E-67 (hex) Eltis Microelectronics Ltd. +00-0E-68 (hex) E-TOP Network Technology Inc. +00-0E-69 (hex) China Electric Power Research Institute +00-0E-6A (hex) 3Com Ltd +00-0E-6B (hex) Janitza electronics GmbH +00-0E-6C (hex) Device Drivers Limited +00-0E-6D (hex) Murata Manufacturing Co., Ltd. +00-0E-6E (hex) MICRELEC ELECTRONICS S.A +00-0E-6F (hex) IRIS Corporation Berhad +00-0E-70 (hex) in2 Networks +00-0E-71 (hex) Gemstar Technology Development Ltd. +00-0E-72 (hex) CTS electronics +00-0E-73 (hex) Tpack A/S +00-0E-74 (hex) Solar Telecom. Tech +00-0E-75 (hex) New York Air Brake Corp. +00-0E-76 (hex) GEMSOC INNOVISION INC. +00-0E-77 (hex) Decru, Inc. +00-0E-78 (hex) Amtelco +00-0E-79 (hex) Ample Communications Inc. +00-0E-7A (hex) GemWon Communications Co., Ltd. +00-0E-7B (hex) Toshiba +00-0E-7C (hex) Televes S.A. +00-0E-7D (hex) Electronics Line 3000 Ltd. +00-0E-7E (hex) ionSign Oy +00-0E-7F (hex) Hewlett Packard +00-0E-80 (hex) Thomson Technology Inc +00-0E-81 (hex) Devicescape Software, Inc. +00-0E-82 (hex) Commtech Wireless +00-0E-83 (hex) Cisco Systems +00-0E-84 (hex) Cisco Systems +00-0E-85 (hex) Catalyst Enterprises, Inc. +00-0E-86 (hex) Alcatel North America +00-0E-87 (hex) adp Gauselmann GmbH +00-0E-88 (hex) VIDEOTRON CORP. +00-0E-89 (hex) CLEMATIC +00-0E-8A (hex) Avara Technologies Pty. Ltd. +00-0E-8B (hex) Astarte Technology Co, Ltd. +00-0E-8C (hex) Siemens AG A&D ET +00-0E-8D (hex) Systems in Progress Holding GmbH +00-0E-8E (hex) SparkLAN Communications, Inc. +00-0E-8F (hex) Sercomm Corp. +00-0E-90 (hex) PONICO CORP. +00-0E-91 (hex) Navico Auckland Ltd +00-0E-92 (hex) Millinet Co., Ltd. +00-0E-93 (hex) Milénio 3 Sistemas Electrónicos, Lda. +00-0E-94 (hex) Maas International BV +00-0E-95 (hex) Fujiya Denki Seisakusho Co.,Ltd. +00-0E-96 (hex) Cubic Defense Applications, Inc. +00-0E-97 (hex) Ultracker Technology CO., Inc +00-0E-98 (hex) Vitec CC, INC. +00-0E-99 (hex) Spectrum Digital, Inc +00-0E-9A (hex) BOE TECHNOLOGY GROUP CO.,LTD +00-0E-9B (hex) Ambit Microsystems Corporation +00-0E-9C (hex) Pemstar +00-0E-9D (hex) Tiscali UK Ltd +00-0E-9E (hex) Topfield Co., Ltd +00-0E-9F (hex) TEMIC SDS GmbH +00-0E-A0 (hex) NetKlass Technology Inc. +00-0E-A1 (hex) Formosa Teletek Corporation +00-0E-A2 (hex) McAfee, Inc +00-0E-A3 (hex) CNCR-IT CO.,LTD,HangZhou P.R.CHINA +00-0E-A4 (hex) Certance Inc. +00-0E-A5 (hex) BLIP Systems +00-0E-A6 (hex) ASUSTEK COMPUTER INC. +00-0E-A7 (hex) Endace Technology +00-0E-A8 (hex) United Technologists Europe Limited +00-0E-A9 (hex) Shanghai Xun Shi Communications Equipment Ltd. Co. +00-0E-AA (hex) Scalent Systems, Inc. +00-0E-AB (hex) Cray Inc +00-0E-AC (hex) MINTRON ENTERPRISE CO., LTD. +00-0E-AD (hex) Metanoia Technologies, Inc. +00-0E-AE (hex) GAWELL TECHNOLOGIES CORP. +00-0E-AF (hex) CASTEL +00-0E-B0 (hex) Solutions Radio BV +00-0E-B1 (hex) Newcotech,Ltd +00-0E-B2 (hex) Micro-Research Finland Oy +00-0E-B3 (hex) Hewlett-Packard +00-0E-B4 (hex) GUANGZHOU GAOKE COMMUNICATIONS TECHNOLOGY CO.LTD. +00-0E-B5 (hex) Ecastle Electronics Co., Ltd. +00-0E-B6 (hex) Riverbed Technology, Inc. +00-0E-B7 (hex) Knovative, Inc. +00-0E-B8 (hex) Iiga co.,Ltd +00-0E-B9 (hex) HASHIMOTO Electronics Industry Co.,Ltd. +00-0E-BA (hex) HANMI SEMICONDUCTOR CO., LTD. +00-0E-BB (hex) Everbee Networks +00-0E-BC (hex) Paragon Fidelity GmbH +00-0E-BD (hex) Burdick, a Quinton Compny +00-0E-BE (hex) B&B Electronics Manufacturing Co. +00-0E-BF (hex) Remsdaq Limited +00-0E-C0 (hex) Nortel Networks +00-0E-C1 (hex) MYNAH Technologies +00-0E-C2 (hex) Lowrance Electronics, Inc. +00-0E-C3 (hex) Logic Controls, Inc. +00-0E-C4 (hex) Iskra Transmission d.d. +00-0E-C5 (hex) Digital Multitools Inc +00-0E-C6 (hex) ASIX ELECTRONICS CORP. +00-0E-C7 (hex) Motorola Korea +00-0E-C8 (hex) Zoran Corporation +00-0E-C9 (hex) YOKO Technology Corp. +00-0E-CA (hex) WTSS Inc +00-0E-CB (hex) VineSys Technology +00-0E-CC (hex) Tableau, LLC +00-0E-CD (hex) SKOV A/S +00-0E-CE (hex) S.I.T.T.I. S.p.A. +00-0E-CF (hex) PROFIBUS Nutzerorganisation e.V. +00-0E-D0 (hex) Privaris, Inc. +00-0E-D1 (hex) Osaka Micro Computer. +00-0E-D2 (hex) Filtronic plc +00-0E-D3 (hex) Epicenter, Inc. +00-0E-D4 (hex) CRESITT INDUSTRIE +00-0E-D5 (hex) COPAN Systems Inc. +00-0E-D6 (hex) Cisco Systems +00-0E-D7 (hex) Cisco Systems +00-0E-D8 (hex) Aktino, Inc. +00-0E-D9 (hex) Aksys, Ltd. +00-0E-DA (hex) C-TECH UNITED CORP. +00-0E-DB (hex) XiNCOM Corp. +00-0E-DC (hex) Tellion INC. +00-0E-DD (hex) SHURE INCORPORATED +00-0E-DE (hex) REMEC, Inc. +00-0E-DF (hex) PLX Technology +00-0E-E0 (hex) Mcharge +00-0E-E1 (hex) ExtremeSpeed Inc. +00-0E-E2 (hex) Custom Engineering S.p.A. +00-0E-E3 (hex) Chiyu Technology Co.,Ltd +00-0E-E4 (hex) BOE TECHNOLOGY GROUP CO.,LTD +00-0E-E5 (hex) bitWallet, Inc. +00-0E-E6 (hex) Adimos Systems LTD +00-0E-E7 (hex) AAC ELECTRONICS CORP. +00-0E-E8 (hex) zioncom +00-0E-E9 (hex) WayTech Development, Inc. +00-0E-EA (hex) Shadong Luneng Jicheng Electronics,Co.,Ltd +00-0E-EB (hex) Sandmartin(zhong shan)Electronics Co.,Ltd +00-0E-EC (hex) Orban +00-0E-ED (hex) Nokia Danmark A/S +00-0E-EE (hex) Muco Industrie BV +00-0E-EF (hex) PRIVATE +00-0E-F0 (hex) Festo AG & Co. KG +00-0E-F1 (hex) EZQUEST INC. +00-0E-F2 (hex) Infinico Corporation +00-0E-F3 (hex) Smarthome +00-0E-F4 (hex) Kasda Digital Technology Co.,Ltd +00-0E-F5 (hex) iPAC Technology Co., Ltd. +00-0E-F6 (hex) E-TEN Information Systems Co., Ltd. +00-0E-F7 (hex) Vulcan Portals Inc +00-0E-F8 (hex) SBC ASI +00-0E-F9 (hex) REA Elektronik GmbH +00-0E-FA (hex) Optoway Technology Incorporation +00-0E-FB (hex) Macey Enterprises +00-0E-FC (hex) JTAG Technologies B.V. +00-0E-FD (hex) FUJINON CORPORATION +00-0E-FE (hex) EndRun Technologies LLC +00-0E-FF (hex) Megasolution,Inc. +00-0F-00 (hex) Legra Systems, Inc. +00-0F-01 (hex) DIGITALKS INC +00-0F-02 (hex) Digicube Technology Co., Ltd +00-0F-03 (hex) COM&C CO., LTD +00-0F-04 (hex) cim-usa inc +00-0F-05 (hex) 3B SYSTEM INC. +00-0F-06 (hex) Nortel Networks +00-0F-07 (hex) Mangrove Systems, Inc. +00-0F-08 (hex) Indagon Oy +00-0F-09 (hex) PRIVATE +00-0F-0A (hex) Clear Edge Networks +00-0F-0B (hex) Kentima Technologies AB +00-0F-0C (hex) SYNCHRONIC ENGINEERING +00-0F-0D (hex) Hunt Electronic Co., Ltd. +00-0F-0E (hex) WaveSplitter Technologies, Inc. +00-0F-0F (hex) Real ID Technology Co., Ltd. +00-0F-10 (hex) RDM Corporation +00-0F-11 (hex) Prodrive B.V. +00-0F-12 (hex) Panasonic Europe Ltd. +00-0F-13 (hex) Nisca corporation +00-0F-14 (hex) Mindray Co., Ltd. +00-0F-15 (hex) Kjaerulff1 A/S +00-0F-16 (hex) JAY HOW TECHNOLOGY CO., +00-0F-17 (hex) Insta Elektro GmbH +00-0F-18 (hex) Industrial Control Systems +00-0F-19 (hex) Boston Scientific +00-0F-1A (hex) Gaming Support B.V. +00-0F-1B (hex) Ego Systems Inc. +00-0F-1C (hex) DigitAll World Co., Ltd +00-0F-1D (hex) Cosmo Techs Co., Ltd. +00-0F-1E (hex) Chengdu KT Electric Co.of High & New Technology +00-0F-1F (hex) WW PCBA Test +00-0F-20 (hex) Hewlett Packard +00-0F-21 (hex) Scientific Atlanta, Inc +00-0F-22 (hex) Helius, Inc. +00-0F-23 (hex) Cisco Systems +00-0F-24 (hex) Cisco Systems +00-0F-25 (hex) AimValley B.V. +00-0F-26 (hex) WorldAccxx LLC +00-0F-27 (hex) TEAL Electronics, Inc. +00-0F-28 (hex) Itronix Corporation +00-0F-29 (hex) Augmentix Corporation +00-0F-2A (hex) Cableware Electronics +00-0F-2B (hex) GREENBELL SYSTEMS +00-0F-2C (hex) Uplogix, Inc. +00-0F-2D (hex) CHUNG-HSIN ELECTRIC & MACHINERY MFG.CORP. +00-0F-2E (hex) Megapower International Corp. +00-0F-2F (hex) W-LINX TECHNOLOGY CO., LTD. +00-0F-30 (hex) Raza Microelectronics Inc +00-0F-31 (hex) Allied Vision Technologies Canada Inc +00-0F-32 (hex) LuTong Electronic Technology Co.,Ltd +00-0F-33 (hex) DUALi Inc. +00-0F-34 (hex) Cisco Systems +00-0F-35 (hex) Cisco Systems +00-0F-36 (hex) Accurate Techhnologies, Inc. +00-0F-37 (hex) Xambala Incorporated +00-0F-38 (hex) Netstar +00-0F-39 (hex) IRIS SENSORS +00-0F-3A (hex) HISHARP +00-0F-3B (hex) Fuji System Machines Co., Ltd. +00-0F-3C (hex) Endeleo Limited +00-0F-3D (hex) D-Link Corporation +00-0F-3E (hex) CardioNet, Inc +00-0F-3F (hex) Big Bear Networks +00-0F-40 (hex) Optical Internetworking Forum +00-0F-41 (hex) Zipher Ltd +00-0F-42 (hex) Xalyo Systems +00-0F-43 (hex) Wasabi Systems Inc. +00-0F-44 (hex) Tivella Inc. +00-0F-45 (hex) Stretch, Inc. +00-0F-46 (hex) SINAR AG +00-0F-47 (hex) ROBOX SPA +00-0F-48 (hex) Polypix Inc. +00-0F-49 (hex) Northover Solutions Limited +00-0F-4A (hex) Kyushu-kyohan co.,ltd +00-0F-4B (hex) Virtual Iron Software, Inc. +00-0F-4C (hex) Elextech INC +00-0F-4D (hex) TalkSwitch +00-0F-4E (hex) Cellink +00-0F-4F (hex) Cadmus Technology Ltd +00-0F-50 (hex) StreamScale Limited +00-0F-51 (hex) Azul Systems, Inc. +00-0F-52 (hex) YORK Refrigeration, Marine & Controls +00-0F-53 (hex) Solarflare Communications Inc +00-0F-54 (hex) Entrelogic Corporation +00-0F-55 (hex) Datawire Communication Networks Inc. +00-0F-56 (hex) Continuum Photonics Inc +00-0F-57 (hex) CABLELOGIC Co., Ltd. +00-0F-58 (hex) Adder Technology Limited +00-0F-59 (hex) Phonak Communications AG +00-0F-5A (hex) Peribit Networks +00-0F-5B (hex) Delta Information Systems, Inc. +00-0F-5C (hex) Day One Digital Media Limited +00-0F-5D (hex) 42Networks AB +00-0F-5E (hex) Veo +00-0F-5F (hex) Nicety Technologies Inc. (NTS) +00-0F-60 (hex) Lifetron Co.,Ltd +00-0F-61 (hex) Hewlett Packard +00-0F-62 (hex) Alcatel Bell Space N.V. +00-0F-63 (hex) Obzerv Technologies +00-0F-64 (hex) D&R Electronica Weesp BV +00-0F-65 (hex) icube Corp. +00-0F-66 (hex) Cisco-Linksys +00-0F-67 (hex) West Instruments +00-0F-68 (hex) Vavic Network Technology, Inc. +00-0F-69 (hex) SEW Eurodrive GmbH & Co. KG +00-0F-6A (hex) Nortel Networks +00-0F-6B (hex) GateWare Communications GmbH +00-0F-6C (hex) ADDI-DATA GmbH +00-0F-6D (hex) Midas Engineering +00-0F-6E (hex) BBox +00-0F-6F (hex) FTA Communication Technologies +00-0F-70 (hex) Wintec Industries, inc. +00-0F-71 (hex) Sanmei Electronics Co.,Ltd +00-0F-72 (hex) Sandburst +00-0F-73 (hex) Rockwell Automation Korea +00-0F-74 (hex) Qamcom Technology AB +00-0F-75 (hex) First Silicon Solutions +00-0F-76 (hex) Digital Keystone, Inc. +00-0F-77 (hex) DENTUM CO.,LTD +00-0F-78 (hex) Datacap Systems Inc +00-0F-79 (hex) Bluetooth Interest Group Inc. +00-0F-7A (hex) BeiJing NuQX Technology CO.,LTD +00-0F-7B (hex) Arce Sistemas, S.A. +00-0F-7C (hex) ACTi Corporation +00-0F-7D (hex) Xirrus +00-0F-7E (hex) Ablerex Electronics Co., LTD +00-0F-7F (hex) UBSTORAGE Co.,Ltd. +00-0F-80 (hex) Trinity Security Systems,Inc. +00-0F-81 (hex) Secure Info Imaging +00-0F-82 (hex) Mortara Instrument, Inc. +00-0F-83 (hex) Brainium Technologies Inc. +00-0F-84 (hex) Astute Networks, Inc. +00-0F-85 (hex) ADDO-Japan Corporation +00-0F-86 (hex) Research In Motion Limited +00-0F-87 (hex) Maxcess International +00-0F-88 (hex) AMETEK, Inc. +00-0F-89 (hex) Winnertec System Co., Ltd. +00-0F-8A (hex) WideView +00-0F-8B (hex) Orion MultiSystems Inc +00-0F-8C (hex) Gigawavetech Pte Ltd +00-0F-8D (hex) FAST TV-Server AG +00-0F-8E (hex) DONGYANG TELECOM CO.,LTD. +00-0F-8F (hex) Cisco Systems +00-0F-90 (hex) Cisco Systems +00-0F-91 (hex) Aerotelecom Co.,Ltd. +00-0F-92 (hex) Microhard Systems Inc. +00-0F-93 (hex) Landis+Gyr Ltd. +00-0F-94 (hex) Genexis +00-0F-95 (hex) ELECOM Co.,LTD Laneed Division +00-0F-96 (hex) Critical Telecom Corp. +00-0F-97 (hex) Avanex Corporation +00-0F-98 (hex) Avamax Co. Ltd. +00-0F-99 (hex) APAC opto Electronics Inc. +00-0F-9A (hex) Synchrony, Inc. +00-0F-9B (hex) Ross Video Limited +00-0F-9C (hex) Panduit Corp +00-0F-9D (hex) DisplayLink (UK) Ltd +00-0F-9E (hex) Murrelektronik GmbH +00-0F-9F (hex) Motorola BCS +00-0F-A0 (hex) CANON KOREA BUSINESS SOLUTIONS INC. +00-0F-A1 (hex) Gigabit Systems Inc. +00-0F-A2 (hex) Digital Path Networks +00-0F-A3 (hex) Alpha Networks Inc. +00-0F-A4 (hex) Sprecher Automation GmbH +00-0F-A5 (hex) SMP / BWA Technology GmbH +00-0F-A6 (hex) S2 Security Corporation +00-0F-A7 (hex) Raptor Networks Technology +00-0F-A8 (hex) Photometrics, Inc. +00-0F-A9 (hex) PC Fabrik +00-0F-AA (hex) Nexus Technologies +00-0F-AB (hex) Kyushu Electronics Systems Inc. +00-0F-AC (hex) IEEE 802.11 +00-0F-AD (hex) FMN communications GmbH +00-0F-AE (hex) E2O Communications +00-0F-AF (hex) Dialog Inc. +00-0F-B0 (hex) Compal Electronics,INC. +00-0F-B1 (hex) Cognio Inc. +00-0F-B2 (hex) Broadband Pacenet (India) Pvt. Ltd. +00-0F-B3 (hex) Actiontec Electronics, Inc +00-0F-B4 (hex) Timespace Technology +00-0F-B5 (hex) NETGEAR Inc +00-0F-B6 (hex) Europlex Technologies +00-0F-B7 (hex) Cavium Networks +00-0F-B8 (hex) CallURL Inc. +00-0F-B9 (hex) Adaptive Instruments +00-0F-BA (hex) Tevebox AB +00-0F-BB (hex) Nokia Siemens Networks GmbH & Co. KG +00-0F-BC (hex) Onkey Technologies, Inc. +00-0F-BD (hex) MRV Communications (Networks) LTD +00-0F-BE (hex) e-w/you Inc. +00-0F-BF (hex) DGT Sp. z o.o. +00-0F-C0 (hex) DELCOMp +00-0F-C1 (hex) WAVE Corporation +00-0F-C2 (hex) Uniwell Corporation +00-0F-C3 (hex) PalmPalm Technology, Inc. +00-0F-C4 (hex) NST co.,LTD. +00-0F-C5 (hex) KeyMed Ltd +00-0F-C6 (hex) Eurocom Industries A/S +00-0F-C7 (hex) Dionica R&D Ltd. +00-0F-C8 (hex) Chantry Networks +00-0F-C9 (hex) Allnet GmbH +00-0F-CA (hex) A-JIN TECHLINE CO, LTD +00-0F-CB (hex) 3Com Ltd +00-0F-CC (hex) Netopia, Inc. +00-0F-CD (hex) Nortel Networks +00-0F-CE (hex) Kikusui Electronics Corp. +00-0F-CF (hex) Datawind Research +00-0F-D0 (hex) ASTRI +00-0F-D1 (hex) Applied Wireless Identifications Group, Inc. +00-0F-D2 (hex) EWA Technologies, Inc. +00-0F-D3 (hex) Digium +00-0F-D4 (hex) Soundcraft +00-0F-D5 (hex) Schwechat - RISE +00-0F-D6 (hex) Sarotech Co., Ltd +00-0F-D7 (hex) Harman Music Group +00-0F-D8 (hex) Force, Inc. +00-0F-D9 (hex) FlexDSL Telecommunications AG +00-0F-DA (hex) YAZAKI CORPORATION +00-0F-DB (hex) Westell Technologies +00-0F-DC (hex) Ueda Japan Radio Co., Ltd. +00-0F-DD (hex) SORDIN AB +00-0F-DE (hex) Sony Ericsson Mobile Communications AB +00-0F-DF (hex) SOLOMON Technology Corp. +00-0F-E0 (hex) NComputing Co.,Ltd. +00-0F-E1 (hex) ID DIGITAL CORPORATION +00-0F-E2 (hex) Hangzhou H3C Technologies Co., Ltd. +00-0F-E3 (hex) Damm Cellular Systems A/S +00-0F-E4 (hex) Pantech Co.,Ltd +00-0F-E5 (hex) MERCURY SECURITY CORPORATION +00-0F-E6 (hex) MBTech Systems, Inc. +00-0F-E7 (hex) Lutron Electronics Co., Inc. +00-0F-E8 (hex) Lobos, Inc. +00-0F-E9 (hex) GW TECHNOLOGIES CO.,LTD. +00-0F-EA (hex) Giga-Byte Technology Co.,LTD. +00-0F-EB (hex) Cylon Controls +00-0F-EC (hex) Arkus Inc. +00-0F-ED (hex) Anam Electronics Co., Ltd +00-0F-EE (hex) XTec, Incorporated +00-0F-EF (hex) Thales e-Transactions GmbH +00-0F-F0 (hex) Sunray Co. Ltd. +00-0F-F1 (hex) nex-G Systems Pte.Ltd +00-0F-F2 (hex) Loud Technologies Inc. +00-0F-F3 (hex) Jung Myoung Communications&Technology +00-0F-F4 (hex) Guntermann & Drunck GmbH +00-0F-F5 (hex) GN&S company +00-0F-F6 (hex) Darfon Electronics Corp. +00-0F-F7 (hex) Cisco Systems +00-0F-F8 (hex) Cisco Systems +00-0F-F9 (hex) Valcretec, Inc. +00-0F-FA (hex) Optinel Systems, Inc. +00-0F-FB (hex) Nippon Denso Industry Co., Ltd. +00-0F-FC (hex) Merit Li-Lin Ent. +00-0F-FD (hex) Glorytek Network Inc. +00-0F-FE (hex) G-PRO COMPUTER +00-0F-FF (hex) Control4 +00-10-00 (hex) CABLE TELEVISION LABORATORIES, INC. +00-10-01 (hex) Citel +00-10-02 (hex) ACTIA +00-10-03 (hex) IMATRON, INC. +00-10-04 (hex) THE BRANTLEY COILE COMPANY,INC +00-10-05 (hex) UEC COMMERCIAL +00-10-06 (hex) Thales Contact Solutions Ltd. +00-10-07 (hex) CISCO SYSTEMS, INC. +00-10-08 (hex) VIENNA SYSTEMS CORPORATION +00-10-09 (hex) HORO QUARTZ +00-10-0A (hex) WILLIAMS COMMUNICATIONS GROUP +00-10-0B (hex) CISCO SYSTEMS, INC. +00-10-0C (hex) ITO CO., LTD. +00-10-0D (hex) CISCO SYSTEMS, INC. +00-10-0E (hex) MICRO LINEAR COPORATION +00-10-0F (hex) INDUSTRIAL CPU SYSTEMS +00-10-10 (hex) INITIO CORPORATION +00-10-11 (hex) CISCO SYSTEMS, INC. +00-10-12 (hex) PROCESSOR SYSTEMS (I) PVT LTD +00-10-13 (hex) Kontron America, Inc. +00-10-14 (hex) CISCO SYSTEMS, INC. +00-10-15 (hex) OOmon Inc. +00-10-16 (hex) T.SQWARE +00-10-17 (hex) Bosch Access Systems GmbH +00-10-18 (hex) BROADCOM CORPORATION +00-10-19 (hex) SIRONA DENTAL SYSTEMS GmbH & Co. KG +00-10-1A (hex) PictureTel Corp. +00-10-1B (hex) CORNET TECHNOLOGY, INC. +00-10-1C (hex) OHM TECHNOLOGIES INTL, LLC +00-10-1D (hex) WINBOND ELECTRONICS CORP. +00-10-1E (hex) MATSUSHITA ELECTRONIC INSTRUMENTS CORP. +00-10-1F (hex) CISCO SYSTEMS, INC. +00-10-20 (hex) Hand Held Products Inc +00-10-21 (hex) ENCANTO NETWORKS, INC. +00-10-22 (hex) SatCom Media Corporation +00-10-23 (hex) Network Equipment Technologies +00-10-24 (hex) NAGOYA ELECTRIC WORKS CO., LTD +00-10-25 (hex) Grayhill, Inc +00-10-26 (hex) ACCELERATED NETWORKS, INC. +00-10-27 (hex) L-3 COMMUNICATIONS EAST +00-10-28 (hex) COMPUTER TECHNICA, INC. +00-10-29 (hex) CISCO SYSTEMS, INC. +00-10-2A (hex) ZF MICROSYSTEMS, INC. +00-10-2B (hex) UMAX DATA SYSTEMS, INC. +00-10-2C (hex) Lasat Networks A/S +00-10-2D (hex) HITACHI SOFTWARE ENGINEERING +00-10-2E (hex) NETWORK SYSTEMS & TECHNOLOGIES PVT. LTD. +00-10-2F (hex) CISCO SYSTEMS, INC. +00-10-30 (hex) EION Inc. +00-10-31 (hex) OBJECTIVE COMMUNICATIONS, INC. +00-10-32 (hex) ALTA TECHNOLOGY +00-10-33 (hex) ACCESSLAN COMMUNICATIONS, INC. +00-10-34 (hex) GNP Computers +00-10-35 (hex) ELITEGROUP COMPUTER SYSTEMS CO., LTD +00-10-36 (hex) INTER-TEL INTEGRATED SYSTEMS +00-10-37 (hex) CYQ've Technology Co., Ltd. +00-10-38 (hex) MICRO RESEARCH INSTITUTE, INC. +00-10-39 (hex) Vectron Systems AG +00-10-3A (hex) DIAMOND NETWORK TECH +00-10-3B (hex) HIPPI NETWORKING FORUM +00-10-3C (hex) IC ENSEMBLE, INC. +00-10-3D (hex) PHASECOM, LTD. +00-10-3E (hex) NETSCHOOLS CORPORATION +00-10-3F (hex) TOLLGRADE COMMUNICATIONS, INC. +00-10-40 (hex) INTERMEC CORPORATION +00-10-41 (hex) BRISTOL BABCOCK, INC. +00-10-42 (hex) Alacritech, Inc. +00-10-43 (hex) A2 CORPORATION +00-10-44 (hex) InnoLabs Corporation +00-10-45 (hex) Nortel Networks +00-10-46 (hex) ALCORN MCBRIDE INC. +00-10-47 (hex) ECHO ELETRIC CO. LTD. +00-10-48 (hex) HTRC AUTOMATION, INC. +00-10-49 (hex) ShoreTel, Inc +00-10-4A (hex) The Parvus Corporation +00-10-4B (hex) 3COM CORPORATION +00-10-4C (hex) LeCroy Corporation +00-10-4D (hex) SURTEC INDUSTRIES, INC. +00-10-4E (hex) CEOLOGIC +00-10-4F (hex) Sun Microsystems, Inc. +00-10-50 (hex) RION CO., LTD. +00-10-51 (hex) CMICRO CORPORATION +00-10-52 (hex) METTLER-TOLEDO (ALBSTADT) GMBH +00-10-53 (hex) COMPUTER TECHNOLOGY CORP. +00-10-54 (hex) CISCO SYSTEMS, INC. +00-10-55 (hex) FUJITSU MICROELECTRONICS, INC. +00-10-56 (hex) SODICK CO., LTD. +00-10-57 (hex) Rebel.com, Inc. +00-10-58 (hex) ArrowPoint Communications +00-10-59 (hex) DIABLO RESEARCH CO. LLC +00-10-5A (hex) 3COM CORPORATION +00-10-5B (hex) NET INSIGHT AB +00-10-5C (hex) QUANTUM DESIGNS (H.K.) LTD. +00-10-5D (hex) Draeger Medical +00-10-5E (hex) HEKIMIAN LABORATORIES, INC. +00-10-5F (hex) IN-SNEC +00-10-60 (hex) BILLIONTON SYSTEMS, INC. +00-10-61 (hex) HOSTLINK CORP. +00-10-62 (hex) NX SERVER, ILNC. +00-10-63 (hex) STARGUIDE DIGITAL NETWORKS +00-10-64 (hex) DNPG, LLC +00-10-65 (hex) RADYNE CORPORATION +00-10-66 (hex) ADVANCED CONTROL SYSTEMS, INC. +00-10-67 (hex) REDBACK NETWORKS, INC. +00-10-68 (hex) COMOS TELECOM +00-10-69 (hex) HELIOSS COMMUNICATIONS, INC. +00-10-6A (hex) DIGITAL MICROWAVE CORPORATION +00-10-6B (hex) SONUS NETWORKS, INC. +00-10-6C (hex) Infratec AG +00-10-6D (hex) Axxcelera Broadband Wireless +00-10-6E (hex) TADIRAN COM. LTD. +00-10-6F (hex) TRENTON TECHNOLOGY INC. +00-10-70 (hex) CARADON TREND LTD. +00-10-71 (hex) ADVANET INC. +00-10-72 (hex) GVN TECHNOLOGIES, INC. +00-10-73 (hex) Technobox, Inc. +00-10-74 (hex) ATEN INTERNATIONAL CO., LTD. +00-10-75 (hex) Maxtor Corporation +00-10-76 (hex) EUREM GmbH +00-10-77 (hex) SAF DRIVE SYSTEMS, LTD. +00-10-78 (hex) NUERA COMMUNICATIONS, INC. +00-10-79 (hex) CISCO SYSTEMS, INC. +00-10-7A (hex) AmbiCom, Inc. +00-10-7B (hex) CISCO SYSTEMS, INC. +00-10-7C (hex) P-COM, INC. +00-10-7D (hex) AURORA COMMUNICATIONS, LTD. +00-10-7E (hex) BACHMANN ELECTRONIC GmbH +00-10-7F (hex) CRESTRON ELECTRONICS, INC. +00-10-80 (hex) METAWAVE COMMUNICATIONS +00-10-81 (hex) DPS, INC. +00-10-82 (hex) JNA TELECOMMUNICATIONS LIMITED +00-10-83 (hex) HEWLETT-PACKARD COMPANY +00-10-84 (hex) K-BOT COMMUNICATIONS +00-10-85 (hex) POLARIS COMMUNICATIONS, INC. +00-10-86 (hex) ATTO Technology, Inc. +00-10-87 (hex) Xstreamis PLC +00-10-88 (hex) AMERICAN NETWORKS INC. +00-10-89 (hex) WebSonic +00-10-8A (hex) TeraLogic, Inc. +00-10-8B (hex) LASERANIMATION SOLLINGER GmbH +00-10-8C (hex) FUJITSU TELECOMMUNICATIONS EUROPE, LTD. +00-10-8D (hex) Johnson Controls, Inc. +00-10-8E (hex) HUGH SYMONS CONCEPT Technologies Ltd. +00-10-8F (hex) RAPTOR SYSTEMS +00-10-90 (hex) CIMETRICS, INC. +00-10-91 (hex) NO WIRES NEEDED BV +00-10-92 (hex) NETCORE INC. +00-10-93 (hex) CMS COMPUTERS, LTD. +00-10-94 (hex) Performance Analysis Broadband, Spirent plc +00-10-95 (hex) Thomson Inc. +00-10-96 (hex) TRACEWELL SYSTEMS, INC. +00-10-97 (hex) WinNet Metropolitan Communications Systems, Inc. +00-10-98 (hex) STARNET TECHNOLOGIES, INC. +00-10-99 (hex) InnoMedia, Inc. +00-10-9A (hex) NETLINE +00-10-9B (hex) Emulex Corporation +00-10-9C (hex) M-SYSTEM CO., LTD. +00-10-9D (hex) CLARINET SYSTEMS, INC. +00-10-9E (hex) AWARE, INC. +00-10-9F (hex) PAVO, INC. +00-10-A0 (hex) INNOVEX TECHNOLOGIES, INC. +00-10-A1 (hex) KENDIN SEMICONDUCTOR, INC. +00-10-A2 (hex) TNS +00-10-A3 (hex) OMNITRONIX, INC. +00-10-A4 (hex) XIRCOM +00-10-A5 (hex) OXFORD INSTRUMENTS +00-10-A6 (hex) CISCO SYSTEMS, INC. +00-10-A7 (hex) UNEX TECHNOLOGY CORPORATION +00-10-A8 (hex) RELIANCE COMPUTER CORP. +00-10-A9 (hex) ADHOC TECHNOLOGIES +00-10-AA (hex) MEDIA4, INC. +00-10-AB (hex) KOITO INDUSTRIES, LTD. +00-10-AC (hex) IMCI TECHNOLOGIES +00-10-AD (hex) SOFTRONICS USB, INC. +00-10-AE (hex) SHINKO ELECTRIC INDUSTRIES CO. +00-10-AF (hex) TAC SYSTEMS, INC. +00-10-B0 (hex) MERIDIAN TECHNOLOGY CORP. +00-10-B1 (hex) FOR-A CO., LTD. +00-10-B2 (hex) COACTIVE AESTHETICS +00-10-B3 (hex) NOKIA MULTIMEDIA TERMINALS +00-10-B4 (hex) ATMOSPHERE NETWORKS +00-10-B5 (hex) ACCTON TECHNOLOGY CORPORATION +00-10-B6 (hex) ENTRATA COMMUNICATIONS CORP. +00-10-B7 (hex) COYOTE TECHNOLOGIES, LLC +00-10-B8 (hex) ISHIGAKI COMPUTER SYSTEM CO. +00-10-B9 (hex) MAXTOR CORP. +00-10-BA (hex) MARTINHO-DAVIS SYSTEMS, INC. +00-10-BB (hex) DATA & INFORMATION TECHNOLOGY +00-10-BC (hex) Aastra Telecom +00-10-BD (hex) THE TELECOMMUNICATION TECHNOLOGY COMMITTEE +00-10-BE (hex) TELEXIS CORP. +00-10-BF (hex) InterAir Wireless +00-10-C0 (hex) ARMA, Inc. +00-10-C1 (hex) OI ELECTRIC CO., LTD. +00-10-C2 (hex) WILLNET, INC. +00-10-C3 (hex) CSI-CONTROL SYSTEMS +00-10-C4 (hex) MEDIA LINKS CO., LTD. +00-10-C5 (hex) PROTOCOL TECHNOLOGIES, INC. +00-10-C6 (hex) USI +00-10-C7 (hex) DATA TRANSMISSION NETWORK +00-10-C8 (hex) COMMUNICATIONS ELECTRONICS SECURITY GROUP +00-10-C9 (hex) MITSUBISHI ELECTRONICS LOGISTIC SUPPORT CO. +00-10-CA (hex) INTEGRAL ACCESS +00-10-CB (hex) FACIT K.K. +00-10-CC (hex) CLP COMPUTER LOGISTIK PLANUNG GmbH +00-10-CD (hex) INTERFACE CONCEPT +00-10-CE (hex) VOLAMP, LTD. +00-10-CF (hex) FIBERLANE COMMUNICATIONS +00-10-D0 (hex) WITCOM, LTD. +00-10-D1 (hex) Top Layer Networks, Inc. +00-10-D2 (hex) NITTO TSUSHINKI CO., LTD +00-10-D3 (hex) GRIPS ELECTRONIC GMBH +00-10-D4 (hex) STORAGE COMPUTER CORPORATION +00-10-D5 (hex) IMASDE CANARIAS, S.A. +00-10-D6 (hex) ITT - A/CD +00-10-D7 (hex) ARGOSY RESEARCH INC. +00-10-D8 (hex) CALISTA +00-10-D9 (hex) IBM JAPAN, FUJISAWA MT+D +00-10-DA (hex) MOTION ENGINEERING, INC. +00-10-DB (hex) Juniper Networks, Inc. +00-10-DC (hex) MICRO-STAR INTERNATIONAL CO., LTD. +00-10-DD (hex) ENABLE SEMICONDUCTOR, INC. +00-10-DE (hex) INTERNATIONAL DATACASTING CORPORATION +00-10-DF (hex) RISE COMPUTER INC. +00-10-E0 (hex) Sun Microsystems, Inc. +00-10-E1 (hex) S.I. TECH, INC. +00-10-E2 (hex) ArrayComm, Inc. +00-10-E3 (hex) Hewlett Packard +00-10-E4 (hex) NSI CORPORATION +00-10-E5 (hex) SOLECTRON TEXAS +00-10-E6 (hex) APPLIED INTELLIGENT SYSTEMS, INC. +00-10-E7 (hex) BreezeCom +00-10-E8 (hex) TELOCITY, INCORPORATED +00-10-E9 (hex) RAIDTEC LTD. +00-10-EA (hex) ADEPT TECHNOLOGY +00-10-EB (hex) SELSIUS SYSTEMS, INC. +00-10-EC (hex) RPCG, LLC +00-10-ED (hex) SUNDANCE TECHNOLOGY, INC. +00-10-EE (hex) CTI PRODUCTS, INC. +00-10-EF (hex) DBTEL INCORPORATED +00-10-F1 (hex) I-O CORPORATION +00-10-F2 (hex) ANTEC +00-10-F3 (hex) Nexcom International Co., Ltd. +00-10-F4 (hex) Vertical Communications +00-10-F5 (hex) AMHERST SYSTEMS, INC. +00-10-F6 (hex) CISCO SYSTEMS, INC. +00-10-F7 (hex) IRIICHI TECHNOLOGIES Inc. +00-10-F8 (hex) Niikke Techno System Co. Ltd +00-10-F9 (hex) UNIQUE SYSTEMS, INC. +00-10-FA (hex) Apple Inc +00-10-FB (hex) ZIDA TECHNOLOGIES LIMITED +00-10-FC (hex) BROADBAND NETWORKS, INC. +00-10-FD (hex) COCOM A/S +00-10-FE (hex) DIGITAL EQUIPMENT CORPORATION +00-10-FF (hex) CISCO SYSTEMS, INC. +00-11-00 (hex) Schneider Electric +00-11-01 (hex) CET Technologies Pte Ltd +00-11-02 (hex) Aurora Multimedia Corp. +00-11-03 (hex) kawamura electric inc. +00-11-04 (hex) TELEXY +00-11-05 (hex) Sunplus Technology Co., Ltd. +00-11-06 (hex) Siemens NV (Belgium) +00-11-07 (hex) RGB Networks Inc. +00-11-08 (hex) Orbital Data Corporation +00-11-09 (hex) Micro-Star International +00-11-0A (hex) Hewlett Packard +00-11-0B (hex) Franklin Technology Systems +00-11-0C (hex) Atmark Techno, Inc. +00-11-0D (hex) SANBlaze Technology, Inc. +00-11-0E (hex) Tsurusaki Sealand Transportation Co. Ltd. +00-11-0F (hex) netplat,Inc. +00-11-10 (hex) Maxanna Technology Co., Ltd. +00-11-11 (hex) Intel Corporation +00-11-12 (hex) Honeywell CMSS +00-11-13 (hex) Fraunhofer FOKUS +00-11-14 (hex) EverFocus Electronics Corp. +00-11-15 (hex) EPIN Technologies, Inc. +00-11-16 (hex) COTEAU VERT CO., LTD. +00-11-17 (hex) CESNET +00-11-18 (hex) BLX IC Design Corp., Ltd. +00-11-19 (hex) Solteras, Inc. +00-11-1A (hex) Motorola BCS +00-11-1B (hex) Targa Systems Div L-3 Communications Canada +00-11-1C (hex) Pleora Technologies Inc. +00-11-1D (hex) Hectrix Limited +00-11-1E (hex) EPSG (Ethernet Powerlink Standardization Group) +00-11-1F (hex) Doremi Labs, Inc. +00-11-20 (hex) Cisco Systems +00-11-21 (hex) Cisco Systems +00-11-22 (hex) CIMSYS Inc +00-11-23 (hex) Appointech, Inc. +00-11-24 (hex) Apple Computer +00-11-25 (hex) IBM Corporation +00-11-26 (hex) Venstar Inc. +00-11-27 (hex) TASI, Inc +00-11-28 (hex) Streamit +00-11-29 (hex) Paradise Datacom Ltd. +00-11-2A (hex) Niko NV +00-11-2B (hex) NetModule +00-11-2C (hex) IZT GmbH +00-11-2D (hex) iPulse Systems +00-11-2E (hex) CEICOM +00-11-2F (hex) ASUSTek Computer Inc. +00-11-30 (hex) Allied Telesis (Hong Kong) Ltd. +00-11-31 (hex) UNATECH. CO.,LTD +00-11-32 (hex) Synology Incorporated +00-11-33 (hex) Siemens Austria SIMEA +00-11-34 (hex) MediaCell, Inc. +00-11-35 (hex) Grandeye Ltd +00-11-36 (hex) Goodrich Sensor Systems +00-11-37 (hex) AICHI ELECTRIC CO., LTD. +00-11-38 (hex) TAISHIN CO., LTD. +00-11-39 (hex) STOEBER ANTRIEBSTECHNIK GmbH + Co. KG. +00-11-3A (hex) SHINBORAM +00-11-3B (hex) Micronet Communications Inc. +00-11-3C (hex) Micronas GmbH +00-11-3D (hex) KN SOLTEC CO.,LTD. +00-11-3E (hex) JL Corporation +00-11-3F (hex) Alcatel DI +00-11-40 (hex) Nanometrics Inc. +00-11-41 (hex) GoodMan Corporation +00-11-42 (hex) e-SMARTCOM INC. +00-11-43 (hex) DELL INC. +00-11-44 (hex) Assurance Technology Corp +00-11-45 (hex) ValuePoint Networks +00-11-46 (hex) Telecard-Pribor Ltd +00-11-47 (hex) Secom-Industry co.LTD. +00-11-48 (hex) Prolon Control Systems +00-11-49 (hex) Proliphix Inc. +00-11-4A (hex) KAYABA INDUSTRY Co,.Ltd. +00-11-4B (hex) Francotyp-Postalia GmbH +00-11-4C (hex) caffeina applied research ltd. +00-11-4D (hex) Atsumi Electric Co.,LTD. +00-11-4E (hex) 690885 Ontario Inc. +00-11-4F (hex) US Digital Television, Inc +00-11-50 (hex) Belkin Corporation +00-11-51 (hex) Mykotronx +00-11-52 (hex) Eidsvoll Electronics AS +00-11-53 (hex) Trident Tek, Inc. +00-11-54 (hex) Webpro Technologies Inc. +00-11-55 (hex) Sevis Systems +00-11-56 (hex) Pharos Systems NZ +00-11-57 (hex) OF Networks Co., Ltd. +00-11-58 (hex) Nortel Networks +00-11-59 (hex) MATISSE NETWORKS INC +00-11-5A (hex) Ivoclar Vivadent AG +00-11-5B (hex) Elitegroup Computer System Co. (ECS) +00-11-5C (hex) Cisco +00-11-5D (hex) Cisco +00-11-5E (hex) ProMinent Dosiertechnik GmbH +00-11-5F (hex) ITX Security Co., Ltd. +00-11-60 (hex) ARTDIO Company Co., LTD +00-11-61 (hex) NetStreams, LLC +00-11-62 (hex) STAR MICRONICS CO.,LTD. +00-11-63 (hex) SYSTEM SPA DEPT. ELECTRONICS +00-11-64 (hex) ACARD Technology Corp. +00-11-65 (hex) Znyx Networks +00-11-66 (hex) Taelim Electronics Co., Ltd. +00-11-67 (hex) Integrated System Solution Corp. +00-11-68 (hex) HomeLogic LLC +00-11-69 (hex) EMS Satcom +00-11-6A (hex) Domo Ltd +00-11-6B (hex) Digital Data Communications Asia Co.,Ltd +00-11-6C (hex) Nanwang Multimedia Inc.,Ltd +00-11-6D (hex) American Time and Signal +00-11-6E (hex) PePLink Ltd. +00-11-6F (hex) Netforyou Co., LTD. +00-11-70 (hex) GSC SRL +00-11-71 (hex) DEXTER Communications, Inc. +00-11-72 (hex) COTRON CORPORATION +00-11-73 (hex) SMART Modular Technologies +00-11-74 (hex) Wibhu Technologies, Inc. +00-11-75 (hex) PathScale, Inc. +00-11-76 (hex) Intellambda Systems, Inc. +00-11-77 (hex) Coaxial Networks, Inc. +00-11-78 (hex) Chiron Technology Ltd +00-11-79 (hex) Singular Technology Co. Ltd. +00-11-7A (hex) Singim International Corp. +00-11-7B (hex) Büchi Labortechnik AG +00-11-7C (hex) e-zy.net +00-11-7D (hex) ZMD America, Inc. +00-11-7E (hex) Progeny Inc. +00-11-7F (hex) Neotune Information Technology Corporation,.LTD +00-11-80 (hex) Motorola BCS +00-11-81 (hex) InterEnergy Co.Ltd, +00-11-82 (hex) IMI Norgren Ltd +00-11-83 (hex) Datalogic Mobile, Inc. +00-11-84 (hex) Humo Laboratory,Ltd. +00-11-85 (hex) Hewlett Packard +00-11-86 (hex) Prime Systems, Inc. +00-11-87 (hex) Category Solutions, Inc +00-11-88 (hex) Enterasys +00-11-89 (hex) Aerotech Inc +00-11-8A (hex) Viewtran Technology Limited +00-11-8B (hex) Alcatel-Lucent, Enterprise Business Group +00-11-8C (hex) Missouri Department of Transportation +00-11-8D (hex) Hanchang System Corp. +00-11-8E (hex) Halytech Mace +00-11-8F (hex) EUTECH INSTRUMENTS PTE. LTD. +00-11-90 (hex) Digital Design Corporation +00-11-91 (hex) CTS-Clima Temperatur Systeme GmbH +00-11-92 (hex) Cisco Systems +00-11-93 (hex) Cisco Systems +00-11-94 (hex) Chi Mei Communication Systems, Inc. +00-11-95 (hex) D-Link Corporation +00-11-96 (hex) Actuality Systems, Inc. +00-11-97 (hex) Monitoring Technologies Limited +00-11-98 (hex) Prism Media Products Limited +00-11-99 (hex) 2wcom GmbH +00-11-9A (hex) Alkeria srl +00-11-9B (hex) Telesynergy Research Inc. +00-11-9C (hex) EP&T Energy +00-11-9D (hex) Diginfo Technology Corporation +00-11-9E (hex) Solectron Brazil +00-11-9F (hex) Nokia Danmark A/S +00-11-A0 (hex) Vtech Engineering Canada Ltd +00-11-A1 (hex) VISION NETWARE CO.,LTD +00-11-A2 (hex) Manufacturing Technology Inc +00-11-A3 (hex) LanReady Technologies Inc. +00-11-A4 (hex) JStream Technologies Inc. +00-11-A5 (hex) Fortuna Electronic Corp. +00-11-A6 (hex) Sypixx Networks +00-11-A7 (hex) Infilco Degremont Inc. +00-11-A8 (hex) Quest Technologies +00-11-A9 (hex) MOIMSTONE Co., LTD +00-11-AA (hex) Uniclass Technology, Co., LTD +00-11-AB (hex) TRUSTABLE TECHNOLOGY CO.,LTD. +00-11-AC (hex) Simtec Electronics +00-11-AD (hex) Shanghai Ruijie Technology +00-11-AE (hex) Motorola BCS +00-11-AF (hex) Medialink-i,Inc +00-11-B0 (hex) Fortelink Inc. +00-11-B1 (hex) BlueExpert Technology Corp. +00-11-B2 (hex) 2001 Technology Inc. +00-11-B3 (hex) YOSHIMIYA CO.,LTD. +00-11-B4 (hex) Westermo Teleindustri AB +00-11-B5 (hex) Shenzhen Powercom Co.,Ltd +00-11-B6 (hex) Open Systems International +00-11-B7 (hex) Octalix B.V. +00-11-B8 (hex) Liebherr - Elektronik GmbH +00-11-B9 (hex) Inner Range Pty. Ltd. +00-11-BA (hex) Elexol Pty Ltd +00-11-BB (hex) Cisco Systems +00-11-BC (hex) Cisco Systems +00-11-BD (hex) Bombardier Transportation +00-11-BE (hex) AGP Telecom Co. Ltd +00-11-BF (hex) AESYS S.p.A. +00-11-C0 (hex) Aday Technology Inc +00-11-C1 (hex) 4P MOBILE DATA PROCESSING +00-11-C2 (hex) United Fiber Optic Communication +00-11-C3 (hex) Transceiving System Technology Corporation +00-11-C4 (hex) Terminales de Telecomunicacion Terrestre, S.L. +00-11-C5 (hex) TEN Technology +00-11-C6 (hex) Seagate Technology LLC +00-11-C7 (hex) Raymarine UK Ltd +00-11-C8 (hex) Powercom Co., Ltd. +00-11-C9 (hex) MTT Corporation +00-11-CA (hex) Long Range Systems, Inc. +00-11-CB (hex) Jacobsons AB +00-11-CC (hex) Guangzhou Jinpeng Group Co.,Ltd. +00-11-CD (hex) Axsun Technologies +00-11-CE (hex) Ubisense Limited +00-11-CF (hex) Thrane & Thrane A/S +00-11-D0 (hex) Tandberg Data ASA +00-11-D1 (hex) Soft Imaging System GmbH +00-11-D2 (hex) Perception Digital Ltd +00-11-D3 (hex) NextGenTel Holding ASA +00-11-D4 (hex) NetEnrich, Inc +00-11-D5 (hex) Hangzhou Sunyard System Engineering Co.,Ltd. +00-11-D6 (hex) HandEra, Inc. +00-11-D7 (hex) eWerks Inc +00-11-D8 (hex) ASUSTek Computer Inc. +00-11-D9 (hex) TiVo +00-11-DA (hex) Vivaas Technology Inc. +00-11-DB (hex) Land-Cellular Corporation +00-11-DC (hex) Glunz & Jensen +00-11-DD (hex) FROMUS TEC. Co., Ltd. +00-11-DE (hex) EURILOGIC +00-11-DF (hex) Current Energy +00-11-E0 (hex) U-MEDIA Communications, Inc. +00-11-E1 (hex) BEKO Electronics Co. +00-11-E2 (hex) Hua Jung Components Co., Ltd. +00-11-E3 (hex) Thomson, Inc. +00-11-E4 (hex) Danelec Electronics A/S +00-11-E5 (hex) KCodes Corporation +00-11-E6 (hex) Scientific Atlanta +00-11-E7 (hex) WORLDSAT - Texas de France +00-11-E8 (hex) Tixi.Com +00-11-E9 (hex) STARNEX CO., LTD. +00-11-EA (hex) IWICS Inc. +00-11-EB (hex) Innovative Integration +00-11-EC (hex) AVIX INC. +00-11-ED (hex) 802 Global +00-11-EE (hex) Estari, Inc. +00-11-EF (hex) Conitec Datensysteme GmbH +00-11-F0 (hex) Wideful Limited +00-11-F1 (hex) QinetiQ Ltd +00-11-F2 (hex) Institute of Network Technologies +00-11-F3 (hex) NeoMedia Europe AG +00-11-F4 (hex) woori-net +00-11-F5 (hex) ASKEY COMPUTER CORP. +00-11-F6 (hex) Asia Pacific Microsystems , Inc. +00-11-F7 (hex) Shenzhen Forward Industry Co., Ltd +00-11-F8 (hex) AIRAYA Corp +00-11-F9 (hex) Nortel Networks +00-11-FA (hex) Rane Corporation +00-11-FB (hex) Heidelberg Engineering GmbH +00-11-FC (hex) HARTING Electric Gmbh & Co.KG +00-11-FD (hex) KORG INC. +00-11-FE (hex) Keiyo System Research, Inc. +00-11-FF (hex) Digitro Tecnologia Ltda +00-12-00 (hex) Cisco +00-12-01 (hex) Cisco +00-12-02 (hex) Decrane Aerospace - Audio International Inc. +00-12-03 (hex) Activ Networks +00-12-04 (hex) u10 Networks, Inc. +00-12-05 (hex) Terrasat Communications, Inc. +00-12-06 (hex) iQuest (NZ) Ltd +00-12-07 (hex) Head Strong International Limited +00-12-08 (hex) Gantner Instruments GmbH +00-12-09 (hex) Fastrax Ltd +00-12-0A (hex) Emerson Electric GmbH & Co. OHG +00-12-0B (hex) Chinasys Technologies Limited +00-12-0C (hex) CE-Infosys Pte Ltd +00-12-0D (hex) Advanced Telecommunication Technologies, Inc. +00-12-0E (hex) AboCom +00-12-0F (hex) IEEE 802.3 +00-12-10 (hex) WideRay Corp +00-12-11 (hex) Protechna Herbst GmbH & Co. KG +00-12-12 (hex) PLUS Corporation +00-12-13 (hex) Metrohm AG +00-12-14 (hex) Koenig & Bauer AG +00-12-15 (hex) iStor Networks, Inc. +00-12-16 (hex) ICP Internet Communication Payment AG +00-12-17 (hex) Cisco-Linksys, LLC +00-12-18 (hex) ARUZE Corporation +00-12-19 (hex) Ahead Communication Systems Inc +00-12-1A (hex) Techno Soft Systemnics Inc. +00-12-1B (hex) Sound Devices, LLC +00-12-1C (hex) PARROT S.A. +00-12-1D (hex) Netfabric Corporation +00-12-1E (hex) Juniper Networks, Inc. +00-12-1F (hex) Harding Intruments +00-12-20 (hex) Cadco Systems +00-12-21 (hex) B.Braun Melsungen AG +00-12-22 (hex) Skardin (UK) Ltd +00-12-23 (hex) Pixim +00-12-24 (hex) NexQL Corporation +00-12-25 (hex) Motorola BCS +00-12-26 (hex) Japan Direx Corporation +00-12-27 (hex) Franklin Electric Co., Inc. +00-12-28 (hex) Data Ltd. +00-12-29 (hex) BroadEasy Technologies Co.,Ltd +00-12-2A (hex) VTech Telecommunications Ltd. +00-12-2B (hex) Virbiage Pty Ltd +00-12-2C (hex) Soenen Controls N.V. +00-12-2D (hex) SiNett Corporation +00-12-2E (hex) Signal Technology - AISD +00-12-2F (hex) Sanei Electric Inc. +00-12-30 (hex) Picaso Infocommunication CO., LTD. +00-12-31 (hex) Motion Control Systems, Inc. +00-12-32 (hex) LeWiz Communications Inc. +00-12-33 (hex) JRC TOKKI Co.,Ltd. +00-12-34 (hex) Camille Bauer +00-12-35 (hex) Andrew Corporation +00-12-36 (hex) ConSentry Networks +00-12-37 (hex) Texas Instruments +00-12-38 (hex) SetaBox Technology Co., Ltd. +00-12-39 (hex) S Net Systems Inc. +00-12-3A (hex) Posystech Inc., Co. +00-12-3B (hex) KeRo Systems ApS +00-12-3C (hex) Second Rule LLC +00-12-3D (hex) GES +00-12-3E (hex) ERUNE technology Co., Ltd. +00-12-3F (hex) Dell Inc +00-12-40 (hex) AMOI ELECTRONICS CO.,LTD +00-12-41 (hex) a2i marketing center +00-12-42 (hex) Millennial Net +00-12-43 (hex) Cisco +00-12-44 (hex) Cisco +00-12-45 (hex) Zellweger Analytics, Inc. +00-12-46 (hex) T.O.M TECHNOLOGY INC.. +00-12-47 (hex) Samsung Electronics Co., Ltd. +00-12-48 (hex) EMC Corporation (Kashya) +00-12-49 (hex) Delta Elettronica S.p.A. +00-12-4A (hex) Dedicated Devices, Inc. +00-12-4B (hex) Texas Instruments +00-12-4C (hex) BBWM Corporation +00-12-4D (hex) Inducon BV +00-12-4E (hex) XAC AUTOMATION CORP. +00-12-4F (hex) Tyco Thermal Controls LLC. +00-12-50 (hex) Tokyo Aircaft Instrument Co., Ltd. +00-12-51 (hex) SILINK +00-12-52 (hex) Citronix, LLC +00-12-53 (hex) AudioDev AB +00-12-54 (hex) Spectra Technologies Holdings Company Ltd +00-12-55 (hex) NetEffect Incorporated +00-12-56 (hex) LG INFORMATION & COMM. +00-12-57 (hex) LeapComm Communication Technologies Inc. +00-12-58 (hex) Activis Polska +00-12-59 (hex) THERMO ELECTRON KARLSRUHE +00-12-5A (hex) Microsoft Corporation +00-12-5B (hex) KAIMEI ELECTRONI +00-12-5C (hex) Green Hills Software, Inc. +00-12-5D (hex) CyberNet Inc. +00-12-5E (hex) CAEN +00-12-5F (hex) AWIND Inc. +00-12-60 (hex) Stanton Magnetics,inc. +00-12-61 (hex) Adaptix, Inc +00-12-62 (hex) Nokia Danmark A/S +00-12-63 (hex) Data Voice Technologies GmbH +00-12-64 (hex) daum electronic gmbh +00-12-65 (hex) Enerdyne Technologies, Inc. +00-12-66 (hex) Swisscom Hospitality Services SA +00-12-67 (hex) Matsushita Electronic Components Co., Ltd. +00-12-68 (hex) IPS d.o.o. +00-12-69 (hex) Value Electronics +00-12-6A (hex) OPTOELECTRONICS Co., Ltd. +00-12-6B (hex) Ascalade Communications Limited +00-12-6C (hex) Visonic Ltd. +00-12-6D (hex) University of California, Berkeley +00-12-6E (hex) Seidel Elektronik GmbH Nfg.KG +00-12-6F (hex) Rayson Technology Co., Ltd. +00-12-70 (hex) NGES Denro Systems +00-12-71 (hex) Measurement Computing Corp +00-12-72 (hex) Redux Communications Ltd. +00-12-73 (hex) Stoke Inc +00-12-74 (hex) NIT lab +00-12-75 (hex) Sentilla Corporation +00-12-76 (hex) Microsol Holdings Ltd. +00-12-77 (hex) Korenix Technologies Co., Ltd. +00-12-78 (hex) International Bar Code +00-12-79 (hex) Hewlett Packard +00-12-7A (hex) Sanyu Industry Co.,Ltd. +00-12-7B (hex) VIA Networking Technologies, Inc. +00-12-7C (hex) SWEGON AB +00-12-7D (hex) MobileAria +00-12-7E (hex) Digital Lifestyles Group, Inc. +00-12-7F (hex) Cisco +00-12-80 (hex) Cisco +00-12-81 (hex) CIEFFE srl +00-12-82 (hex) Qovia +00-12-83 (hex) Nortel Networks +00-12-84 (hex) Lab33 Srl +00-12-85 (hex) Gizmondo Europe Ltd +00-12-86 (hex) ENDEVCO CORP +00-12-87 (hex) Digital Everywhere Unterhaltungselektronik GmbH +00-12-88 (hex) 2Wire, Inc +00-12-89 (hex) Advance Sterilization Products +00-12-8A (hex) Motorola PCS +00-12-8B (hex) Sensory Networks Inc +00-12-8C (hex) Woodward Governor +00-12-8D (hex) STB Datenservice GmbH +00-12-8E (hex) Q-Free ASA +00-12-8F (hex) Montilio +00-12-90 (hex) KYOWA Electric & Machinery Corp. +00-12-91 (hex) KWS Computersysteme GmbH +00-12-92 (hex) Griffin Technology +00-12-93 (hex) GE Energy +00-12-94 (hex) SUMITOMO ELECTRIC DEVICE INNOVATIONS, INC +00-12-95 (hex) Aiware Inc. +00-12-96 (hex) Addlogix +00-12-97 (hex) O2Micro, Inc. +00-12-98 (hex) MICO ELECTRIC(SHENZHEN) LIMITED +00-12-99 (hex) Ktech Telecommunications Inc +00-12-9A (hex) IRT Electronics Pty Ltd +00-12-9B (hex) E2S Electronic Engineering Solutions, S.L. +00-12-9C (hex) Yulinet +00-12-9D (hex) First International Computer do Brasil +00-12-9E (hex) Surf Communications Inc. +00-12-9F (hex) RAE Systems, Inc. +00-12-A0 (hex) NeoMeridian Sdn Bhd +00-12-A1 (hex) BluePacket Communications Co., Ltd. +00-12-A2 (hex) VITA +00-12-A3 (hex) Trust International B.V. +00-12-A4 (hex) ThingMagic, LLC +00-12-A5 (hex) Stargen, Inc. +00-12-A6 (hex) Dolby Australia +00-12-A7 (hex) ISR TECHNOLOGIES Inc +00-12-A8 (hex) intec GmbH +00-12-A9 (hex) 3Com Ltd +00-12-AA (hex) IEE, Inc. +00-12-AB (hex) WiLife, Inc. +00-12-AC (hex) ONTIMETEK INC. +00-12-AD (hex) IDS GmbH +00-12-AE (hex) HLS HARD-LINE Solutions Inc. +00-12-AF (hex) ELPRO Technologies +00-12-B0 (hex) Efore Oyj (Plc) +00-12-B1 (hex) Dai Nippon Printing Co., Ltd +00-12-B2 (hex) AVOLITES LTD. +00-12-B3 (hex) Advance Wireless Technology Corp. +00-12-B4 (hex) Work Microwave GmbH +00-12-B5 (hex) Vialta, Inc. +00-12-B6 (hex) Santa Barbara Infrared, Inc. +00-12-B7 (hex) PTW Freiburg +00-12-B8 (hex) G2 Microsystems +00-12-B9 (hex) Fusion Digital Technology +00-12-BA (hex) FSI Systems, Inc. +00-12-BB (hex) Telecommunications Industry Association TR-41 Committee +00-12-BC (hex) Echolab LLC +00-12-BD (hex) Avantec Manufacturing Limited +00-12-BE (hex) Astek Corporation +00-12-BF (hex) Arcadyan Technology Corporation +00-12-C0 (hex) HotLava Systems, Inc. +00-12-C1 (hex) Check Point Software Technologies +00-12-C2 (hex) Apex Electronics Factory +00-12-C3 (hex) WIT S.A. +00-12-C4 (hex) Viseon, Inc. +00-12-C5 (hex) V-Show Technology (China) Co.,Ltd +00-12-C6 (hex) TGC America, Inc +00-12-C7 (hex) SECURAY Technologies Ltd.Co. +00-12-C8 (hex) Perfect tech +00-12-C9 (hex) Motorola BCS +00-12-CA (hex) Mechatronic Brick Aps +00-12-CB (hex) CSS Inc. +00-12-CC (hex) Bitatek CO., LTD +00-12-CD (hex) ASEM SpA +00-12-CE (hex) Advanced Cybernetics Group +00-12-CF (hex) Accton Technology Corporation +00-12-D0 (hex) Gossen-Metrawatt-GmbH +00-12-D1 (hex) Texas Instruments Inc +00-12-D2 (hex) Texas Instruments +00-12-D3 (hex) Zetta Systems, Inc. +00-12-D4 (hex) Princeton Technology, Ltd +00-12-D5 (hex) Motion Reality Inc. +00-12-D6 (hex) Jiangsu Yitong High-Tech Co.,Ltd +00-12-D7 (hex) Invento Networks, Inc. +00-12-D8 (hex) International Games System Co., Ltd. +00-12-D9 (hex) Cisco Systems +00-12-DA (hex) Cisco Systems +00-12-DB (hex) ZIEHL industrie-elektronik GmbH + Co KG +00-12-DC (hex) SunCorp Industrial Limited +00-12-DD (hex) Shengqu Information Technology (Shanghai) Co., Ltd. +00-12-DE (hex) Radio Components Sweden AB +00-12-DF (hex) Novomatic AG +00-12-E0 (hex) Codan Limited +00-12-E1 (hex) Alliant Networks, Inc +00-12-E2 (hex) ALAXALA Networks Corporation +00-12-E3 (hex) Agat-RT, Ltd. +00-12-E4 (hex) ZIEHL industrie-electronik GmbH + Co KG +00-12-E5 (hex) Time America, Inc. +00-12-E6 (hex) SPECTEC COMPUTER CO., LTD. +00-12-E7 (hex) Projectek Networking Electronics Corp. +00-12-E8 (hex) Fraunhofer IMS +00-12-E9 (hex) Abbey Systems Ltd +00-12-EA (hex) Trane +00-12-EB (hex) R2DI, LLC +00-12-EC (hex) Movacolor b.v. +00-12-ED (hex) AVG Advanced Technologies +00-12-EE (hex) Sony Ericsson Mobile Communications AB +00-12-EF (hex) OneAccess SA +00-12-F0 (hex) Intel Corporate +00-12-F1 (hex) IFOTEC +00-12-F2 (hex) Brocade Communications Systems, Inc +00-12-F3 (hex) connectBlue AB +00-12-F4 (hex) Belco International Co.,Ltd. +00-12-F5 (hex) Imarda New Zealand Limited +00-12-F6 (hex) MDK CO.,LTD. +00-12-F7 (hex) Xiamen Xinglian Electronics Co., Ltd. +00-12-F8 (hex) WNI Resources, LLC +00-12-F9 (hex) URYU SEISAKU, LTD. +00-12-FA (hex) THX LTD +00-12-FB (hex) Samsung Electronics +00-12-FC (hex) PLANET System Co.,LTD +00-12-FD (hex) OPTIMUS IC S.A. +00-12-FE (hex) Lenovo Mobile Communication Technology Ltd. +00-12-FF (hex) Lely Industries N.V. +00-13-00 (hex) IT-FACTORY, INC. +00-13-01 (hex) IronGate S.L. +00-13-02 (hex) Intel Corporate +00-13-03 (hex) GateConnect Technologies GmbH +00-13-04 (hex) Flaircomm Technologies Co. LTD +00-13-05 (hex) Epicom, Inc. +00-13-06 (hex) Always On Wireless +00-13-07 (hex) Paravirtual Corporation +00-13-08 (hex) Nuvera Fuel Cells +00-13-09 (hex) Ocean Broadband Networks +00-13-0A (hex) Nortel +00-13-0B (hex) Mextal B.V. +00-13-0C (hex) HF System Corporation +00-13-0D (hex) GALILEO AVIONICA +00-13-0E (hex) Focusrite Audio Engineering Limited +00-13-0F (hex) EGEMEN Bilgisayar Muh San ve Tic LTD STI +00-13-10 (hex) Cisco-Linksys, LLC +00-13-11 (hex) ARRIS International +00-13-12 (hex) Amedia Networks Inc. +00-13-13 (hex) GuangZhou Post & Telecom Equipment ltd +00-13-14 (hex) Asiamajor Inc. +00-13-15 (hex) SONY Computer Entertainment inc, +00-13-16 (hex) L-S-B Broadcast Technologies GmbH +00-13-17 (hex) GN Netcom as +00-13-18 (hex) DGSTATION Co., Ltd. +00-13-19 (hex) Cisco Systems +00-13-1A (hex) Cisco Systems +00-13-1B (hex) BeCell Innovations Corp. +00-13-1C (hex) LiteTouch, Inc. +00-13-1D (hex) Scanvaegt International A/S +00-13-1E (hex) Peiker acustic GmbH & Co. KG +00-13-1F (hex) NxtPhase T&D, Corp. +00-13-20 (hex) Intel Corporate +00-13-21 (hex) Hewlett Packard +00-13-22 (hex) DAQ Electronics, Inc. +00-13-23 (hex) Cap Co., Ltd. +00-13-24 (hex) Schneider Electric Ultra Terminal +00-13-25 (hex) Cortina Systems Inc +00-13-26 (hex) ECM Systems Ltd +00-13-27 (hex) Data Acquisitions limited +00-13-28 (hex) Westech Korea Inc., +00-13-29 (hex) VSST Co., LTD +00-13-2A (hex) Sitronics Telecom Solutions +00-13-2B (hex) Phoenix Digital +00-13-2C (hex) MAZ Brandenburg GmbH +00-13-2D (hex) iWise Communications +00-13-2E (hex) ITian Coporation +00-13-2F (hex) Interactek +00-13-30 (hex) EURO PROTECTION SURVEILLANCE +00-13-31 (hex) CellPoint Connect +00-13-32 (hex) Beijing Topsec Network Security Technology Co., Ltd. +00-13-33 (hex) BaudTec Corporation +00-13-34 (hex) Arkados, Inc. +00-13-35 (hex) VS Industry Berhad +00-13-36 (hex) Tianjin 712 Communication Broadcasting co., ltd. +00-13-37 (hex) Orient Power Home Network Ltd. +00-13-38 (hex) FRESENIUS-VIAL +00-13-39 (hex) EL-ME AG +00-13-3A (hex) VadaTech Inc. +00-13-3B (hex) Speed Dragon Multimedia Limited +00-13-3C (hex) QUINTRON SYSTEMS INC. +00-13-3D (hex) Micro Memory Curtiss Wright Co +00-13-3E (hex) MetaSwitch +00-13-3F (hex) Eppendorf Instrumente GmbH +00-13-40 (hex) AD.EL s.r.l. +00-13-41 (hex) Shandong New Beiyang Information Technology Co.,Ltd +00-13-42 (hex) Vision Research, Inc. +00-13-43 (hex) Matsushita Electronic Components (Europe) GmbH +00-13-44 (hex) Fargo Electronics Inc. +00-13-45 (hex) Eaton Corporation +00-13-46 (hex) D-Link Corporation +00-13-47 (hex) BlueTree Wireless Data Inc. +00-13-48 (hex) Artila Electronics Co., Ltd. +00-13-49 (hex) ZyXEL Communications Corporation +00-13-4A (hex) Engim, Inc. +00-13-4B (hex) ToGoldenNet Technology Inc. +00-13-4C (hex) YDT Technology International +00-13-4D (hex) IPC systems +00-13-4E (hex) Valox Systems, Inc. +00-13-4F (hex) Tranzeo Wireless Technologies Inc. +00-13-50 (hex) Silver Spring Networks, Inc +00-13-51 (hex) Niles Audio Corporation +00-13-52 (hex) Naztec, Inc. +00-13-53 (hex) HYDAC Filtertechnik GMBH +00-13-54 (hex) Zcomax Technologies, Inc. +00-13-55 (hex) TOMEN Cyber-business Solutions, Inc. +00-13-56 (hex) target systemelectronic gmbh +00-13-57 (hex) Soyal Technology Co., Ltd. +00-13-58 (hex) Realm Systems, Inc. +00-13-59 (hex) ProTelevision Technologies A/S +00-13-5A (hex) Project T&E Limited +00-13-5B (hex) PanelLink Cinema, LLC +00-13-5C (hex) OnSite Systems, Inc. +00-13-5D (hex) NTTPC Communications, Inc. +00-13-5E (hex) EAB/RWI/K +00-13-5F (hex) Cisco Systems +00-13-60 (hex) Cisco Systems +00-13-61 (hex) Biospace Co., Ltd. +00-13-62 (hex) ShinHeung Precision Co., Ltd. +00-13-63 (hex) Verascape, Inc. +00-13-64 (hex) Paradigm Technology Inc.. +00-13-65 (hex) Nortel +00-13-66 (hex) Neturity Technologies Inc. +00-13-67 (hex) Narayon. Co., Ltd. +00-13-68 (hex) Maersk Data Defence +00-13-69 (hex) Honda Electron Co., LED. +00-13-6A (hex) Hach Lange SA +00-13-6B (hex) E-TEC +00-13-6C (hex) TomTom +00-13-6D (hex) Tentaculus AB +00-13-6E (hex) Techmetro Corp. +00-13-6F (hex) PacketMotion, Inc. +00-13-70 (hex) Nokia Danmark A/S +00-13-71 (hex) Motorola CHS +00-13-72 (hex) Dell Inc. +00-13-73 (hex) BLwave Electronics Co., Ltd +00-13-74 (hex) Atheros Communications, Inc. +00-13-75 (hex) American Security Products Co. +00-13-76 (hex) Tabor Electronics Ltd. +00-13-77 (hex) Samsung Electronics CO., LTD +00-13-78 (hex) QSAN Technology, Inc. +00-13-79 (hex) PONDER INFORMATION INDUSTRIES LTD. +00-13-7A (hex) Netvox Technology Co., Ltd. +00-13-7B (hex) Movon Corporation +00-13-7C (hex) Kaicom co., Ltd. +00-13-7D (hex) Dynalab, Inc. +00-13-7E (hex) CorEdge Networks, Inc. +00-13-7F (hex) Cisco Systems +00-13-80 (hex) Cisco Systems +00-13-81 (hex) CHIPS & Systems, Inc. +00-13-82 (hex) Cetacea Networks Corporation +00-13-83 (hex) Application Technologies and Engineering Research Laboratory +00-13-84 (hex) Advanced Motion Controls +00-13-85 (hex) Add-On Technology Co., LTD. +00-13-86 (hex) ABB Inc./Totalflow +00-13-87 (hex) 27M Technologies AB +00-13-88 (hex) WiMedia Alliance +00-13-89 (hex) Redes de Telefonía Móvil S.A. +00-13-8A (hex) QINGDAO GOERTEK ELECTRONICS CO.,LTD. +00-13-8B (hex) Phantom Technologies LLC +00-13-8C (hex) Kumyoung.Co.Ltd +00-13-8D (hex) Kinghold +00-13-8E (hex) FOAB Elektronik AB +00-13-8F (hex) Asiarock Incorporation +00-13-90 (hex) Termtek Computer Co., Ltd +00-13-91 (hex) OUEN CO.,LTD. +00-13-92 (hex) Ruckus Wireless +00-13-93 (hex) Panta Systems, Inc. +00-13-94 (hex) Infohand Co.,Ltd +00-13-95 (hex) congatec AG +00-13-96 (hex) Acbel Polytech Inc. +00-13-97 (hex) Xsigo Systems, Inc. +00-13-98 (hex) TrafficSim Co.,Ltd +00-13-99 (hex) STAC Corporation. +00-13-9A (hex) K-ubique ID Corp. +00-13-9B (hex) ioIMAGE Ltd. +00-13-9C (hex) Exavera Technologies, Inc. +00-13-9D (hex) Design of Systems on Silicon S.A. +00-13-9E (hex) Ciara Technologies Inc. +00-13-9F (hex) Electronics Design Services, Co., Ltd. +00-13-A0 (hex) ALGOSYSTEM Co., Ltd. +00-13-A1 (hex) Crow Electronic Engeneering +00-13-A2 (hex) MaxStream, Inc +00-13-A3 (hex) Siemens Com CPE Devices +00-13-A4 (hex) KeyEye Communications +00-13-A5 (hex) General Solutions, LTD. +00-13-A6 (hex) Extricom Ltd +00-13-A7 (hex) BATTELLE MEMORIAL INSTITUTE +00-13-A8 (hex) Tanisys Technology +00-13-A9 (hex) Sony Corporation +00-13-AA (hex) ALS & TEC Ltd. +00-13-AB (hex) Telemotive AG +00-13-AC (hex) Sunmyung Electronics Co., LTD +00-13-AD (hex) Sendo Ltd +00-13-AE (hex) Radiance Technologies, Inc. +00-13-AF (hex) NUMA Technology,Inc. +00-13-B0 (hex) Jablotron +00-13-B1 (hex) Intelligent Control Systems (Asia) Pte Ltd +00-13-B2 (hex) Carallon Limited +00-13-B3 (hex) Ecom Communications Technology Co., Ltd. +00-13-B4 (hex) Appear TV +00-13-B5 (hex) Wavesat +00-13-B6 (hex) Sling Media, Inc. +00-13-B7 (hex) Scantech ID +00-13-B8 (hex) RyCo Electronic Systems Limited +00-13-B9 (hex) BM SPA +00-13-BA (hex) ReadyLinks Inc +00-13-BB (hex) Smartvue Corporation +00-13-BC (hex) Artimi Ltd +00-13-BD (hex) HYMATOM SA +00-13-BE (hex) Virtual Conexions +00-13-BF (hex) Media System Planning Corp. +00-13-C0 (hex) Trix Tecnologia Ltda. +00-13-C1 (hex) Asoka USA Corporation +00-13-C2 (hex) WACOM Co.,Ltd +00-13-C3 (hex) Cisco Systems +00-13-C4 (hex) Cisco Systems +00-13-C5 (hex) LIGHTRON FIBER-OPTIC DEVICES INC. +00-13-C6 (hex) OpenGear, Inc +00-13-C7 (hex) IONOS Co.,Ltd. +00-13-C8 (hex) PIRELLI BROADBAND SOLUTIONS S.P.A. +00-13-C9 (hex) Beyond Achieve Enterprises Ltd. +00-13-CA (hex) X-Digital Systems, Inc. +00-13-CB (hex) Zenitel Norway AS +00-13-CC (hex) Tall Maple Systems +00-13-CD (hex) MTI co. LTD +00-13-CE (hex) Intel Corporate +00-13-CF (hex) 4Access Communications +00-13-D0 (hex) t+ Medical Ltd +00-13-D1 (hex) KIRK telecom A/S +00-13-D2 (hex) PAGE IBERICA, S.A. +00-13-D3 (hex) MICRO-STAR INTERNATIONAL CO., LTD. +00-13-D4 (hex) ASUSTek COMPUTER INC. +00-13-D5 (hex) WiNetworks LTD +00-13-D6 (hex) TII NETWORK TECHNOLOGIES, INC. +00-13-D7 (hex) SPIDCOM Technologies SA +00-13-D8 (hex) Princeton Instruments +00-13-D9 (hex) Matrix Product Development, Inc. +00-13-DA (hex) Diskware Co., Ltd +00-13-DB (hex) SHOEI Electric Co.,Ltd +00-13-DC (hex) IBTEK INC. +00-13-DD (hex) Abbott Diagnostics +00-13-DE (hex) Adapt4, LLC +00-13-DF (hex) Ryvor Corp. +00-13-E0 (hex) Murata Manufacturing Co., Ltd. +00-13-E1 (hex) Iprobe AB +00-13-E2 (hex) GeoVision Inc. +00-13-E3 (hex) CoVi Technologies, Inc. +00-13-E4 (hex) YANGJAE SYSTEMS CORP. +00-13-E5 (hex) TENOSYS, INC. +00-13-E6 (hex) Technolution +00-13-E7 (hex) Halcro +00-13-E8 (hex) Intel Corporate +00-13-E9 (hex) VeriWave, Inc. +00-13-EA (hex) Kamstrup A/S +00-13-EB (hex) Sysmaster Corporation +00-13-EC (hex) Sunbay Software AG +00-13-ED (hex) PSIA +00-13-EE (hex) JBX Designs Inc. +00-13-EF (hex) Kingjon Digital Technology Co.,Ltd +00-13-F0 (hex) Wavefront Semiconductor +00-13-F1 (hex) AMOD Technology Co., Ltd. +00-13-F2 (hex) Klas Ltd +00-13-F3 (hex) Giga-byte Communications Inc. +00-13-F4 (hex) Psitek (Pty) Ltd +00-13-F5 (hex) Akimbi Systems +00-13-F6 (hex) Cintech +00-13-F7 (hex) SMC Networks, Inc. +00-13-F8 (hex) Dex Security Solutions +00-13-F9 (hex) Cavera Systems +00-13-FA (hex) LifeSize Communications, Inc +00-13-FB (hex) RKC INSTRUMENT INC. +00-13-FC (hex) SiCortex, Inc +00-13-FD (hex) Nokia Danmark A/S +00-13-FE (hex) GRANDTEC ELECTRONIC CORP. +00-13-FF (hex) Dage-MTI of MC, Inc. +00-14-00 (hex) MINERVA KOREA CO., LTD +00-14-01 (hex) Rivertree Networks Corp. +00-14-02 (hex) kk-electronic a/s +00-14-03 (hex) Renasis, LLC +00-14-04 (hex) Motorola CHS +00-14-05 (hex) OpenIB, Inc. +00-14-06 (hex) Go Networks +00-14-07 (hex) Sperian Protection Instrumentation +00-14-08 (hex) Eka Systems Inc. +00-14-09 (hex) MAGNETI MARELLI S.E. S.p.A. +00-14-0A (hex) WEPIO Co., Ltd. +00-14-0B (hex) FIRST INTERNATIONAL COMPUTER, INC. +00-14-0C (hex) GKB CCTV CO., LTD. +00-14-0D (hex) Nortel +00-14-0E (hex) Nortel +00-14-0F (hex) Federal State Unitary Enterprise Leningrad R&D Institute of +00-14-10 (hex) Suzhou Keda Technology CO.,Ltd +00-14-11 (hex) Deutschmann Automation GmbH & Co. KG +00-14-12 (hex) S-TEC electronics AG +00-14-13 (hex) Trebing & Himstedt Prozessautomation GmbH & Co. KG +00-14-14 (hex) Jumpnode Systems LLC. +00-14-15 (hex) Intec Automation Inc. +00-14-16 (hex) Scosche Industries, Inc. +00-14-17 (hex) RSE Informations Technologie GmbH +00-14-18 (hex) C4Line +00-14-19 (hex) SIDSA +00-14-1A (hex) DEICY CORPORATION +00-14-1B (hex) Cisco Systems +00-14-1C (hex) Cisco Systems +00-14-1D (hex) Lust Antriebstechnik GmbH +00-14-1E (hex) P.A. Semi, Inc. +00-14-1F (hex) SunKwang Electronics Co., Ltd +00-14-20 (hex) G-Links networking company +00-14-21 (hex) Total Wireless Technologies Pte. Ltd. +00-14-22 (hex) Dell Inc. +00-14-23 (hex) J-S Co. NEUROCOM +00-14-24 (hex) Merry Electrics CO., LTD. +00-14-25 (hex) Galactic Computing Corp. +00-14-26 (hex) NL Technology +00-14-27 (hex) JazzMutant +00-14-28 (hex) Vocollect, Inc +00-14-29 (hex) V Center Technologies Co., Ltd. +00-14-2A (hex) Elitegroup Computer System Co., Ltd +00-14-2B (hex) Edata Communication Inc. +00-14-2C (hex) Koncept International, Inc. +00-14-2D (hex) Toradex AG +00-14-2E (hex) 77 Elektronika Kft. +00-14-2F (hex) WildPackets +00-14-30 (hex) ViPowER, Inc +00-14-31 (hex) PDL Electronics Ltd +00-14-32 (hex) Tarallax Wireless, Inc. +00-14-33 (hex) Empower Technologies(Canada) Inc. +00-14-34 (hex) Keri Systems, Inc +00-14-35 (hex) CityCom Corp. +00-14-36 (hex) Qwerty Elektronik AB +00-14-37 (hex) GSTeletech Co.,Ltd. +00-14-38 (hex) Hewlett Packard +00-14-39 (hex) Blonder Tongue Laboratories, Inc. +00-14-3A (hex) RAYTALK INTERNATIONAL SRL +00-14-3B (hex) Sensovation AG +00-14-3C (hex) Rheinmetall Canada Inc. +00-14-3D (hex) Aevoe Inc. +00-14-3E (hex) AirLink Communications, Inc. +00-14-3F (hex) Hotway Technology Corporation +00-14-40 (hex) ATOMIC Corporation +00-14-41 (hex) Innovation Sound Technology Co., LTD. +00-14-42 (hex) ATTO CORPORATION +00-14-43 (hex) Consultronics Europe Ltd +00-14-44 (hex) Grundfos Electronics +00-14-45 (hex) Telefon-Gradnja d.o.o. +00-14-46 (hex) SuperVision Solutions LLC +00-14-47 (hex) BOAZ Inc. +00-14-48 (hex) Inventec Multimedia & Telecom Corporation +00-14-49 (hex) Sichuan Changhong Electric Ltd. +00-14-4A (hex) Taiwan Thick-Film Ind. Corp. +00-14-4B (hex) Hifn, Inc. +00-14-4C (hex) General Meters Corp. +00-14-4D (hex) Intelligent Systems +00-14-4E (hex) SRISA +00-14-4F (hex) Sun Microsystems, Inc. +00-14-50 (hex) Heim Systems GmbH +00-14-51 (hex) Apple Computer Inc. +00-14-52 (hex) CALCULEX,INC. +00-14-53 (hex) ADVANTECH TECHNOLOGIES CO.,LTD +00-14-54 (hex) Symwave +00-14-55 (hex) Coder Electronics Corporation +00-14-56 (hex) Edge Products +00-14-57 (hex) T-VIPS AS +00-14-58 (hex) HS Automatic ApS +00-14-59 (hex) Moram Co., Ltd. +00-14-5A (hex) Neratec AG +00-14-5B (hex) SeekerNet Inc. +00-14-5C (hex) Intronics B.V. +00-14-5D (hex) WJ Communications, Inc. +00-14-5E (hex) IBM +00-14-5F (hex) ADITEC CO. LTD +00-14-60 (hex) Kyocera Wireless Corp. +00-14-61 (hex) CORONA CORPORATION +00-14-62 (hex) Digiwell Technology, inc +00-14-63 (hex) IDCS N.V. +00-14-64 (hex) Cryptosoft +00-14-65 (hex) Novo Nordisk A/S +00-14-66 (hex) Kleinhenz Elektronik GmbH +00-14-67 (hex) ArrowSpan Inc. +00-14-68 (hex) CelPlan International, Inc. +00-14-69 (hex) Cisco Systems +00-14-6A (hex) Cisco Systems +00-14-6B (hex) Anagran, Inc. +00-14-6C (hex) Netgear Inc. +00-14-6D (hex) RF Technologies +00-14-6E (hex) H. Stoll GmbH & Co. KG +00-14-6F (hex) Kohler Co +00-14-70 (hex) Prokom Software SA +00-14-71 (hex) Eastern Asia Technology Limited +00-14-72 (hex) China Broadband Wireless IP Standard Group +00-14-73 (hex) Bookham Inc +00-14-74 (hex) K40 Electronics +00-14-75 (hex) Wiline Networks, Inc. +00-14-76 (hex) MultiCom Industries Limited +00-14-77 (hex) Nertec Inc. +00-14-78 (hex) ShenZhen TP-LINK Technologies Co., Ltd. +00-14-79 (hex) NEC Magnus Communications,Ltd. +00-14-7A (hex) Eubus GmbH +00-14-7B (hex) Iteris, Inc. +00-14-7C (hex) 3Com Ltd +00-14-7D (hex) Aeon Digital International +00-14-7E (hex) InnerWireless +00-14-7F (hex) Thomson Telecom Belgium +00-14-80 (hex) Hitachi-LG Data Storage Korea, Inc +00-14-81 (hex) Multilink Inc +00-14-82 (hex) GoBackTV, Inc +00-14-83 (hex) eXS Inc. +00-14-84 (hex) Cermate Technologies Inc. +00-14-85 (hex) Giga-Byte +00-14-86 (hex) Echo Digital Audio Corporation +00-14-87 (hex) American Technology Integrators +00-14-88 (hex) Akorri +00-14-89 (hex) B15402100 - JANDEI, S.L. +00-14-8A (hex) Elin Ebg Traction Gmbh +00-14-8B (hex) Globo Electronic GmbH & Co. KG +00-14-8C (hex) Fortress Technologies +00-14-8D (hex) Cubic Defense Simulation Systems +00-14-8E (hex) Tele Power Inc. +00-14-8F (hex) Protronic (Far East) Ltd. +00-14-90 (hex) ASP Corporation +00-14-91 (hex) Daniels Electronics Ltd. +00-14-92 (hex) Liteon, Mobile Media Solution SBU +00-14-93 (hex) Systimax Solutions +00-14-94 (hex) ESU AG +00-14-95 (hex) 2Wire, Inc. +00-14-96 (hex) Phonic Corp. +00-14-97 (hex) ZHIYUAN Eletronics co.,ltd. +00-14-98 (hex) Viking Design Technology +00-14-99 (hex) Helicomm Inc +00-14-9A (hex) Motorola Mobile Devices Business +00-14-9B (hex) Nokota Communications, LLC +00-14-9C (hex) HF Company +00-14-9D (hex) Sound ID Inc. +00-14-9E (hex) UbONE Co., Ltd +00-14-9F (hex) System and Chips, Inc. +00-14-A0 (hex) Accsense, Inc. +00-14-A1 (hex) Synchronous Communication Corp +00-14-A2 (hex) Core Micro Systems Inc. +00-14-A3 (hex) Vitelec BV +00-14-A4 (hex) Hon Hai Precision Ind. Co., Ltd. +00-14-A5 (hex) Gemtek Technology Co., Ltd. +00-14-A6 (hex) Teranetics, Inc. +00-14-A7 (hex) Nokia Danmark A/S +00-14-A8 (hex) Cisco Systems +00-14-A9 (hex) Cisco Systems +00-14-AA (hex) Ashly Audio, Inc. +00-14-AB (hex) Senhai Electronic Technology Co., Ltd. +00-14-AC (hex) Bountiful WiFi +00-14-AD (hex) Gassner Wiege- u. Meßtechnik GmbH +00-14-AE (hex) Wizlogics Co., Ltd. +00-14-AF (hex) Datasym Inc. +00-14-B0 (hex) Naeil Community +00-14-B1 (hex) Avitec AB +00-14-B2 (hex) mCubelogics Corporation +00-14-B3 (hex) CoreStar International Corp +00-14-B4 (hex) General Dynamics United Kingdom Ltd +00-14-B5 (hex) PHYSIOMETRIX,INC +00-14-B6 (hex) Enswer Technology Inc. +00-14-B7 (hex) AR Infotek Inc. +00-14-B8 (hex) Hill-Rom +00-14-B9 (hex) MSTAR SEMICONDUCTOR +00-14-BA (hex) Carvers SA de CV +00-14-BB (hex) Open Interface North America +00-14-BC (hex) SYNECTIC TELECOM EXPORTS PVT. LTD. +00-14-BD (hex) incNETWORKS, Inc +00-14-BE (hex) Wink communication technology CO.LTD +00-14-BF (hex) Cisco-Linksys LLC +00-14-C0 (hex) Symstream Technology Group Ltd +00-14-C1 (hex) U.S. Robotics Corporation +00-14-C2 (hex) Hewlett Packard +00-14-C3 (hex) Seagate Technology LLC +00-14-C4 (hex) Vitelcom Mobile Technology +00-14-C5 (hex) Alive Technologies Pty Ltd +00-14-C6 (hex) Quixant Ltd +00-14-C7 (hex) Nortel +00-14-C8 (hex) Contemporary Research Corp +00-14-C9 (hex) Brocade Communications Systems, Inc. +00-14-CA (hex) Key Radio Systems Limited +00-14-CB (hex) LifeSync Corporation +00-14-CC (hex) Zetec, Inc. +00-14-CD (hex) DigitalZone Co., Ltd. +00-14-CE (hex) NF CORPORATION +00-14-CF (hex) Nextlink.to A/S +00-14-D0 (hex) BTI Systems Inc. +00-14-D1 (hex) TRENDnet +00-14-D2 (hex) KYUKI CORPORATION +00-14-D3 (hex) SEPSA +00-14-D4 (hex) K Technology Corporation +00-14-D5 (hex) Datang Telecom Technology CO. , LCD,Optical Communication Br +00-14-D6 (hex) Jeongmin Electronics Co.,Ltd. +00-14-D7 (hex) Datastore Technology Corp +00-14-D8 (hex) bio-logic SA +00-14-D9 (hex) IP Fabrics, Inc. +00-14-DA (hex) Huntleigh Healthcare +00-14-DB (hex) Elma Trenew Electronic GmbH +00-14-DC (hex) Communication System Design & Manufacturing (CSDM) +00-14-DD (hex) Covergence Inc. +00-14-DE (hex) Sage Instruments Inc. +00-14-DF (hex) HI-P Tech Corporation +00-14-E0 (hex) LET'S Corporation +00-14-E1 (hex) Data Display AG +00-14-E2 (hex) datacom systems inc. +00-14-E3 (hex) mm-lab GmbH +00-14-E4 (hex) Integral Technologies +00-14-E5 (hex) Alticast +00-14-E6 (hex) AIM Infrarotmodule GmbH +00-14-E7 (hex) Stolinx,. Inc +00-14-E8 (hex) Motorola CHS +00-14-E9 (hex) Nortech International +00-14-EA (hex) S Digm Inc. (Safe Paradigm Inc.) +00-14-EB (hex) AwarePoint Corporation +00-14-EC (hex) Acro Telecom +00-14-ED (hex) Airak, Inc. +00-14-EE (hex) Western Digital Technologies, Inc. +00-14-EF (hex) TZero Technologies, Inc. +00-14-F0 (hex) Business Security OL AB +00-14-F1 (hex) Cisco Systems +00-14-F2 (hex) Cisco Systems +00-14-F3 (hex) ViXS Systems Inc +00-14-F4 (hex) DekTec Digital Video B.V. +00-14-F5 (hex) OSI Security Devices +00-14-F6 (hex) Juniper Networks, Inc. +00-14-F7 (hex) Crevis +00-14-F8 (hex) Scientific Atlanta +00-14-F9 (hex) Vantage Controls +00-14-FA (hex) AsGa S.A. +00-14-FB (hex) Technical Solutions Inc. +00-14-FC (hex) Extandon, Inc. +00-14-FD (hex) Thecus Technology Corp. +00-14-FE (hex) Artech Electronics +00-14-FF (hex) Precise Automation, Inc. +00-15-00 (hex) Intel Corporate +00-15-01 (hex) LexBox +00-15-02 (hex) BETA tech +00-15-03 (hex) PROFIcomms s.r.o. +00-15-04 (hex) GAME PLUS CO., LTD. +00-15-05 (hex) Actiontec Electronics, Inc +00-15-06 (hex) Neo Photonics +00-15-07 (hex) Renaissance Learning Inc +00-15-08 (hex) Global Target Enterprise Inc +00-15-09 (hex) Plus Technology Co., Ltd +00-15-0A (hex) Sonoa Systems, Inc +00-15-0B (hex) SAGE INFOTECH LTD. +00-15-0C (hex) AVM GmbH +00-15-0D (hex) Hoana Medical, Inc. +00-15-0E (hex) OPENBRAIN TECHNOLOGIES CO., LTD. +00-15-0F (hex) mingjong +00-15-10 (hex) Techsphere Co., Ltd +00-15-11 (hex) Data Center Systems +00-15-12 (hex) Zurich University of Applied Sciences +00-15-13 (hex) EFS sas +00-15-14 (hex) Hu Zhou NAVA Networks&Electronics Ltd. +00-15-15 (hex) Leipold+Co.GmbH +00-15-16 (hex) URIEL SYSTEMS INC. +00-15-17 (hex) Intel Corporate +00-15-18 (hex) Shenzhen 10MOONS Technology Development CO.,Ltd +00-15-19 (hex) StoreAge Networking Technologies +00-15-1A (hex) Hunter Engineering Company +00-15-1B (hex) Isilon Systems Inc. +00-15-1C (hex) LENECO +00-15-1D (hex) M2I CORPORATION +00-15-1E (hex) Ethernet Powerlink Standardization Group (EPSG) +00-15-1F (hex) Multivision Intelligent Surveillance (Hong Kong) Ltd +00-15-20 (hex) Radiocrafts AS +00-15-21 (hex) Horoquartz +00-15-22 (hex) Dea Security +00-15-23 (hex) Meteor Communications Corporation +00-15-24 (hex) Numatics, Inc. +00-15-25 (hex) Chamberlain Access Solutions +00-15-26 (hex) Remote Technologies Inc +00-15-27 (hex) Balboa Instruments +00-15-28 (hex) Beacon Medical Products LLC d.b.a. BeaconMedaes +00-15-29 (hex) N3 Corporation +00-15-2A (hex) Nokia GmbH +00-15-2B (hex) Cisco Systems +00-15-2C (hex) Cisco Systems +00-15-2D (hex) TenX Networks, LLC +00-15-2E (hex) PacketHop, Inc. +00-15-2F (hex) Motorola CHS +00-15-30 (hex) Bus-Tech, Inc. +00-15-31 (hex) KOCOM +00-15-32 (hex) Consumer Technologies Group, LLC +00-15-33 (hex) NADAM.CO.,LTD +00-15-34 (hex) A BELTRÓNICA, Companhia de Comunicações, Lda +00-15-35 (hex) OTE Spa +00-15-36 (hex) Powertech co.,Ltd +00-15-37 (hex) Ventus Networks +00-15-38 (hex) RFID, Inc. +00-15-39 (hex) Technodrive SRL +00-15-3A (hex) Shenzhen Syscan Technology Co.,Ltd. +00-15-3B (hex) EMH Elektrizitätszähler GmbH & CoKG +00-15-3C (hex) Kprotech Co., Ltd. +00-15-3D (hex) ELIM PRODUCT CO. +00-15-3E (hex) Q-Matic Sweden AB +00-15-3F (hex) Alcatel Alenia Space Italia +00-15-40 (hex) Nortel +00-15-41 (hex) StrataLight Communications, Inc. +00-15-42 (hex) MICROHARD S.R.L. +00-15-43 (hex) Aberdeen Test Center +00-15-44 (hex) coM.s.a.t. AG +00-15-45 (hex) SEECODE Co., Ltd. +00-15-46 (hex) ITG Worldwide Sdn Bhd +00-15-47 (hex) AiZen Solutions Inc. +00-15-48 (hex) CUBE TECHNOLOGIES +00-15-49 (hex) Dixtal Biomedica Ind. Com. Ltda +00-15-4A (hex) WANSHIH ELECTRONIC CO., LTD +00-15-4B (hex) Wonde Proud Technology Co., Ltd +00-15-4C (hex) Saunders Electronics +00-15-4D (hex) Netronome Systems, Inc. +00-15-4E (hex) IEC +00-15-4F (hex) one RF Technology +00-15-50 (hex) Nits Technology Inc +00-15-51 (hex) RadioPulse Inc. +00-15-52 (hex) Wi-Gear Inc. +00-15-53 (hex) Cytyc Corporation +00-15-54 (hex) Atalum Wireless S.A. +00-15-55 (hex) DFM GmbH +00-15-56 (hex) SAGEM COMMUNICATION +00-15-57 (hex) Olivetti +00-15-58 (hex) FOXCONN +00-15-59 (hex) Securaplane Technologies, Inc. +00-15-5A (hex) DAINIPPON PHARMACEUTICAL CO., LTD. +00-15-5B (hex) Sampo Corporation +00-15-5C (hex) Dresser Wayne +00-15-5D (hex) Microsoft Corporation +00-15-5E (hex) Morgan Stanley +00-15-5F (hex) GreenPeak Technologies +00-15-60 (hex) Hewlett Packard +00-15-61 (hex) JJPlus Corporation +00-15-62 (hex) Cisco Systems +00-15-63 (hex) Cisco Systems +00-15-64 (hex) BEHRINGER Spezielle Studiotechnik GmbH +00-15-65 (hex) XIAMEN YEALINK NETWORK TECHNOLOGY CO.,LTD +00-15-66 (hex) A-First Technology Co., Ltd. +00-15-67 (hex) RADWIN Inc. +00-15-68 (hex) Dilithium Networks +00-15-69 (hex) PECO II, Inc. +00-15-6A (hex) DG2L Technologies Pvt. Ltd. +00-15-6B (hex) Perfisans Networks Corp. +00-15-6C (hex) SANE SYSTEM CO., LTD +00-15-6D (hex) Ubiquiti Networks Inc. +00-15-6E (hex) A. W. Communication Systems Ltd +00-15-6F (hex) Xiranet Communications GmbH +00-15-70 (hex) Symbol TechnologiesWholly owned Subsidiary of Motorola +00-15-71 (hex) Nolan Systems +00-15-72 (hex) Red-Lemon +00-15-73 (hex) NewSoft Technology Corporation +00-15-74 (hex) Horizon Semiconductors Ltd. +00-15-75 (hex) Nevis Networks Inc. +00-15-76 (hex) scil animal care company GmbH +00-15-77 (hex) Allied Telesis +00-15-78 (hex) Audio / Video Innovations +00-15-79 (hex) Lunatone Industrielle Elektronik GmbH +00-15-7A (hex) Telefin S.p.A. +00-15-7B (hex) Leuze electronic GmbH + Co. KG +00-15-7C (hex) Dave Networks, Inc. +00-15-7D (hex) POSDATA CO., LTD. +00-15-7E (hex) HEYFRA ELECTRONIC gmbH +00-15-7F (hex) ChuanG International Holding CO.,LTD. +00-15-80 (hex) U-WAY CORPORATION +00-15-81 (hex) MAKUS Inc. +00-15-82 (hex) TVonics Ltd +00-15-83 (hex) IVT corporation +00-15-84 (hex) Schenck Process GmbH +00-15-85 (hex) Aonvision Technolopy Corp. +00-15-86 (hex) Xiamen Overseas Chinese Electronic Co., Ltd. +00-15-87 (hex) Takenaka Seisakusho Co.,Ltd +00-15-88 (hex) Balda-Thong Fook Solutions Sdn. Bhd. +00-15-89 (hex) D-MAX Technology Co.,Ltd +00-15-8A (hex) SURECOM Technology Corp. +00-15-8B (hex) Park Air Systems Ltd +00-15-8C (hex) Liab ApS +00-15-8D (hex) Jennic Ltd +00-15-8E (hex) Plustek.INC +00-15-8F (hex) NTT Advanced Technology Corporation +00-15-90 (hex) Hectronic GmbH +00-15-91 (hex) RLW Inc. +00-15-92 (hex) Facom UK Ltd (Melksham) +00-15-93 (hex) U4EA Technologies Inc. +00-15-94 (hex) BIXOLON CO.,LTD +00-15-95 (hex) Quester Tangent Corporation +00-15-96 (hex) ARRIS International +00-15-97 (hex) AETA AUDIO SYSTEMS +00-15-98 (hex) Kolektor group +00-15-99 (hex) Samsung Electronics Co., LTD +00-15-9A (hex) Motorola CHS +00-15-9B (hex) Nortel +00-15-9C (hex) B-KYUNG SYSTEM Co.,Ltd. +00-15-9D (hex) Minicom Advanced Systems ltd +00-15-9E (hex) Mad Catz Interactive Inc +00-15-9F (hex) Terascala, Inc. +00-15-A0 (hex) Nokia Danmark A/S +00-15-A1 (hex) ECA-SINTERS +00-15-A2 (hex) ARRIS International +00-15-A3 (hex) ARRIS International +00-15-A4 (hex) ARRIS International +00-15-A5 (hex) DCI Co., Ltd. +00-15-A6 (hex) Digital Electronics Products Ltd. +00-15-A7 (hex) Robatech AG +00-15-A8 (hex) Motorola Mobile Devices +00-15-A9 (hex) KWANG WOO I&C CO.,LTD +00-15-AA (hex) Rextechnik International Co., +00-15-AB (hex) PRO CO SOUND INC +00-15-AC (hex) Capelon AB +00-15-AD (hex) Accedian Networks +00-15-AE (hex) kyung il +00-15-AF (hex) AzureWave Technologies, Inc. +00-15-B0 (hex) AUTOTELENET CO.,LTD +00-15-B1 (hex) Ambient Corporation +00-15-B2 (hex) Advanced Industrial Computer, Inc. +00-15-B3 (hex) Caretech AB +00-15-B4 (hex) Polymap Wireless LLC +00-15-B5 (hex) CI Network Corp. +00-15-B6 (hex) ShinMaywa Industries, Ltd. +00-15-B7 (hex) Toshiba +00-15-B8 (hex) Tahoe +00-15-B9 (hex) Samsung Electronics Co., Ltd. +00-15-BA (hex) iba AG +00-15-BB (hex) SMA Solar Technology AG +00-15-BC (hex) Develco +00-15-BD (hex) Group 4 Technology Ltd +00-15-BE (hex) Iqua Ltd. +00-15-BF (hex) technicob +00-15-C0 (hex) DIGITAL TELEMEDIA CO.,LTD. +00-15-C1 (hex) SONY Computer Entertainment inc, +00-15-C2 (hex) 3M Germany +00-15-C3 (hex) Ruf Telematik AG +00-15-C4 (hex) FLOVEL CO., LTD. +00-15-C5 (hex) Dell Inc +00-15-C6 (hex) Cisco Systems +00-15-C7 (hex) Cisco Systems +00-15-C8 (hex) FlexiPanel Ltd +00-15-C9 (hex) Gumstix, Inc +00-15-CA (hex) TeraRecon, Inc. +00-15-CB (hex) Surf Communication Solutions Ltd. +00-15-CC (hex) TEPCO UQUEST, LTD. +00-15-CD (hex) Exartech International Corp. +00-15-CE (hex) ARRIS International +00-15-CF (hex) ARRIS International +00-15-D0 (hex) ARRIS International +00-15-D1 (hex) ARRIS Group, Inc. +00-15-D2 (hex) Xantech Corporation +00-15-D3 (hex) Pantech&Curitel Communications, Inc. +00-15-D4 (hex) Emitor AB +00-15-D5 (hex) NICEVT +00-15-D6 (hex) OSLiNK Sp. z o.o. +00-15-D7 (hex) Reti Corporation +00-15-D8 (hex) Interlink Electronics +00-15-D9 (hex) PKC Electronics Oy +00-15-DA (hex) IRITEL A.D. +00-15-DB (hex) Canesta Inc. +00-15-DC (hex) KT&C Co., Ltd. +00-15-DD (hex) IP Control Systems Ltd. +00-15-DE (hex) Nokia Danmark A/S +00-15-DF (hex) Clivet S.p.A. +00-15-E0 (hex) ST-Ericsson +00-15-E1 (hex) picoChip Designs Ltd +00-15-E2 (hex) Dr.Ing. Herbert Knauer GmbH +00-15-E3 (hex) Dream Technologies Corporation +00-15-E4 (hex) Zimmer Elektromedizin +00-15-E5 (hex) Cheertek Inc. +00-15-E6 (hex) MOBILE TECHNIKA Inc. +00-15-E7 (hex) Quantec ProAudio +00-15-E8 (hex) Nortel +00-15-E9 (hex) D-Link Corporation +00-15-EA (hex) Tellumat (Pty) Ltd +00-15-EB (hex) ZTE CORPORATION +00-15-EC (hex) Boca Devices LLC +00-15-ED (hex) Fulcrum Microsystems, Inc. +00-15-EE (hex) Omnex Control Systems +00-15-EF (hex) NEC TOKIN Corporation +00-15-F0 (hex) EGO BV +00-15-F1 (hex) KYLINK Communications Corp. +00-15-F2 (hex) ASUSTek COMPUTER INC. +00-15-F3 (hex) PELTOR AB +00-15-F4 (hex) Eventide +00-15-F5 (hex) Sustainable Energy Systems +00-15-F6 (hex) SCIENCE AND ENGINEERING SERVICES, INC. +00-15-F7 (hex) Wintecronics Ltd. +00-15-F8 (hex) Kingtronics Industrial Co. Ltd. +00-15-F9 (hex) Cisco Systems +00-15-FA (hex) Cisco Systems +00-15-FB (hex) setex schermuly textile computer gmbh +00-15-FC (hex) Littelfuse Startco +00-15-FD (hex) Complete Media Systems +00-15-FE (hex) SCHILLING ROBOTICS LLC +00-15-FF (hex) Novatel Wireless, Inc. +00-16-00 (hex) CelleBrite Mobile Synchronization +00-16-01 (hex) Buffalo Inc. +00-16-02 (hex) CEYON TECHNOLOGY CO.,LTD. +00-16-03 (hex) COOLKSKY Co., LTD +00-16-04 (hex) Sigpro +00-16-05 (hex) YORKVILLE SOUND INC. +00-16-06 (hex) Ideal Industries +00-16-07 (hex) Curves International Inc. +00-16-08 (hex) Sequans Communications +00-16-09 (hex) Unitech electronics co., ltd. +00-16-0A (hex) SWEEX Europe BV +00-16-0B (hex) TVWorks LLC +00-16-0C (hex) LPL DEVELOPMENT S.A. DE C.V +00-16-0D (hex) Be Here Corporation +00-16-0E (hex) Optica Technologies Inc. +00-16-0F (hex) BADGER METER INC +00-16-10 (hex) Carina Technology +00-16-11 (hex) Altecon Srl +00-16-12 (hex) Otsuka Electronics Co., Ltd. +00-16-13 (hex) LibreStream Technologies Inc. +00-16-14 (hex) Picosecond Pulse Labs +00-16-15 (hex) Nittan Company, Limited +00-16-16 (hex) BROWAN COMMUNICATION INC. +00-16-17 (hex) MSI +00-16-18 (hex) HIVION Co., Ltd. +00-16-19 (hex) La Factoría de Comunicaciones Aplicadas,S.L. +00-16-1A (hex) Dametric AB +00-16-1B (hex) Micronet Corporation +00-16-1C (hex) e:cue +00-16-1D (hex) Innovative Wireless Technologies, Inc. +00-16-1E (hex) Woojinnet +00-16-1F (hex) SUNWAVETEC Co., Ltd. +00-16-20 (hex) Sony Ericsson Mobile Communications AB +00-16-21 (hex) Colorado Vnet +00-16-22 (hex) BBH SYSTEMS GMBH +00-16-23 (hex) Interval Media +00-16-24 (hex) Teneros, Inc. +00-16-25 (hex) Impinj, Inc. +00-16-26 (hex) Motorola CHS +00-16-27 (hex) embedded-logic DESIGN AND MORE GmbH +00-16-28 (hex) Ultra Electronics Manufacturing and Card Systems +00-16-29 (hex) Nivus GmbH +00-16-2A (hex) Antik computers & communications s.r.o. +00-16-2B (hex) Togami Electric Mfg.co.,Ltd. +00-16-2C (hex) Xanboo +00-16-2D (hex) STNet Co., Ltd. +00-16-2E (hex) Space Shuttle Hi-Tech Co., Ltd. +00-16-2F (hex) Geutebrück GmbH +00-16-30 (hex) Vativ Technologies +00-16-31 (hex) Xteam +00-16-32 (hex) SAMSUNG ELECTRONICS CO., LTD. +00-16-33 (hex) Oxford Diagnostics Ltd. +00-16-34 (hex) Mathtech, Inc. +00-16-35 (hex) Hewlett Packard +00-16-36 (hex) Quanta Computer Inc. +00-16-37 (hex) Citel Srl +00-16-38 (hex) TECOM Co., Ltd. +00-16-39 (hex) UBIQUAM Co.,Ltd +00-16-3A (hex) YVES TECHNOLOGY CO., LTD. +00-16-3B (hex) VertexRSI/General Dynamics +00-16-3C (hex) Rebox B.V. +00-16-3D (hex) Tsinghua Tongfang Legend Silicon Tech. Co., Ltd. +00-16-3E (hex) Xensource, Inc. +00-16-3F (hex) CReTE SYSTEMS Inc. +00-16-40 (hex) Asmobile Communication Inc. +00-16-41 (hex) USI +00-16-42 (hex) Pangolin +00-16-43 (hex) Sunhillo Corporation +00-16-44 (hex) LITE-ON Technology Corp. +00-16-45 (hex) Power Distribution, Inc. +00-16-46 (hex) Cisco Systems +00-16-47 (hex) Cisco Systems +00-16-48 (hex) SSD Company Limited +00-16-49 (hex) SetOne GmbH +00-16-4A (hex) Vibration Technology Limited +00-16-4B (hex) Quorion Data Systems GmbH +00-16-4C (hex) PLANET INT Co., Ltd +00-16-4D (hex) Alcatel North America IP Division +00-16-4E (hex) Nokia Danmark A/S +00-16-4F (hex) World Ethnic Broadcastin Inc. +00-16-50 (hex) Herley General Microwave Israel. +00-16-51 (hex) Exeo Systems +00-16-52 (hex) Hoatech Technologies, Inc. +00-16-53 (hex) LEGO System A/S IE Electronics Division +00-16-54 (hex) Flex-P Industries Sdn. Bhd. +00-16-55 (hex) FUHO TECHNOLOGY Co., LTD +00-16-56 (hex) Nintendo Co., Ltd. +00-16-57 (hex) Aegate Ltd +00-16-58 (hex) Fusiontech Technologies Inc. +00-16-59 (hex) Z.M.P. RADWAG +00-16-5A (hex) Harman Specialty Group +00-16-5B (hex) Grip Audio +00-16-5C (hex) Trackflow Ltd +00-16-5D (hex) AirDefense, Inc. +00-16-5E (hex) Precision I/O +00-16-5F (hex) Fairmount Automation +00-16-60 (hex) Nortel +00-16-61 (hex) Novatium Solutions (P) Ltd +00-16-62 (hex) Liyuh Technology Ltd. +00-16-63 (hex) KBT Mobile +00-16-64 (hex) Prod-El SpA +00-16-65 (hex) Cellon France +00-16-66 (hex) Quantier Communication Inc. +00-16-67 (hex) A-TEC Subsystem INC. +00-16-68 (hex) Eishin Electronics +00-16-69 (hex) MRV Communication (Networks) LTD +00-16-6A (hex) TPS +00-16-6B (hex) Samsung Electronics +00-16-6C (hex) Samsung Electonics Digital Video System Division +00-16-6D (hex) Yulong Computer Telecommunication Scientific(shenzhen)Co.,Lt +00-16-6E (hex) Arbitron Inc. +00-16-6F (hex) Intel Corporation +00-16-70 (hex) SKNET Corporation +00-16-71 (hex) Symphox Information Co. +00-16-72 (hex) Zenway enterprise ltd +00-16-73 (hex) Bury GmbH & Co. KG +00-16-74 (hex) EuroCB (Phils.), Inc. +00-16-75 (hex) Motorola MDb +00-16-76 (hex) Intel Corporation +00-16-77 (hex) Bihl+Wiedemann GmbH +00-16-78 (hex) SHENZHEN BAOAN GAOKE ELECTRONICS CO., LTD +00-16-79 (hex) eOn Communications +00-16-7A (hex) Skyworth Overseas Dvelopment Ltd. +00-16-7B (hex) Haver&Boecker +00-16-7C (hex) iRex Technologies BV +00-16-7D (hex) Sky-Line Information Co., Ltd. +00-16-7E (hex) DIBOSS.CO.,LTD +00-16-7F (hex) Bluebird Soft Inc. +00-16-80 (hex) Bally Gaming + Systems +00-16-81 (hex) Vector Informatik GmbH +00-16-82 (hex) Pro Dex, Inc +00-16-83 (hex) WEBIO International Co.,.Ltd. +00-16-84 (hex) Donjin Co.,Ltd. +00-16-85 (hex) Elisa Oyj +00-16-86 (hex) Karl Storz Imaging +00-16-87 (hex) Chubb CSC-Vendor AP +00-16-88 (hex) ServerEngines LLC +00-16-89 (hex) Pilkor Electronics Co., Ltd +00-16-8A (hex) id-Confirm Inc +00-16-8B (hex) Paralan Corporation +00-16-8C (hex) DSL Partner AS +00-16-8D (hex) KORWIN CO., Ltd. +00-16-8E (hex) Vimicro corporation +00-16-8F (hex) GN Netcom as +00-16-90 (hex) J-TEK INCORPORATION +00-16-91 (hex) Moser-Baer AG +00-16-92 (hex) Scientific-Atlanta, Inc. +00-16-93 (hex) PowerLink Technology Inc. +00-16-94 (hex) Sennheiser Communications A/S +00-16-95 (hex) AVC Technology Limited +00-16-96 (hex) QDI Technology (H.K.) Limited +00-16-97 (hex) NEC Corporation +00-16-98 (hex) T&A Mobile Phones +00-16-99 (hex) Tonic DVB Marketing Ltd +00-16-9A (hex) Quadrics Ltd +00-16-9B (hex) Alstom Transport +00-16-9C (hex) Cisco Systems +00-16-9D (hex) Cisco Systems +00-16-9E (hex) TV One Ltd +00-16-9F (hex) Vimtron Electronics Co., Ltd. +00-16-A0 (hex) Auto-Maskin +00-16-A1 (hex) 3Leaf Networks +00-16-A2 (hex) CentraLite Systems, Inc. +00-16-A3 (hex) Ingeteam Transmission&Distribution, S.A. +00-16-A4 (hex) Ezurio Ltd +00-16-A5 (hex) Tandberg Storage ASA +00-16-A6 (hex) Dovado FZ-LLC +00-16-A7 (hex) AWETA G&P +00-16-A8 (hex) CWT CO., LTD. +00-16-A9 (hex) 2EI +00-16-AA (hex) Kei Communication Technology Inc. +00-16-AB (hex) PBI-Dansensor A/S +00-16-AC (hex) Toho Technology Corp. +00-16-AD (hex) BT-Links Company Limited +00-16-AE (hex) INVENTEL +00-16-AF (hex) Shenzhen Union Networks Equipment Co.,Ltd. +00-16-B0 (hex) VK Corporation +00-16-B1 (hex) KBS +00-16-B2 (hex) DriveCam Inc +00-16-B3 (hex) Photonicbridges (China) Co., Ltd. +00-16-B4 (hex) PRIVATE +00-16-B5 (hex) Motorola CHS +00-16-B6 (hex) Cisco-Linksys +00-16-B7 (hex) Seoul Commtech +00-16-B8 (hex) Sony Ericsson Mobile Communications +00-16-B9 (hex) ProCurve Networking +00-16-BA (hex) WEATHERNEWS INC. +00-16-BB (hex) Law-Chain Computer Technology Co Ltd +00-16-BC (hex) Nokia Danmark A/S +00-16-BD (hex) ATI Industrial Automation +00-16-BE (hex) INFRANET, Inc. +00-16-BF (hex) PaloDEx Group Oy +00-16-C0 (hex) Semtech Corporation +00-16-C1 (hex) Eleksen Ltd +00-16-C2 (hex) Avtec Systems Inc +00-16-C3 (hex) BA Systems Inc +00-16-C4 (hex) SiRF Technology, Inc. +00-16-C5 (hex) Shenzhen Xing Feng Industry Co.,Ltd +00-16-C6 (hex) North Atlantic Industries +00-16-C7 (hex) Cisco Systems +00-16-C8 (hex) Cisco Systems +00-16-C9 (hex) NAT Seattle, Inc. +00-16-CA (hex) Nortel +00-16-CB (hex) Apple Computer +00-16-CC (hex) Xcute Mobile Corp. +00-16-CD (hex) HIJI HIGH-TECH CO., LTD. +00-16-CE (hex) Hon Hai Precision Ind. Co., Ltd. +00-16-CF (hex) Hon Hai Precision Ind. Co., Ltd. +00-16-D0 (hex) ATech elektronika d.o.o. +00-16-D1 (hex) ZAT a.s. +00-16-D2 (hex) Caspian +00-16-D3 (hex) Wistron Corporation +00-16-D4 (hex) Compal Communications, Inc. +00-16-D5 (hex) Synccom Co., Ltd +00-16-D6 (hex) TDA Tech Pty Ltd +00-16-D7 (hex) Sunways AG +00-16-D8 (hex) Senea AB +00-16-D9 (hex) NINGBO BIRD CO.,LTD. +00-16-DA (hex) Futronic Technology Co. Ltd. +00-16-DB (hex) Samsung Electronics Co., Ltd. +00-16-DC (hex) ARCHOS +00-16-DD (hex) Gigabeam Corporation +00-16-DE (hex) FAST Inc +00-16-DF (hex) Lundinova AB +00-16-E0 (hex) 3Com Ltd +00-16-E1 (hex) SiliconStor, Inc. +00-16-E2 (hex) American Fibertek, Inc. +00-16-E3 (hex) ASKEY COMPUTER CORP. +00-16-E4 (hex) VANGUARD SECURITY ENGINEERING CORP. +00-16-E5 (hex) FORDLEY DEVELOPMENT LIMITED +00-16-E6 (hex) GIGA-BYTE TECHNOLOGY CO.,LTD. +00-16-E7 (hex) Dynamix Promotions Limited +00-16-E8 (hex) Sigma Designs, Inc. +00-16-E9 (hex) Tiba Medical Inc +00-16-EA (hex) Intel Corporation +00-16-EB (hex) Intel Corporation +00-16-EC (hex) Elitegroup Computer Systems Co., Ltd. +00-16-ED (hex) Digital Safety Technologies, Inc +00-16-EE (hex) RoyalDigital Inc. +00-16-EF (hex) Koko Fitness, Inc. +00-16-F0 (hex) Dell +00-16-F1 (hex) OmniSense, LLC +00-16-F2 (hex) Dmobile System Co., Ltd. +00-16-F3 (hex) CAST Information Co., Ltd +00-16-F4 (hex) Eidicom Co., Ltd. +00-16-F5 (hex) Dalian Golden Hualu Digital Technology Co.,Ltd +00-16-F6 (hex) Video Products Group +00-16-F7 (hex) L-3 Communications, Electrodynamics, Inc. +00-16-F8 (hex) AVIQTECH TECHNOLOGY CO., LTD. +00-16-F9 (hex) CETRTA POT, d.o.o., Kranj +00-16-FA (hex) ECI Telecom Ltd. +00-16-FB (hex) SHENZHEN MTC CO.,LTD. +00-16-FC (hex) TOHKEN CO.,LTD. +00-16-FD (hex) Jaty Electronics +00-16-FE (hex) Alps Electric Co., Ltd +00-16-FF (hex) Wamin Optocomm Mfg Corp +00-17-00 (hex) Motorola MDb +00-17-01 (hex) KDE, Inc. +00-17-02 (hex) Osung Midicom Co., Ltd +00-17-03 (hex) MOSDAN Internation Co.,Ltd +00-17-04 (hex) Shinco Electronics Group Co.,Ltd +00-17-05 (hex) Methode Electronics +00-17-06 (hex) Techfaith Wireless Communication Technology Limited. +00-17-07 (hex) InGrid, Inc +00-17-08 (hex) Hewlett Packard +00-17-09 (hex) Exalt Communications +00-17-0A (hex) INEW DIGITAL COMPANY +00-17-0B (hex) Contela, Inc. +00-17-0C (hex) GeoSentric OYj +00-17-0D (hex) Dust Networks Inc. +00-17-0E (hex) Cisco Systems +00-17-0F (hex) Cisco Systems +00-17-10 (hex) Casa Systems Inc. +00-17-11 (hex) GE Healthcare Bio-Sciences AB +00-17-12 (hex) ISCO International +00-17-13 (hex) Tiger NetCom +00-17-14 (hex) BR Controls Nederland bv +00-17-15 (hex) Qstik +00-17-16 (hex) Qno Technology Inc. +00-17-17 (hex) Leica Geosystems AG +00-17-18 (hex) Vansco Electronics Oy +00-17-19 (hex) AudioCodes USA, Inc +00-17-1A (hex) Winegard Company +00-17-1B (hex) Innovation Lab Corp. +00-17-1C (hex) NT MicroSystems, Inc. +00-17-1D (hex) DIGIT +00-17-1E (hex) Theo Benning GmbH & Co. KG +00-17-1F (hex) IMV Corporation +00-17-20 (hex) Image Sensing Systems, Inc. +00-17-21 (hex) FITRE S.p.A. +00-17-22 (hex) Hanazeder Electronic GmbH +00-17-23 (hex) Summit Data Communications +00-17-24 (hex) Studer Professional Audio GmbH +00-17-25 (hex) Liquid Computing +00-17-26 (hex) m2c Electronic Technology Ltd. +00-17-27 (hex) Thermo Ramsey Italia s.r.l. +00-17-28 (hex) Selex Communications +00-17-29 (hex) Ubicod Co.LTD +00-17-2A (hex) Proware Technology Corp. +00-17-2B (hex) Global Technologies Inc. +00-17-2C (hex) TAEJIN INFOTECH +00-17-2D (hex) Axcen Photonics Corporation +00-17-2E (hex) FXC Inc. +00-17-2F (hex) NeuLion Incorporated +00-17-30 (hex) Automation Electronics +00-17-31 (hex) ASUSTek COMPUTER INC. +00-17-32 (hex) Science-Technical Center "RISSA" +00-17-33 (hex) SFR +00-17-34 (hex) ADC Telecommunications +00-17-35 (hex) PRIVATE +00-17-36 (hex) iiTron Inc. +00-17-37 (hex) Industrie Dial Face S.p.A. +00-17-38 (hex) International Business Machines +00-17-39 (hex) Bright Headphone Electronics Company +00-17-3A (hex) Reach Systems Inc. +00-17-3B (hex) Arched Rock Corporation +00-17-3C (hex) Extreme Engineering Solutions +00-17-3D (hex) Neology +00-17-3E (hex) LeucotronEquipamentos Ltda. +00-17-3F (hex) Belkin Corporation +00-17-40 (hex) Technologies Labtronix +00-17-41 (hex) DEFIDEV +00-17-42 (hex) FUJITSU LIMITED +00-17-43 (hex) Deck Srl +00-17-44 (hex) Araneo Ltd. +00-17-45 (hex) INNOTZ CO., Ltd +00-17-46 (hex) Freedom9 Inc. +00-17-47 (hex) Trimble +00-17-48 (hex) Neokoros Brasil Ltda +00-17-49 (hex) HYUNDAE YONG-O-SA CO.,LTD +00-17-4A (hex) SOCOMEC +00-17-4B (hex) Nokia Danmark A/S +00-17-4C (hex) Millipore +00-17-4D (hex) DYNAMIC NETWORK FACTORY, INC. +00-17-4E (hex) Parama-tech Co.,Ltd. +00-17-4F (hex) iCatch Inc. +00-17-50 (hex) GSI Group, MicroE Systems +00-17-51 (hex) Online Corporation +00-17-52 (hex) DAGS, Inc +00-17-53 (hex) nFore Technology Inc. +00-17-54 (hex) Arkino Corporation., Ltd +00-17-55 (hex) GE Security +00-17-56 (hex) Vinci Labs Oy +00-17-57 (hex) RIX TECHNOLOGY LIMITED +00-17-58 (hex) ThruVision Ltd +00-17-59 (hex) Cisco Systems +00-17-5A (hex) Cisco Systems +00-17-5B (hex) ACS Solutions Switzerland Ltd. +00-17-5C (hex) SHARP CORPORATION +00-17-5D (hex) Dongseo system. +00-17-5E (hex) Zed-3 +00-17-5F (hex) XENOLINK Communications Co., Ltd. +00-17-60 (hex) Naito Densei Machida MFG.CO.,LTD +00-17-61 (hex) ZKSoftware Inc. +00-17-62 (hex) Solar Technology, Inc. +00-17-63 (hex) Essentia S.p.A. +00-17-64 (hex) ATMedia GmbH +00-17-65 (hex) Nortel +00-17-66 (hex) Accense Technology, Inc. +00-17-67 (hex) Earforce AS +00-17-68 (hex) Zinwave Ltd +00-17-69 (hex) Cymphonix Corp +00-17-6A (hex) Avago Technologies +00-17-6B (hex) Kiyon, Inc. +00-17-6C (hex) Pivot3, Inc. +00-17-6D (hex) CORE CORPORATION +00-17-6E (hex) DUCATI SISTEMI +00-17-6F (hex) PAX Computer Technology(Shenzhen) Ltd. +00-17-70 (hex) Arti Industrial Electronics Ltd. +00-17-71 (hex) APD Communications Ltd +00-17-72 (hex) ASTRO Strobel Kommunikationssysteme GmbH +00-17-73 (hex) Laketune Technologies Co. Ltd +00-17-74 (hex) Elesta GmbH +00-17-75 (hex) TTE Germany GmbH +00-17-76 (hex) Meso Scale Diagnostics, LLC +00-17-77 (hex) Obsidian Research Corporation +00-17-78 (hex) Central Music Co. +00-17-79 (hex) QuickTel +00-17-7A (hex) ASSA ABLOY AB +00-17-7B (hex) Azalea Networks inc +00-17-7C (hex) Smartlink Network Systems Limited +00-17-7D (hex) IDT International Limited +00-17-7E (hex) Meshcom Technologies Inc. +00-17-7F (hex) Worldsmart Retech +00-17-80 (hex) Applera Holding B.V. Singapore Operations +00-17-81 (hex) Greystone Data System, Inc. +00-17-82 (hex) LoBenn Inc. +00-17-83 (hex) Texas Instruments +00-17-84 (hex) Motorola Mobile Devices +00-17-85 (hex) Sparr Electronics Ltd +00-17-86 (hex) wisembed +00-17-87 (hex) Brother, Brother & Sons ApS +00-17-88 (hex) Philips Lighting BV +00-17-89 (hex) Zenitron Corporation +00-17-8A (hex) DARTS TECHNOLOGIES CORP. +00-17-8B (hex) Teledyne Technologies Incorporated +00-17-8C (hex) Independent Witness, Inc +00-17-8D (hex) Checkpoint Systems, Inc. +00-17-8E (hex) Gunnebo Cash Automation AB +00-17-8F (hex) NINGBO YIDONG ELECTRONIC CO.,LTD. +00-17-90 (hex) HYUNDAI DIGITECH Co, Ltd. +00-17-91 (hex) LinTech GmbH +00-17-92 (hex) Falcom Wireless Comunications Gmbh +00-17-93 (hex) Tigi Corporation +00-17-94 (hex) Cisco Systems +00-17-95 (hex) Cisco Systems +00-17-96 (hex) Rittmeyer AG +00-17-97 (hex) Telsy Elettronica S.p.A. +00-17-98 (hex) Azonic Technology Co., LTD +00-17-99 (hex) SmarTire Systems Inc. +00-17-9A (hex) D-Link Corporation +00-17-9B (hex) Chant Sincere CO., LTD. +00-17-9C (hex) DEPRAG SCHULZ GMBH u. CO. +00-17-9D (hex) Kelman Limited +00-17-9E (hex) Sirit Inc +00-17-9F (hex) Apricorn +00-17-A0 (hex) RoboTech srl +00-17-A1 (hex) 3soft inc. +00-17-A2 (hex) Camrivox Ltd. +00-17-A3 (hex) MIX s.r.l. +00-17-A4 (hex) Hewlett Packard +00-17-A5 (hex) TrendChip Technologies Corp. +00-17-A6 (hex) YOSIN ELECTRONICS CO., LTD. +00-17-A7 (hex) Mobile Computing Promotion Consortium +00-17-A8 (hex) EDM Corporation +00-17-A9 (hex) Sentivision +00-17-AA (hex) elab-experience inc. +00-17-AB (hex) Nintendo Co., Ltd. +00-17-AC (hex) O'Neil Product Development Inc. +00-17-AD (hex) AceNet Corporation +00-17-AE (hex) GAI-Tronics +00-17-AF (hex) Enermet +00-17-B0 (hex) Nokia Danmark A/S +00-17-B1 (hex) ACIST Medical Systems, Inc. +00-17-B2 (hex) SK Telesys +00-17-B3 (hex) Aftek Infosys Limited +00-17-B4 (hex) Remote Security Systems, LLC +00-17-B5 (hex) Peerless Systems Corporation +00-17-B6 (hex) Aquantia +00-17-B7 (hex) Tonze Technology Co. +00-17-B8 (hex) NOVATRON CO., LTD. +00-17-B9 (hex) Gambro Lundia AB +00-17-BA (hex) SEDO CO., LTD. +00-17-BB (hex) Syrinx Industrial Electronics +00-17-BC (hex) Touchtunes Music Corporation +00-17-BD (hex) Tibetsystem +00-17-BE (hex) Tratec Telecom B.V. +00-17-BF (hex) Coherent Research Limited +00-17-C0 (hex) PureTech Systems, Inc. +00-17-C1 (hex) CM Precision Technology LTD. +00-17-C2 (hex) Pirelli Broadband Solutions +00-17-C3 (hex) KTF Technologies Inc. +00-17-C4 (hex) Quanta Microsystems, INC. +00-17-C5 (hex) SonicWALL +00-17-C6 (hex) Cross Match Technologies Inc +00-17-C7 (hex) MARA Systems Consulting AB +00-17-C8 (hex) Kyocera Mita Corporation +00-17-C9 (hex) Samsung Electronics Co., Ltd. +00-17-CA (hex) Qisda Corporation +00-17-CB (hex) Juniper Networks +00-17-CC (hex) Alcatel-Lucent +00-17-CD (hex) CEC Wireless R&D Ltd. +00-17-CE (hex) MB International Telecom Labs srl +00-17-CF (hex) iMCA-GmbH +00-17-D0 (hex) Opticom Communications, LLC +00-17-D1 (hex) Nortel +00-17-D2 (hex) THINLINX PTY LTD +00-17-D3 (hex) Etymotic Research, Inc. +00-17-D4 (hex) Monsoon Multimedia, Inc +00-17-D5 (hex) Samsung Electronics Co., Ltd. +00-17-D6 (hex) Bluechips Microhouse Co.,Ltd. +00-17-D7 (hex) ION Geophysical Corporation Inc. +00-17-D8 (hex) Magnum Semiconductor, Inc. +00-17-D9 (hex) AAI Corporation +00-17-DA (hex) Spans Logic +00-17-DB (hex) CANKO TECHNOLOGIES INC. +00-17-DC (hex) DAEMYUNG ZERO1 +00-17-DD (hex) Clipsal Australia +00-17-DE (hex) Advantage Six Ltd +00-17-DF (hex) Cisco Systems +00-17-E0 (hex) Cisco Systems +00-17-E1 (hex) DACOS Technologies Co., Ltd. +00-17-E2 (hex) Motorola Mobile Devices +00-17-E3 (hex) Texas Instruments +00-17-E4 (hex) Texas Instruments +00-17-E5 (hex) Texas Instruments +00-17-E6 (hex) Texas Instruments +00-17-E7 (hex) Texas Instruments +00-17-E8 (hex) Texas Instruments +00-17-E9 (hex) Texas Instruments +00-17-EA (hex) Texas Instruments +00-17-EB (hex) Texas Instruments +00-17-EC (hex) Texas Instruments +00-17-ED (hex) WooJooIT Ltd. +00-17-EE (hex) Motorola CHS +00-17-EF (hex) Blade Network Technologies, Inc. +00-17-F0 (hex) SZCOM Broadband Network Technology Co.,Ltd +00-17-F1 (hex) Renu Electronics Pvt Ltd +00-17-F2 (hex) Apple Computer +00-17-F3 (hex) Harris Corparation +00-17-F4 (hex) ZERON ALLIANCE +00-17-F5 (hex) LIG NEOPTEK +00-17-F6 (hex) Pyramid Meriden Inc. +00-17-F7 (hex) CEM Solutions Pvt Ltd +00-17-F8 (hex) Motech Industries Inc. +00-17-F9 (hex) Forcom Sp. z o.o. +00-17-FA (hex) Microsoft Corporation +00-17-FB (hex) FA +00-17-FC (hex) Suprema Inc. +00-17-FD (hex) Amulet Hotkey +00-17-FE (hex) TALOS SYSTEM INC. +00-17-FF (hex) PLAYLINE Co.,Ltd. +00-18-00 (hex) UNIGRAND LTD +00-18-01 (hex) Actiontec Electronics, Inc +00-18-02 (hex) Alpha Networks Inc. +00-18-03 (hex) ArcSoft Shanghai Co. LTD +00-18-04 (hex) E-TEK DIGITAL TECHNOLOGY LIMITED +00-18-05 (hex) Beijing InHand Networking Technology Co.,Ltd. +00-18-06 (hex) Hokkei Industries Co., Ltd. +00-18-07 (hex) Fanstel Corp. +00-18-08 (hex) SightLogix, Inc. +00-18-09 (hex) CRESYN +00-18-0A (hex) Meraki, Inc. +00-18-0B (hex) Brilliant Telecommunications +00-18-0C (hex) Optelian Access Networks +00-18-0D (hex) Terabytes Server Storage Tech Corp +00-18-0E (hex) Avega Systems +00-18-0F (hex) Nokia Danmark A/S +00-18-10 (hex) IPTrade S.A. +00-18-11 (hex) Neuros Technology International, LLC. +00-18-12 (hex) Beijing Xinwei Telecom Technology Co., Ltd. +00-18-13 (hex) Sony Ericsson Mobile Communications +00-18-14 (hex) Mitutoyo Corporation +00-18-15 (hex) GZ Technologies, Inc. +00-18-16 (hex) Ubixon Co., Ltd. +00-18-17 (hex) D. E. Shaw Research, LLC +00-18-18 (hex) Cisco Systems +00-18-19 (hex) Cisco Systems +00-18-1A (hex) AVerMedia Information Inc. +00-18-1B (hex) TaiJin Metal Co., Ltd. +00-18-1C (hex) Exterity Limited +00-18-1D (hex) ASIA ELECTRONICS CO.,LTD +00-18-1E (hex) GDX Technologies Ltd. +00-18-1F (hex) Palmmicro Communications +00-18-20 (hex) w5networks +00-18-21 (hex) SINDORICOH +00-18-22 (hex) CEC TELECOM CO.,LTD. +00-18-23 (hex) Delta Electronics, Inc. +00-18-24 (hex) Kimaldi Electronics, S.L. +00-18-25 (hex) Wavion LTD +00-18-26 (hex) Cale Access AB +00-18-27 (hex) NEC PHILIPS UNIFIED SOLUTIONS NEDERLAND BV +00-18-28 (hex) e2v technologies (UK) ltd. +00-18-29 (hex) Gatsometer +00-18-2A (hex) Taiwan Video & Monitor +00-18-2B (hex) Softier +00-18-2C (hex) Ascend Networks, Inc. +00-18-2D (hex) Artec Group OÜ +00-18-2E (hex) XStreamHD, LLC +00-18-2F (hex) Texas Instruments +00-18-30 (hex) Texas Instruments +00-18-31 (hex) Texas Instruments +00-18-32 (hex) Texas Instruments +00-18-33 (hex) Texas Instruments +00-18-34 (hex) Texas Instruments +00-18-35 (hex) Thoratec / ITC +00-18-36 (hex) Reliance Electric Limited +00-18-37 (hex) Universal ABIT Co., Ltd. +00-18-38 (hex) PanAccess Communications,Inc. +00-18-39 (hex) Cisco-Linksys LLC +00-18-3A (hex) Westell Technologies +00-18-3B (hex) CENITS Co., Ltd. +00-18-3C (hex) Encore Software Limited +00-18-3D (hex) Vertex Link Corporation +00-18-3E (hex) Digilent, Inc +00-18-3F (hex) 2Wire, Inc +00-18-40 (hex) 3 Phoenix, Inc. +00-18-41 (hex) High Tech Computer Corp +00-18-42 (hex) Nokia Danmark A/S +00-18-43 (hex) Dawevision Ltd +00-18-44 (hex) Heads Up Technologies, Inc. +00-18-45 (hex) NPL Pulsar Ltd. +00-18-46 (hex) Crypto S.A. +00-18-47 (hex) AceNet Technology Inc. +00-18-48 (hex) Vecima Networks Inc. +00-18-49 (hex) Pigeon Point Systems +00-18-4A (hex) Catcher, Inc. +00-18-4B (hex) Las Vegas Gaming, Inc. +00-18-4C (hex) Bogen Communications +00-18-4D (hex) Netgear Inc. +00-18-4E (hex) Lianhe Technologies, Inc. +00-18-4F (hex) 8 Ways Technology Corp. +00-18-50 (hex) Secfone Kft +00-18-51 (hex) SWsoft +00-18-52 (hex) StorLink Semiconductors, Inc. +00-18-53 (hex) Atera Networks LTD. +00-18-54 (hex) Argard Co., Ltd +00-18-55 (hex) Aeromaritime Systembau GmbH +00-18-56 (hex) EyeFi, Inc +00-18-57 (hex) Unilever R&D +00-18-58 (hex) TagMaster AB +00-18-59 (hex) Strawberry Linux Co.,Ltd. +00-18-5A (hex) uControl, Inc. +00-18-5B (hex) Network Chemistry, Inc +00-18-5C (hex) EDS Lab Pte Ltd +00-18-5D (hex) TAIGUEN TECHNOLOGY (SHEN-ZHEN) CO., LTD. +00-18-5E (hex) Nexterm Inc. +00-18-5F (hex) TAC Inc. +00-18-60 (hex) SIM Technology Group Shanghai Simcom Ltd., +00-18-61 (hex) Ooma, Inc. +00-18-62 (hex) Seagate Technology +00-18-63 (hex) Veritech Electronics Limited +00-18-64 (hex) Cybectec Inc. +00-18-65 (hex) Siemens Healthcare Diagnostics Manufacturing Ltd +00-18-66 (hex) Leutron Vision +00-18-67 (hex) Evolution Robotics Retail +00-18-68 (hex) Scientific Atlanta, A Cisco Company +00-18-69 (hex) KINGJIM +00-18-6A (hex) Global Link Digital Technology Co,.LTD +00-18-6B (hex) Sambu Communics CO., LTD. +00-18-6C (hex) Neonode AB +00-18-6D (hex) Zhenjiang Sapphire Electronic Industry CO. +00-18-6E (hex) 3Com Ltd +00-18-6F (hex) Setha Industria Eletronica LTDA +00-18-70 (hex) E28 Shanghai Limited +00-18-71 (hex) Hewlett Packard +00-18-72 (hex) Expertise Engineering +00-18-73 (hex) Cisco Systems +00-18-74 (hex) Cisco Systems +00-18-75 (hex) AnaCise Testnology Pte Ltd +00-18-76 (hex) WowWee Ltd. +00-18-77 (hex) Amplex A/S +00-18-78 (hex) Mackware GmbH +00-18-79 (hex) dSys +00-18-7A (hex) Wiremold +00-18-7B (hex) 4NSYS Co. Ltd. +00-18-7C (hex) INTERCROSS, LLC +00-18-7D (hex) Armorlink shanghai Co. Ltd +00-18-7E (hex) RGB Spectrum +00-18-7F (hex) ZODIANET +00-18-80 (hex) Maxim Integrated Circuits +00-18-81 (hex) Buyang Electronics Industrial Co., Ltd +00-18-82 (hex) Huawei Technologies Co., Ltd. +00-18-83 (hex) FORMOSA21 INC. +00-18-84 (hex) FON +00-18-85 (hex) Avigilon Corporation +00-18-86 (hex) EL-TECH, INC. +00-18-87 (hex) Metasystem SpA +00-18-88 (hex) GOTIVE a.s. +00-18-89 (hex) WinNet Solutions Limited +00-18-8A (hex) Infinova LLC +00-18-8B (hex) Dell +00-18-8C (hex) Mobile Action Technology Inc. +00-18-8D (hex) Nokia Danmark A/S +00-18-8E (hex) Ekahau, Inc. +00-18-8F (hex) Montgomery Technology, Inc. +00-18-90 (hex) RadioCOM, s.r.o. +00-18-91 (hex) Zhongshan General K-mate Electronics Co., Ltd +00-18-92 (hex) ads-tec GmbH +00-18-93 (hex) SHENZHEN PHOTON BROADBAND TECHNOLOGY CO.,LTD +00-18-94 (hex) zimocom +00-18-95 (hex) Hansun Technologies Inc. +00-18-96 (hex) Great Well Electronic LTD +00-18-97 (hex) JESS-LINK PRODUCTS Co., LTD +00-18-98 (hex) KINGSTATE ELECTRONICS CORPORATION +00-18-99 (hex) ShenZhen jieshun Science&Technology Industry CO,LTD. +00-18-9A (hex) HANA Micron Inc. +00-18-9B (hex) Thomson Inc. +00-18-9C (hex) Weldex Corporation +00-18-9D (hex) Navcast Inc. +00-18-9E (hex) OMNIKEY GmbH. +00-18-9F (hex) Lenntek Corporation +00-18-A0 (hex) Cierma Ascenseurs +00-18-A1 (hex) Tiqit Computers, Inc. +00-18-A2 (hex) XIP Technology AB +00-18-A3 (hex) ZIPPY TECHNOLOGY CORP. +00-18-A4 (hex) Motorola Mobile Devices +00-18-A5 (hex) ADigit Technologies Corp. +00-18-A6 (hex) Persistent Systems, LLC +00-18-A7 (hex) Yoggie Security Systems LTD. +00-18-A8 (hex) AnNeal Technology Inc. +00-18-A9 (hex) Ethernet Direct Corporation +00-18-AA (hex) Protec Fire Detection plc +00-18-AB (hex) BEIJING LHWT MICROELECTRONICS INC. +00-18-AC (hex) Shanghai Jiao Da HISYS Technology Co. Ltd. +00-18-AD (hex) NIDEC SANKYO CORPORATION +00-18-AE (hex) TVT CO.,LTD +00-18-AF (hex) Samsung Electronics Co., Ltd. +00-18-B0 (hex) Nortel +00-18-B1 (hex) Blade Network Technologies +00-18-B2 (hex) ADEUNIS RF +00-18-B3 (hex) TEC WizHome Co., Ltd. +00-18-B4 (hex) Dawon Media Inc. +00-18-B5 (hex) Magna Carta +00-18-B6 (hex) S3C, Inc. +00-18-B7 (hex) D3 LED, LLC +00-18-B8 (hex) New Voice International AG +00-18-B9 (hex) Cisco Systems +00-18-BA (hex) Cisco Systems +00-18-BB (hex) Eliwell Controls srl +00-18-BC (hex) ZAO NVP Bolid +00-18-BD (hex) SHENZHEN DVBWORLD TECHNOLOGY CO., LTD. +00-18-BE (hex) ANSA Corporation +00-18-BF (hex) Essence Technology Solution, Inc. +00-18-C0 (hex) Motorola CHS +00-18-C1 (hex) Almitec Informática e Comércio Ltda. +00-18-C2 (hex) Firetide, Inc +00-18-C3 (hex) C&S Microwave +00-18-C4 (hex) Raba Technologies LLC +00-18-C5 (hex) Nokia Danmark A/S +00-18-C6 (hex) OPW Fuel Management Systems +00-18-C7 (hex) Real Time Automation +00-18-C8 (hex) ISONAS Inc. +00-18-C9 (hex) EOps Technology Limited +00-18-CA (hex) Viprinet GmbH +00-18-CB (hex) Tecobest Technology Limited +00-18-CC (hex) AXIOHM SAS +00-18-CD (hex) Erae Electronics Industry Co., Ltd +00-18-CE (hex) Dreamtech Co., Ltd +00-18-CF (hex) Baldor Electric Company +00-18-D0 (hex) AtRoad, A Trimble Company +00-18-D1 (hex) Siemens Home & Office Comm. Devices +00-18-D2 (hex) High-Gain Antennas LLC +00-18-D3 (hex) TEAMCAST +00-18-D4 (hex) Unified Display Interface SIG +00-18-D5 (hex) REIGNCOM +00-18-D6 (hex) Swirlnet A/S +00-18-D7 (hex) Javad Navigation Systems Inc. +00-18-D8 (hex) ARCH METER Corporation +00-18-D9 (hex) Santosha Internatonal, Inc +00-18-DA (hex) AMBER wireless GmbH +00-18-DB (hex) EPL Technology Ltd +00-18-DC (hex) Prostar Co., Ltd. +00-18-DD (hex) Silicondust Engineering Ltd +00-18-DE (hex) Intel Corporation +00-18-DF (hex) The Morey Corporation +00-18-E0 (hex) ANAVEO +00-18-E1 (hex) Verkerk Service Systemen +00-18-E2 (hex) Topdata Sistemas de Automacao Ltda +00-18-E3 (hex) Visualgate Systems, Inc. +00-18-E4 (hex) YIGUANG +00-18-E5 (hex) Adhoco AG +00-18-E6 (hex) Computer Hardware Design SIA +00-18-E7 (hex) Cameo Communications, INC. +00-18-E8 (hex) Hacetron Corporation +00-18-E9 (hex) Numata Corporation +00-18-EA (hex) Alltec GmbH +00-18-EB (hex) BroVis Wireless Networks +00-18-EC (hex) Welding Technology Corporation +00-18-ED (hex) Accutech Ultrasystems Co., Ltd. +00-18-EE (hex) Videology Imaging Solutions, Inc. +00-18-EF (hex) Escape Communications, Inc. +00-18-F0 (hex) JOYTOTO Co., Ltd. +00-18-F1 (hex) Chunichi Denshi Co.,LTD. +00-18-F2 (hex) Beijing Tianyu Communication Equipment Co., Ltd +00-18-F3 (hex) ASUSTek COMPUTER INC. +00-18-F4 (hex) EO TECHNICS Co., Ltd. +00-18-F5 (hex) Shenzhen Streaming Video Technology Company Limited +00-18-F6 (hex) Thomson Telecom Belgium +00-18-F7 (hex) Kameleon Technologies +00-18-F8 (hex) Cisco-Linksys LLC +00-18-F9 (hex) VVOND, Inc. +00-18-FA (hex) Yushin Precision Equipment Co.,Ltd. +00-18-FB (hex) Compro Technology +00-18-FC (hex) Altec Electronic AG +00-18-FD (hex) Optimal Technologies International Inc. +00-18-FE (hex) Hewlett Packard +00-18-FF (hex) PowerQuattro Co. +00-19-00 (hex) Intelliverese - DBA Voicecom +00-19-01 (hex) F1MEDIA +00-19-02 (hex) Cambridge Consultants Ltd +00-19-03 (hex) Bigfoot Networks Inc +00-19-04 (hex) WB Electronics Sp. z o.o. +00-19-05 (hex) SCHRACK Seconet AG +00-19-06 (hex) Cisco Systems +00-19-07 (hex) Cisco Systems +00-19-08 (hex) Duaxes Corporation +00-19-09 (hex) Devi A/S +00-19-0A (hex) HASWARE INC. +00-19-0B (hex) Southern Vision Systems, Inc. +00-19-0C (hex) Encore Electronics, Inc. +00-19-0D (hex) IEEE 1394c +00-19-0E (hex) Atech Technology Co., Ltd. +00-19-0F (hex) Advansus Corp. +00-19-10 (hex) Knick Elektronische Messgeraete GmbH & Co. KG +00-19-11 (hex) Just In Mobile Information Technologies (Shanghai) Co., Ltd. +00-19-12 (hex) Welcat Inc +00-19-13 (hex) Chuang-Yi Network Equipment Co.Ltd. +00-19-14 (hex) Winix Co., Ltd +00-19-15 (hex) TECOM Co., Ltd. +00-19-16 (hex) PayTec AG +00-19-17 (hex) Posiflex Inc. +00-19-18 (hex) Interactive Wear AG +00-19-19 (hex) ASTEL Inc. +00-19-1A (hex) IRLINK +00-19-1B (hex) Sputnik Engineering AG +00-19-1C (hex) Sensicast Systems +00-19-1D (hex) Nintendo Co.,Ltd. +00-19-1E (hex) Beyondwiz Co., Ltd. +00-19-1F (hex) Microlink communications Inc. +00-19-20 (hex) KUME electric Co.,Ltd. +00-19-21 (hex) Elitegroup Computer System Co. +00-19-22 (hex) CM Comandos Lineares +00-19-23 (hex) Phonex Korea Co., LTD. +00-19-24 (hex) LBNL Engineering +00-19-25 (hex) Intelicis Corporation +00-19-26 (hex) BitsGen Co., Ltd. +00-19-27 (hex) ImCoSys Ltd +00-19-28 (hex) Siemens AG, Transportation Systems +00-19-29 (hex) 2M2B Montadora de Maquinas Bahia Brasil LTDA +00-19-2A (hex) Antiope Associates +00-19-2B (hex) Aclara RF Systems Inc. +00-19-2C (hex) Motorola Mobile Devices +00-19-2D (hex) Nokia Corporation +00-19-2E (hex) Spectral Instruments, Inc. +00-19-2F (hex) Cisco Systems +00-19-30 (hex) Cisco Systems +00-19-31 (hex) Balluff GmbH +00-19-32 (hex) Gude Analog- und Digialsysteme GmbH +00-19-33 (hex) Strix Systems, Inc. +00-19-34 (hex) TRENDON TOUCH TECHNOLOGY CORP. +00-19-35 (hex) Duerr Dental GmbH & Co. KG +00-19-36 (hex) STERLITE OPTICAL TECHNOLOGIES LIMITED +00-19-37 (hex) CommerceGuard AB +00-19-38 (hex) UMB Communications Co., Ltd. +00-19-39 (hex) Gigamips +00-19-3A (hex) OESOLUTIONS +00-19-3B (hex) Wilibox Deliberant Group LLC +00-19-3C (hex) HighPoint Technologies Incorporated +00-19-3D (hex) GMC Guardian Mobility Corp. +00-19-3E (hex) PIRELLI BROADBAND SOLUTIONS +00-19-3F (hex) RDI technology(Shenzhen) Co.,LTD +00-19-40 (hex) Rackable Systems +00-19-41 (hex) Pitney Bowes, Inc +00-19-42 (hex) ON SOFTWARE INTERNATIONAL LIMITED +00-19-43 (hex) Belden +00-19-44 (hex) Fossil Partners, L.P. +00-19-45 (hex) Ten-Tec Inc. +00-19-46 (hex) Cianet Industria e Comercio S/A +00-19-47 (hex) Scientific Atlanta, A Cisco Company +00-19-48 (hex) AireSpider Networks +00-19-49 (hex) TENTEL COMTECH CO., LTD. +00-19-4A (hex) TESTO AG +00-19-4B (hex) SAGEM COMMUNICATION +00-19-4C (hex) Fujian Stelcom information & Technology CO.,Ltd +00-19-4D (hex) Avago Technologies Sdn Bhd +00-19-4E (hex) Ultra Electronics - TCS (Tactical Communication Systems) +00-19-4F (hex) Nokia Danmark A/S +00-19-50 (hex) Harman Multimedia +00-19-51 (hex) NETCONS, s.r.o. +00-19-52 (hex) ACOGITO Co., Ltd +00-19-53 (hex) Chainleader Communications Corp. +00-19-54 (hex) Leaf Corporation. +00-19-55 (hex) Cisco Systems +00-19-56 (hex) Cisco Systems +00-19-57 (hex) Saafnet Canada Inc. +00-19-58 (hex) Bluetooth SIG, Inc. +00-19-59 (hex) Staccato Communications Inc. +00-19-5A (hex) Jenaer Antriebstechnik GmbH +00-19-5B (hex) D-Link Corporation +00-19-5C (hex) Innotech Corporation +00-19-5D (hex) ShenZhen XinHuaTong Opto Electronics Co.,Ltd +00-19-5E (hex) Motorola CHS +00-19-5F (hex) Valemount Networks Corporation +00-19-60 (hex) DoCoMo Systems, Inc. +00-19-61 (hex) Blaupunkt GmbH +00-19-62 (hex) Commerciant, LP +00-19-63 (hex) Sony Ericsson Mobile Communications AB +00-19-64 (hex) Doorking Inc. +00-19-65 (hex) YuHua TelTech (ShangHai) Co., Ltd. +00-19-66 (hex) Asiarock Technology Limited +00-19-67 (hex) TELDAT Sp.J. +00-19-68 (hex) Digital Video Networks(Shanghai) CO. LTD. +00-19-69 (hex) Nortel +00-19-6A (hex) MikroM GmbH +00-19-6B (hex) Danpex Corporation +00-19-6C (hex) ETROVISION TECHNOLOGY +00-19-6D (hex) Raybit Systems Korea, Inc +00-19-6E (hex) Metacom (Pty) Ltd. +00-19-6F (hex) SensoPart GmbH +00-19-70 (hex) Z-Com, Inc. +00-19-71 (hex) Guangzhou Unicomp Technology Co.,Ltd +00-19-72 (hex) Plexus (Xiamen) Co.,ltd +00-19-73 (hex) Zeugma Systems +00-19-74 (hex) AboCom Systems, Inc. +00-19-75 (hex) Beijing Huisen networks technology Inc +00-19-76 (hex) Xipher Technologies, LLC +00-19-77 (hex) Aerohive Networks, Inc. +00-19-78 (hex) Datum Systems, Inc. +00-19-79 (hex) Nokia Danmark A/S +00-19-7A (hex) MAZeT GmbH +00-19-7B (hex) Picotest Corp. +00-19-7C (hex) Riedel Communications GmbH +00-19-7D (hex) Hon Hai Precision Ind. Co., Ltd +00-19-7E (hex) Hon Hai Precision Ind. Co., Ltd +00-19-7F (hex) PLANTRONICS, INC. +00-19-80 (hex) Gridpoint Systems +00-19-81 (hex) Vivox Inc +00-19-82 (hex) SmarDTV +00-19-83 (hex) CCT R&D Limited +00-19-84 (hex) ESTIC Corporation +00-19-85 (hex) IT Watchdogs, Inc +00-19-86 (hex) Cheng Hongjian +00-19-87 (hex) Panasonic Mobile Communications Co., Ltd. +00-19-88 (hex) Wi2Wi, Inc +00-19-89 (hex) Sonitrol Corporation +00-19-8A (hex) Northrop Grumman Systems Corp. +00-19-8B (hex) Novera Optics Korea, Inc. +00-19-8C (hex) iXSea +00-19-8D (hex) Ocean Optics, Inc. +00-19-8E (hex) Oticon A/S +00-19-8F (hex) Alcatel Bell N.V. +00-19-90 (hex) ELM DATA Co., Ltd. +00-19-91 (hex) avinfo +00-19-92 (hex) Bluesocket, Inc +00-19-93 (hex) Changshu Switchgear MFG. Co.,Ltd. (Former Changshu Switchgea +00-19-94 (hex) Jorjin Technologies Inc. +00-19-95 (hex) Jurong Hi-Tech (Suzhou)Co.ltd +00-19-96 (hex) TurboChef Technologies Inc. +00-19-97 (hex) Soft Device Sdn Bhd +00-19-98 (hex) SATO CORPORATION +00-19-99 (hex) Fujitsu Technology Solutions +00-19-9A (hex) EDO-EVI +00-19-9B (hex) Diversified Technical Systems, Inc. +00-19-9C (hex) CTRING +00-19-9D (hex) VIZIO, Inc. +00-19-9E (hex) SHOWADENSHI ELECTRONICS,INC. +00-19-9F (hex) DKT A/S +00-19-A0 (hex) NIHON DATA SYSTENS, INC. +00-19-A1 (hex) LG INFORMATION & COMM. +00-19-A2 (hex) ORDYN TECHNOLOGIES +00-19-A3 (hex) asteel electronique atlantique +00-19-A4 (hex) Austar Technology (hang zhou) Co.,Ltd +00-19-A5 (hex) RadarFind Corporation +00-19-A6 (hex) Motorola CHS +00-19-A7 (hex) ITU-T +00-19-A8 (hex) WiQuest Communications +00-19-A9 (hex) Cisco Systems +00-19-AA (hex) Cisco Systems +00-19-AB (hex) Raycom CO ., LTD +00-19-AC (hex) GSP SYSTEMS Inc. +00-19-AD (hex) BOBST SA +00-19-AE (hex) Hopling Technologies b.v. +00-19-AF (hex) Rigol Technologies, Inc. +00-19-B0 (hex) HanYang System +00-19-B1 (hex) Arrow7 Corporation +00-19-B2 (hex) XYnetsoft Co.,Ltd +00-19-B3 (hex) Stanford Research Systems +00-19-B4 (hex) VideoCast Ltd. +00-19-B5 (hex) Famar Fueguina S.A. +00-19-B6 (hex) Euro Emme s.r.l. +00-19-B7 (hex) Nokia Danmark A/S +00-19-B8 (hex) Boundary Devices +00-19-B9 (hex) Dell Inc. +00-19-BA (hex) Paradox Security Systems Ltd +00-19-BB (hex) Hewlett Packard +00-19-BC (hex) ELECTRO CHANCE SRL +00-19-BD (hex) New Media Life +00-19-BE (hex) Altai Technologies Limited +00-19-BF (hex) Citiway technology Co.,ltd +00-19-C0 (hex) Motorola Mobile Devices +00-19-C1 (hex) Alps Electric Co., Ltd +00-19-C2 (hex) Equustek Solutions, Inc. +00-19-C3 (hex) Qualitrol +00-19-C4 (hex) Infocrypt Inc. +00-19-C5 (hex) SONY Computer Entertainment inc, +00-19-C6 (hex) ZTE Corporation +00-19-C7 (hex) Cambridge Industries(Group) Co.,Ltd. +00-19-C8 (hex) AnyDATA Corporation +00-19-C9 (hex) S&C ELECTRIC COMPANY +00-19-CA (hex) Broadata Communications, Inc +00-19-CB (hex) ZyXEL Communications Corporation +00-19-CC (hex) RCG (HK) Ltd +00-19-CD (hex) Chengdu ethercom information technology Ltd. +00-19-CE (hex) Progressive Gaming International +00-19-CF (hex) SALICRU, S.A. +00-19-D0 (hex) Cathexis +00-19-D1 (hex) Intel Corporation +00-19-D2 (hex) Intel Corporation +00-19-D3 (hex) TRAK Microwave +00-19-D4 (hex) ICX Technologies +00-19-D5 (hex) IP Innovations, Inc. +00-19-D6 (hex) LS Cable Ltd. +00-19-D7 (hex) FORTUNETEK CO., LTD +00-19-D8 (hex) MAXFOR +00-19-D9 (hex) Zeutschel GmbH +00-19-DA (hex) Welltrans O&E Technology Co. , Ltd. +00-19-DB (hex) MICRO-STAR INTERNATIONAL CO., LTD. +00-19-DC (hex) ENENSYS Technologies +00-19-DD (hex) FEI-Zyfer, Inc. +00-19-DE (hex) MOBITEK +00-19-DF (hex) Thomson Inc. +00-19-E0 (hex) TP-LINK Technologies Co., Ltd. +00-19-E1 (hex) Nortel +00-19-E2 (hex) Juniper Networks +00-19-E3 (hex) Apple Computer Inc. +00-19-E4 (hex) 2Wire, Inc +00-19-E5 (hex) Lynx Studio Technology, Inc. +00-19-E6 (hex) TOYO MEDIC CO.,LTD. +00-19-E7 (hex) Cisco Systems +00-19-E8 (hex) Cisco Systems +00-19-E9 (hex) S-Information Technolgy, Co., Ltd. +00-19-EA (hex) TeraMage Technologies Co., Ltd. +00-19-EB (hex) Pyronix Ltd +00-19-EC (hex) Sagamore Systems, Inc. +00-19-ED (hex) Axesstel Inc. +00-19-EE (hex) CARLO GAVAZZI CONTROLS SPA-Controls Division +00-19-EF (hex) SHENZHEN LINNKING ELECTRONICS CO.,LTD +00-19-F0 (hex) UNIONMAN TECHNOLOGY CO.,LTD +00-19-F1 (hex) Star Communication Network Technology Co.,Ltd +00-19-F2 (hex) Teradyne K.K. +00-19-F3 (hex) Telematrix, Inc +00-19-F4 (hex) Convergens Oy Ltd +00-19-F5 (hex) Imagination Technologies Ltd +00-19-F6 (hex) Acconet (PTE) Ltd +00-19-F7 (hex) Onset Computer Corporation +00-19-F8 (hex) Embedded Systems Design, Inc. +00-19-F9 (hex) TDK-Lambda +00-19-FA (hex) Cable Vision Electronics CO., LTD. +00-19-FB (hex) AMSTRAD PLC +00-19-FC (hex) PT. Ufoakses Sukses Luarbiasa +00-19-FD (hex) Nintendo Co., Ltd. +00-19-FE (hex) SHENZHEN SEECOMM TECHNOLOGY CO.,LTD. +00-19-FF (hex) Finnzymes +00-1A-00 (hex) MATRIX INC. +00-1A-01 (hex) Smiths Medical +00-1A-02 (hex) SECURE CARE PRODUCTS, INC +00-1A-03 (hex) Angel Electronics Co., Ltd. +00-1A-04 (hex) Interay Solutions BV +00-1A-05 (hex) OPTIBASE LTD +00-1A-06 (hex) OpVista, Inc. +00-1A-07 (hex) Arecont Vision +00-1A-08 (hex) Dalman Technical Services +00-1A-09 (hex) Wayfarer Transit Systems Ltd +00-1A-0A (hex) Adaptive Micro-Ware Inc. +00-1A-0B (hex) BONA TECHNOLOGY INC. +00-1A-0C (hex) Swe-Dish Satellite Systems AB +00-1A-0D (hex) HandHeld entertainment, Inc. +00-1A-0E (hex) Cheng Uei Precision Industry Co.,Ltd +00-1A-0F (hex) Sistemas Avanzados de Control, S.A. +00-1A-10 (hex) LUCENT TRANS ELECTRONICS CO.,LTD +00-1A-11 (hex) Google Inc. +00-1A-12 (hex) Essilor +00-1A-13 (hex) Wanlida Group Co., LTD +00-1A-14 (hex) Xin Hua Control Engineering Co.,Ltd. +00-1A-15 (hex) gemalto e-Payment +00-1A-16 (hex) Nokia Danmark A/S +00-1A-17 (hex) Teak Technologies, Inc. +00-1A-18 (hex) Advanced Simulation Technology inc. +00-1A-19 (hex) Computer Engineering Limited +00-1A-1A (hex) Gentex Corporation/Electro-Acoustic Products +00-1A-1B (hex) Motorola Mobile Devices +00-1A-1C (hex) GT&T Engineering Pte Ltd +00-1A-1D (hex) PChome Online Inc. +00-1A-1E (hex) Aruba Networks +00-1A-1F (hex) Coastal Environmental Systems +00-1A-20 (hex) CMOTECH Co. Ltd. +00-1A-21 (hex) Indac B.V. +00-1A-22 (hex) eq-3 GmbH +00-1A-23 (hex) Ice Qube, Inc +00-1A-24 (hex) Galaxy Telecom Technologies Ltd +00-1A-25 (hex) DELTA DORE +00-1A-26 (hex) Deltanode Solutions AB +00-1A-27 (hex) Ubistar +00-1A-28 (hex) ASWT Co., LTD. Taiwan Branch H.K. +00-1A-29 (hex) Techsonic Industries d/b/a Humminbird +00-1A-2A (hex) Arcadyan Technology Corporation +00-1A-2B (hex) Ayecom Technology Co., Ltd. +00-1A-2C (hex) SATEC Co.,LTD +00-1A-2D (hex) The Navvo Group +00-1A-2E (hex) Ziova Coporation +00-1A-2F (hex) Cisco Systems +00-1A-30 (hex) Cisco Systems +00-1A-31 (hex) SCAN COIN Industries AB +00-1A-32 (hex) ACTIVA MULTIMEDIA +00-1A-33 (hex) ASI Communications, Inc. +00-1A-34 (hex) Konka Group Co., Ltd. +00-1A-35 (hex) BARTEC GmbH +00-1A-36 (hex) Aipermon GmbH & Co. KG +00-1A-37 (hex) Lear Corporation +00-1A-38 (hex) Sanmina-SCI +00-1A-39 (hex) Merten GmbH&CoKG +00-1A-3A (hex) Dongahelecomm +00-1A-3B (hex) Doah Elecom Inc. +00-1A-3C (hex) Technowave Ltd. +00-1A-3D (hex) Ajin Vision Co.,Ltd +00-1A-3E (hex) Faster Technology LLC +00-1A-3F (hex) intelbras +00-1A-40 (hex) A-FOUR TECH CO., LTD. +00-1A-41 (hex) INOCOVA Co.,Ltd +00-1A-42 (hex) Techcity Technology co., Ltd. +00-1A-43 (hex) Logical Link Communications +00-1A-44 (hex) JWTrading Co., Ltd +00-1A-45 (hex) GN Netcom as +00-1A-46 (hex) Digital Multimedia Technology Co., Ltd +00-1A-47 (hex) Agami Systems, Inc. +00-1A-48 (hex) Takacom Corporation +00-1A-49 (hex) Micro Vision Co.,LTD +00-1A-4A (hex) Qumranet Inc. +00-1A-4B (hex) Hewlett Packard +00-1A-4C (hex) Crossbow Technology, Inc +00-1A-4D (hex) GIGA-BYTE TECHNOLOGY CO.,LTD. +00-1A-4E (hex) NTI AG / LinMot +00-1A-4F (hex) AVM GmbH +00-1A-50 (hex) PheeNet Technology Corp. +00-1A-51 (hex) Alfred Mann Foundation +00-1A-52 (hex) Meshlinx Wireless Inc. +00-1A-53 (hex) Zylaya +00-1A-54 (hex) Hip Shing Electronics Ltd. +00-1A-55 (hex) ACA-Digital Corporation +00-1A-56 (hex) ViewTel Co,. Ltd. +00-1A-57 (hex) Matrix Design Group, LLC +00-1A-58 (hex) CCV Deutschland GmbH - Celectronic eHealth Div. +00-1A-59 (hex) Ircona +00-1A-5A (hex) Korea Electric Power Data Network (KDN) Co., Ltd +00-1A-5B (hex) NetCare Service Co., Ltd. +00-1A-5C (hex) Euchner GmbH+Co. KG +00-1A-5D (hex) Mobinnova Corp. +00-1A-5E (hex) Thincom Technology Co.,Ltd +00-1A-5F (hex) KitWorks.fi Ltd. +00-1A-60 (hex) Wave Electronics Co.,Ltd. +00-1A-61 (hex) PacStar Corp. +00-1A-62 (hex) Data Robotics, Incorporated +00-1A-63 (hex) Elster Solutions, LLC, +00-1A-64 (hex) IBM Corp. +00-1A-65 (hex) Seluxit +00-1A-66 (hex) Motorola CHS +00-1A-67 (hex) Infinite QL Sdn Bhd +00-1A-68 (hex) Weltec Enterprise Co., Ltd. +00-1A-69 (hex) Wuhan Yangtze Optical Technology CO.,Ltd. +00-1A-6A (hex) Tranzas, Inc. +00-1A-6B (hex) USI +00-1A-6C (hex) Cisco Systems +00-1A-6D (hex) Cisco Systems +00-1A-6E (hex) Impro Technologies +00-1A-6F (hex) MI.TEL s.r.l. +00-1A-70 (hex) Cisco-Linksys, LLC +00-1A-71 (hex) Diostech Co., Ltd. +00-1A-72 (hex) Mosart Semiconductor Corp. +00-1A-73 (hex) Gemtek Technology Co., Ltd. +00-1A-74 (hex) Procare International Co +00-1A-75 (hex) Sony Ericsson Mobile Communications +00-1A-76 (hex) SDT information Technology Co.,LTD. +00-1A-77 (hex) Motorola Mobile Devices +00-1A-78 (hex) ubtos +00-1A-79 (hex) TELECOMUNICATION TECHNOLOGIES LTD. +00-1A-7A (hex) Lismore Instruments Limited +00-1A-7B (hex) Teleco, Inc. +00-1A-7C (hex) Hirschmann Automation and Control B.V. +00-1A-7D (hex) cyber-blue(HK)Ltd +00-1A-7E (hex) LN Srithai Comm Ltd. +00-1A-7F (hex) GCI Science&Technology Co.,Ltd. +00-1A-80 (hex) Sony Corporation +00-1A-81 (hex) Zelax +00-1A-82 (hex) PROBA Building Automation Co.,LTD +00-1A-83 (hex) Pegasus Technologies Inc. +00-1A-84 (hex) V One Multimedia Pte Ltd +00-1A-85 (hex) NV Michel Van de Wiele +00-1A-86 (hex) AdvancedIO Systems Inc +00-1A-87 (hex) Canhold International Limited +00-1A-88 (hex) Venergy,Co,Ltd +00-1A-89 (hex) Nokia Danmark A/S +00-1A-8A (hex) Samsung Electronics Co., Ltd. +00-1A-8B (hex) CHUNIL ELECTRIC IND., CO. +00-1A-8C (hex) Astaro AG +00-1A-8D (hex) AVECS Bergen GmbH +00-1A-8E (hex) 3Way Networks Ltd +00-1A-8F (hex) Nortel +00-1A-90 (hex) Trópico Sistemas e Telecomunicações da Amazônia LTDA. +00-1A-91 (hex) FusionDynamic Ltd. +00-1A-92 (hex) ASUSTek COMPUTER INC. +00-1A-93 (hex) ERCO Leuchten GmbH +00-1A-94 (hex) Votronic GmbH +00-1A-95 (hex) Hisense Mobile Communications Technoligy Co.,Ltd. +00-1A-96 (hex) ECLER S.A. +00-1A-97 (hex) fitivision technology Inc. +00-1A-98 (hex) Asotel Communication Limited Taiwan Branch +00-1A-99 (hex) Smarty (HZ) Information Electronics Co., Ltd +00-1A-9A (hex) Skyworth Digital technology(shenzhen)co.ltd. +00-1A-9B (hex) ADEC & Parter AG +00-1A-9C (hex) RightHand Technologies, Inc. +00-1A-9D (hex) Skipper Wireless, Inc. +00-1A-9E (hex) ICON Digital International Limited +00-1A-9F (hex) A-Link Europe Ltd +00-1A-A0 (hex) Dell Inc +00-1A-A1 (hex) Cisco Systems +00-1A-A2 (hex) Cisco Systems +00-1A-A3 (hex) DELORME +00-1A-A4 (hex) Future University-Hakodate +00-1A-A5 (hex) BRN Phoenix +00-1A-A6 (hex) Telefunken Radio Communication Systems GmbH &CO.KG +00-1A-A7 (hex) Torian Wireless +00-1A-A8 (hex) Mamiya Digital Imaging Co., Ltd. +00-1A-A9 (hex) FUJIAN STAR-NET COMMUNICATION CO.,LTD +00-1A-AA (hex) Analogic Corp. +00-1A-AB (hex) eWings s.r.l. +00-1A-AC (hex) Corelatus AB +00-1A-AD (hex) Motorola CHS +00-1A-AE (hex) Savant Systems LLC +00-1A-AF (hex) BLUSENS TECHNOLOGY +00-1A-B0 (hex) Signal Networks Pvt. Ltd., +00-1A-B1 (hex) Asia Pacific Satellite Industries Co., Ltd. +00-1A-B2 (hex) Cyber Solutions Inc. +00-1A-B3 (hex) VISIONITE INC. +00-1A-B4 (hex) FFEI Ltd. +00-1A-B5 (hex) Home Network System +00-1A-B6 (hex) Texas Instruments +00-1A-B7 (hex) Ethos Networks LTD. +00-1A-B8 (hex) Anseri Corporation +00-1A-B9 (hex) PMC +00-1A-BA (hex) Caton Overseas Limited +00-1A-BB (hex) Fontal Technology Incorporation +00-1A-BC (hex) U4EA Technologies Ltd +00-1A-BD (hex) Impatica Inc. +00-1A-BE (hex) COMPUTER HI-TECH INC. +00-1A-BF (hex) TRUMPF Laser Marking Systems AG +00-1A-C0 (hex) JOYBIEN TECHNOLOGIES CO., LTD. +00-1A-C1 (hex) 3Com Ltd +00-1A-C2 (hex) YEC Co.,Ltd. +00-1A-C3 (hex) Scientific-Atlanta, Inc +00-1A-C4 (hex) 2Wire, Inc +00-1A-C5 (hex) BreakingPoint Systems, Inc. +00-1A-C6 (hex) Micro Control Designs +00-1A-C7 (hex) UNIPOINT +00-1A-C8 (hex) ISL (Instrumentation Scientifique de Laboratoire) +00-1A-C9 (hex) SUZUKEN CO.,LTD +00-1A-CA (hex) Tilera Corporation +00-1A-CB (hex) Autocom Products Ltd +00-1A-CC (hex) Celestial Semiconductor, Ltd +00-1A-CD (hex) Tidel Engineering LP +00-1A-CE (hex) YUPITERU CORPORATION +00-1A-CF (hex) C.T. ELETTRONICA +00-1A-D0 (hex) Albis Technologies AG +00-1A-D1 (hex) FARGO CO., LTD. +00-1A-D2 (hex) Eletronica Nitron Ltda +00-1A-D3 (hex) Vamp Ltd. +00-1A-D4 (hex) iPOX Technology Co., Ltd. +00-1A-D5 (hex) KMC CHAIN INDUSTRIAL CO., LTD. +00-1A-D6 (hex) JIAGNSU AETNA ELECTRIC CO.,LTD +00-1A-D7 (hex) Christie Digital Systems, Inc. +00-1A-D8 (hex) AlsterAero GmbH +00-1A-D9 (hex) International Broadband Electric Communications, Inc. +00-1A-DA (hex) Biz-2-Me Inc. +00-1A-DB (hex) Motorola Mobile Devices +00-1A-DC (hex) Nokia Danmark A/S +00-1A-DD (hex) PePWave Ltd +00-1A-DE (hex) Motorola CHS +00-1A-DF (hex) Interactivetv Pty Limited +00-1A-E0 (hex) Mythology Tech Express Inc. +00-1A-E1 (hex) EDGE ACCESS INC +00-1A-E2 (hex) Cisco Systems +00-1A-E3 (hex) Cisco Systems +00-1A-E4 (hex) Medicis Technologies Corporation +00-1A-E5 (hex) Mvox Technologies Inc. +00-1A-E6 (hex) Atlanta Advanced Communications Holdings Limited +00-1A-E7 (hex) Aztek Networks, Inc. +00-1A-E8 (hex) Siemens Enterprise Communications GmbH & Co. KG +00-1A-E9 (hex) Nintendo Co., Ltd. +00-1A-EA (hex) Radio Terminal Systems Pty Ltd +00-1A-EB (hex) Allied Telesis K.K. +00-1A-EC (hex) Keumbee Electronics Co.,Ltd. +00-1A-ED (hex) INCOTEC GmbH +00-1A-EE (hex) Shenztech Ltd +00-1A-EF (hex) Loopcomm Technology, Inc. +00-1A-F0 (hex) Alcatel - IPD +00-1A-F1 (hex) Embedded Artists AB +00-1A-F2 (hex) Dynavisions Schweiz AG +00-1A-F3 (hex) Samyoung Electronics +00-1A-F4 (hex) Handreamnet +00-1A-F5 (hex) PENTAONE. CO., LTD. +00-1A-F6 (hex) Woven Systems, Inc. +00-1A-F7 (hex) dataschalt e+a GmbH +00-1A-F8 (hex) Copley Controls Corporation +00-1A-F9 (hex) AeroVIronment (AV Inc) +00-1A-FA (hex) Welch Allyn, Inc. +00-1A-FB (hex) Joby Inc. +00-1A-FC (hex) ModusLink Corporation +00-1A-FD (hex) EVOLIS +00-1A-FE (hex) SOFACREAL +00-1A-FF (hex) Wizyoung Tech. +00-1B-00 (hex) Neopost Technologies +00-1B-01 (hex) Applied Radio Technologies +00-1B-02 (hex) ED Co.Ltd +00-1B-03 (hex) Action Technology (SZ) Co., Ltd +00-1B-04 (hex) Affinity International S.p.a +00-1B-05 (hex) YMC AG +00-1B-06 (hex) Ateliers R. LAUMONIER +00-1B-07 (hex) Mendocino Software +00-1B-08 (hex) Danfoss Drives A/S +00-1B-09 (hex) Matrix Telecom Pvt. Ltd. +00-1B-0A (hex) Intelligent Distributed Controls Ltd +00-1B-0B (hex) Phidgets Inc. +00-1B-0C (hex) Cisco Systems +00-1B-0D (hex) Cisco Systems +00-1B-0E (hex) InoTec GmbH Organisationssysteme +00-1B-0F (hex) Petratec +00-1B-10 (hex) ShenZhen Kang Hui Technology Co.,ltd +00-1B-11 (hex) D-Link Corporation +00-1B-12 (hex) Apprion +00-1B-13 (hex) Icron Technologies Corporation +00-1B-14 (hex) Carex Lighting Equipment Factory +00-1B-15 (hex) Voxtel, Inc. +00-1B-16 (hex) Celtro Ltd. +00-1B-17 (hex) Palo Alto Networks +00-1B-18 (hex) Tsuken Electric Ind. Co.,Ltd +00-1B-19 (hex) IEEE 1588 Standard +00-1B-1A (hex) e-trees Japan, Inc. +00-1B-1B (hex) Siemens AG, +00-1B-1C (hex) Coherent +00-1B-1D (hex) Phoenix International Co., Ltd +00-1B-1E (hex) HART Communication Foundation +00-1B-1F (hex) DELTA - Danish Electronics, Light & Acoustics +00-1B-20 (hex) TPine Technology +00-1B-21 (hex) Intel Corporate +00-1B-22 (hex) Palit Microsystems ( H.K.) Ltd. +00-1B-23 (hex) SimpleComTools +00-1B-24 (hex) Quanta Computer Inc. +00-1B-25 (hex) Nortel +00-1B-26 (hex) RON-Telecom ZAO +00-1B-27 (hex) Merlin CSI +00-1B-28 (hex) POLYGON, JSC +00-1B-29 (hex) Avantis.Co.,Ltd +00-1B-2A (hex) Cisco Systems +00-1B-2B (hex) Cisco Systems +00-1B-2C (hex) ATRON electronic GmbH +00-1B-2D (hex) Med-Eng Systems Inc. +00-1B-2E (hex) Sinkyo Electron Inc +00-1B-2F (hex) NETGEAR Inc. +00-1B-30 (hex) Solitech Inc. +00-1B-31 (hex) Neural Image. Co. Ltd. +00-1B-32 (hex) QLogic Corporation +00-1B-33 (hex) Nokia Danmark A/S +00-1B-34 (hex) Focus System Inc. +00-1B-35 (hex) ChongQing JINOU Science & Technology Development CO.,Ltd +00-1B-36 (hex) Tsubata Engineering Co.,Ltd. (Head Office) +00-1B-37 (hex) Computec Oy +00-1B-38 (hex) COMPAL INFORMATION (KUNSHAN) CO., LTD. +00-1B-39 (hex) Proxicast +00-1B-3A (hex) SIMS Corp. +00-1B-3B (hex) Yi-Qing CO., LTD +00-1B-3C (hex) Software Technologies Group,Inc. +00-1B-3D (hex) EuroTel Spa +00-1B-3E (hex) Curtis, Inc. +00-1B-3F (hex) ProCurve Networking by HP +00-1B-40 (hex) Network Automation mxc AB +00-1B-41 (hex) General Infinity Co.,Ltd. +00-1B-42 (hex) Wise & Blue +00-1B-43 (hex) Beijing DG Telecommunications equipment Co.,Ltd +00-1B-44 (hex) SanDisk Corporation +00-1B-45 (hex) ABB AS, Division Automation Products +00-1B-46 (hex) Blueone Technology Co.,Ltd +00-1B-47 (hex) Futarque A/S +00-1B-48 (hex) Shenzhen Lantech Electronics Co., Ltd. +00-1B-49 (hex) Roberts Radio limited +00-1B-4A (hex) W&W Communications, Inc. +00-1B-4B (hex) SANION Co., Ltd. +00-1B-4C (hex) Signtech +00-1B-4D (hex) Areca Technology Corporation +00-1B-4E (hex) Navman New Zealand +00-1B-4F (hex) Avaya Inc. +00-1B-50 (hex) Nizhny Novgorod Factory named after M.Frunze, FSUE (NZiF) +00-1B-51 (hex) Vector Technology Corp. +00-1B-52 (hex) Motorola Mobile Devices +00-1B-53 (hex) Cisco Systems +00-1B-54 (hex) Cisco Systems +00-1B-55 (hex) Hurco Automation Ltd. +00-1B-56 (hex) Tehuti Networks Ltd. +00-1B-57 (hex) SEMINDIA SYSTEMS PRIVATE LIMITED +00-1B-58 (hex) ACE CAD Enterprise Co., Ltd. +00-1B-59 (hex) Sony Ericsson Mobile Communications AB +00-1B-5A (hex) Apollo Imaging Technologies, Inc. +00-1B-5B (hex) 2Wire, Inc. +00-1B-5C (hex) Azuretec Co., Ltd. +00-1B-5D (hex) Vololink Pty Ltd +00-1B-5E (hex) BPL Limited +00-1B-5F (hex) Alien Technology +00-1B-60 (hex) NAVIGON AG +00-1B-61 (hex) Digital Acoustics, LLC +00-1B-62 (hex) JHT Optoelectronics Co.,Ltd. +00-1B-63 (hex) Apple Computer Inc. +00-1B-64 (hex) IsaacLandKorea Co., Ltd, +00-1B-65 (hex) China Gridcom Co., Ltd +00-1B-66 (hex) Sennheiser electronic GmbH & Co. KG +00-1B-67 (hex) Ubiquisys Ltd +00-1B-68 (hex) Modnnet Co., Ltd +00-1B-69 (hex) Equaline Corporation +00-1B-6A (hex) Powerwave Technologies Sweden AB +00-1B-6B (hex) Swyx Solutions AG +00-1B-6C (hex) LookX Digital Media BV +00-1B-6D (hex) Midtronics, Inc. +00-1B-6E (hex) Anue Systems, Inc. +00-1B-6F (hex) Teletrak Ltd +00-1B-70 (hex) IRI Ubiteq, INC. +00-1B-71 (hex) Telular Corp. +00-1B-72 (hex) Sicep s.p.a. +00-1B-73 (hex) DTL Broadcast Ltd +00-1B-74 (hex) MiraLink Corporation +00-1B-75 (hex) Hypermedia Systems +00-1B-76 (hex) Ripcode, Inc. +00-1B-77 (hex) Intel Corporate +00-1B-78 (hex) Hewlett Packard +00-1B-79 (hex) FAIVELEY TRANSPORT +00-1B-7A (hex) Nintendo Co., Ltd. +00-1B-7B (hex) The Tintometer Ltd +00-1B-7C (hex) A & R Cambridge +00-1B-7D (hex) CXR Anderson Jacobson +00-1B-7E (hex) Beckmann GmbH +00-1B-7F (hex) TMN Technologies Telecomunicacoes Ltda +00-1B-80 (hex) LORD Corporation +00-1B-81 (hex) DATAQ Instruments, Inc. +00-1B-82 (hex) Taiwan Semiconductor Co., Ltd. +00-1B-83 (hex) Finsoft Ltd +00-1B-84 (hex) Scan Engineering Telecom +00-1B-85 (hex) MAN Diesel SE +00-1B-86 (hex) Bosch Access Systems GmbH +00-1B-87 (hex) Deepsound Tech. Co., Ltd +00-1B-88 (hex) Divinet Access Technologies Ltd +00-1B-89 (hex) EMZA Visual Sense Ltd. +00-1B-8A (hex) 2M Electronic A/S +00-1B-8B (hex) NEC AccessTechnica,Ltd. +00-1B-8C (hex) JMicron Technology Corp. +00-1B-8D (hex) Electronic Computer Systems, Inc. +00-1B-8E (hex) Hulu Sweden AB +00-1B-8F (hex) Cisco Systems +00-1B-90 (hex) Cisco Systems +00-1B-91 (hex) EFKON AG +00-1B-92 (hex) l-acoustics +00-1B-93 (hex) JC Decaux SA DNT +00-1B-94 (hex) T.E.M.A. S.p.A. +00-1B-95 (hex) VIDEO SYSTEMS SRL +00-1B-96 (hex) Snif Labs, Inc. +00-1B-97 (hex) Violin Technologies +00-1B-98 (hex) Samsung Electronics Co., Ltd. +00-1B-99 (hex) KS System GmbH +00-1B-9A (hex) Apollo Fire Detectors Ltd +00-1B-9B (hex) Hose-McCann Communications +00-1B-9C (hex) SATEL sp. z o.o. +00-1B-9D (hex) Novus Security Sp. z o.o. +00-1B-9E (hex) ASKEY COMPUTER CORP +00-1B-9F (hex) Calyptech Pty Ltd +00-1B-A0 (hex) Awox +00-1B-A1 (hex) Åmic AB +00-1B-A2 (hex) IDS Imaging Development Systems GmbH +00-1B-A3 (hex) Flexit Group GmbH +00-1B-A4 (hex) S.A.E Afikim +00-1B-A5 (hex) MyungMin Systems, Inc. +00-1B-A6 (hex) intotech inc. +00-1B-A7 (hex) Lorica Solutions +00-1B-A8 (hex) UBI&MOBI,.Inc +00-1B-A9 (hex) BROTHER INDUSTRIES, LTD. +00-1B-AA (hex) XenICs nv +00-1B-AB (hex) Telchemy, Incorporated +00-1B-AC (hex) Curtiss Wright Controls Embedded Computing +00-1B-AD (hex) iControl Incorporated +00-1B-AE (hex) Micro Control Systems, Inc +00-1B-AF (hex) Nokia Danmark A/S +00-1B-B0 (hex) BHARAT ELECTRONICS +00-1B-B1 (hex) Wistron Neweb Corp. +00-1B-B2 (hex) Intellect International NV +00-1B-B3 (hex) Condalo GmbH +00-1B-B4 (hex) Airvod Limited +00-1B-B5 (hex) ZF Electronics GmbH +00-1B-B6 (hex) Bird Electronic Corp. +00-1B-B7 (hex) Alta Heights Technology Corp. +00-1B-B8 (hex) BLUEWAY ELECTRONIC CO;LTD +00-1B-B9 (hex) Elitegroup Computer System Co. +00-1B-BA (hex) Nortel +00-1B-BB (hex) RFTech Co.,Ltd +00-1B-BC (hex) Silver Peak Systems, Inc. +00-1B-BD (hex) FMC Kongsberg Subsea AS +00-1B-BE (hex) ICOP Digital +00-1B-BF (hex) SAGEM COMMUNICATION +00-1B-C0 (hex) Juniper Networks +00-1B-C1 (hex) HOLUX Technology, Inc. +00-1B-C2 (hex) Integrated Control Technology Limitied +00-1B-C3 (hex) Mobisolution Co.,Ltd +00-1B-C4 (hex) Ultratec, Inc. +00-1B-C5 (hex) IEEE Registration Authority +00-1B-C6 (hex) Strato Rechenzentrum AG +00-1B-C7 (hex) StarVedia Technology Inc. +00-1B-C8 (hex) MIURA CO.,LTD +00-1B-C9 (hex) FSN DISPLAY INC +00-1B-CA (hex) Beijing Run Technology LTD. Company +00-1B-CB (hex) PEMPEK SYSTEMS PTY LTD +00-1B-CC (hex) KINGTEK CCTV ALLIANCE CO., LTD. +00-1B-CD (hex) DAVISCOMMS (S) PTE LTD +00-1B-CE (hex) Measurement Devices Ltd +00-1B-CF (hex) Dataupia Corporation +00-1B-D0 (hex) IDENTEC SOLUTIONS +00-1B-D1 (hex) SOGESTMATIC +00-1B-D2 (hex) ULTRA-X ASIA PACIFIC Inc. +00-1B-D3 (hex) Matsushita Electric Panasonic AVC +00-1B-D4 (hex) Cisco Systems +00-1B-D5 (hex) Cisco Systems +00-1B-D6 (hex) Kelvin Hughes Ltd +00-1B-D7 (hex) Scientific Atlanta, A Cisco Company +00-1B-D8 (hex) DVTel LTD +00-1B-D9 (hex) Edgewater Computer Systems +00-1B-DA (hex) UTStarcom Inc +00-1B-DB (hex) Valeo VECS +00-1B-DC (hex) Vencer Co., Ltd. +00-1B-DD (hex) Motorola CHS +00-1B-DE (hex) Renkus-Heinz, Inc. +00-1B-DF (hex) Iskra MIS +00-1B-E0 (hex) TELENOT ELECTRONIC GmbH +00-1B-E1 (hex) ViaLogy +00-1B-E2 (hex) AhnLab,Inc. +00-1B-E3 (hex) Health Hero Network, Inc. +00-1B-E4 (hex) TOWNET SRL +00-1B-E5 (hex) 802automation Limited +00-1B-E6 (hex) VR AG +00-1B-E7 (hex) Postek Electronics Co., Ltd. +00-1B-E8 (hex) Ultratronik GmbH +00-1B-E9 (hex) Broadcom Corporation +00-1B-EA (hex) Nintendo Co., Ltd. +00-1B-EB (hex) DMP Electronics INC. +00-1B-EC (hex) Netio Technologies Co., Ltd +00-1B-ED (hex) Brocade Communications Systems, Inc +00-1B-EE (hex) Nokia Danmark A/S +00-1B-EF (hex) Blossoms Digital Technology Co.,Ltd. +00-1B-F0 (hex) Value Platforms Limited +00-1B-F1 (hex) Nanjing SilverNet Software Co., Ltd. +00-1B-F2 (hex) KWORLD COMPUTER CO., LTD +00-1B-F3 (hex) TRANSRADIO SenderSysteme Berlin AG +00-1B-F4 (hex) KENWIN INDUSTRIAL(HK) LTD. +00-1B-F5 (hex) Tellink Sistemas de Telecomunicación S.L. +00-1B-F6 (hex) CONWISE Technology Corporation Ltd. +00-1B-F7 (hex) Lund IP Products AB +00-1B-F8 (hex) Digitrax Inc. +00-1B-F9 (hex) Intellitect Water Ltd +00-1B-FA (hex) G.i.N. mbH +00-1B-FB (hex) Alps Electric Co., Ltd +00-1B-FC (hex) ASUSTek COMPUTER INC. +00-1B-FD (hex) Dignsys Inc. +00-1B-FE (hex) Zavio Inc. +00-1B-FF (hex) Millennia Media inc. +00-1C-00 (hex) Entry Point, LLC +00-1C-01 (hex) ABB Oy Drives +00-1C-02 (hex) Atto Devices, Inc +00-1C-03 (hex) Betty TV Technology AG +00-1C-04 (hex) Airgain, Inc. +00-1C-05 (hex) Nonin Medical Inc. +00-1C-06 (hex) Siemens Numerical Control Ltd., Nanjing +00-1C-07 (hex) Cwlinux Limited +00-1C-08 (hex) Anystream, Inc. +00-1C-09 (hex) SAE Electronic Co.,Ltd. +00-1C-0A (hex) Shenzhen AEE Technology Co.,Ltd. +00-1C-0B (hex) SmartAnt Telecom +00-1C-0C (hex) TANITA Corporation +00-1C-0D (hex) G-Technology, Inc. +00-1C-0E (hex) Cisco Systems +00-1C-0F (hex) Cisco Systems +00-1C-10 (hex) Cisco-Linksys, LLC +00-1C-11 (hex) Motorola CHS +00-1C-12 (hex) Motorola Mobile Devices +00-1C-13 (hex) OPTSYS TECHNOLOGY CO., LTD. +00-1C-14 (hex) VMware, Inc +00-1C-15 (hex) TXP Corporation +00-1C-16 (hex) ThyssenKrupp Elevator +00-1C-17 (hex) Nortel +00-1C-18 (hex) Sicert S.r.L. +00-1C-19 (hex) secunet Security Networks AG +00-1C-1A (hex) Thomas Instrumentation, Inc +00-1C-1B (hex) Hyperstone GmbH +00-1C-1C (hex) Center Communication Systems GmbH +00-1C-1D (hex) CHENZHOU GOSPELL DIGITAL TECHNOLOGY CO.,LTD +00-1C-1E (hex) emtrion GmbH +00-1C-1F (hex) Quest Retail Technology Pty Ltd +00-1C-20 (hex) CLB Benelux +00-1C-21 (hex) Nucsafe Inc. +00-1C-22 (hex) Aeris Elettronica s.r.l. +00-1C-23 (hex) Dell Inc +00-1C-24 (hex) Formosa Wireless Systems Corp. +00-1C-25 (hex) Hon Hai Precision Ind. Co.,Ltd. +00-1C-26 (hex) Hon Hai Precision Ind. Co.,Ltd. +00-1C-27 (hex) Sunell Electronics Co. +00-1C-28 (hex) Sphairon Access Systems GmbH +00-1C-29 (hex) CORE DIGITAL ELECTRONICS CO., LTD +00-1C-2A (hex) Envisacor Technologies Inc. +00-1C-2B (hex) Alertme.com Limited +00-1C-2C (hex) Synapse +00-1C-2D (hex) FlexRadio Systems +00-1C-2E (hex) ProCurve Networking by HP +00-1C-2F (hex) Pfister GmbH +00-1C-30 (hex) Mode Lighting (UK ) Ltd. +00-1C-31 (hex) Mobile XP Technology Co., LTD +00-1C-32 (hex) Telian Corporation +00-1C-33 (hex) Sutron +00-1C-34 (hex) HUEY CHIAO INTERNATIONAL CO., LTD. +00-1C-35 (hex) Nokia Danmark A/S +00-1C-36 (hex) iNEWiT NV +00-1C-37 (hex) Callpod, Inc. +00-1C-38 (hex) Bio-Rad Laboratories, Inc. +00-1C-39 (hex) S Netsystems Inc. +00-1C-3A (hex) Element Labs, Inc. +00-1C-3B (hex) AmRoad Technology Inc. +00-1C-3C (hex) Seon Design Inc. +00-1C-3D (hex) WaveStorm +00-1C-3E (hex) ECKey Limited +00-1C-3F (hex) International Police Technologies, Inc. +00-1C-40 (hex) VDG-Security bv +00-1C-41 (hex) scemtec Transponder Technology GmbH +00-1C-42 (hex) Parallels, Inc. +00-1C-43 (hex) Samsung Electronics Co.,Ltd +00-1C-44 (hex) Bosch Security Systems BV +00-1C-45 (hex) Chenbro Micom Co., Ltd. +00-1C-46 (hex) QTUM +00-1C-47 (hex) Hangzhou Hollysys Automation Co., Ltd +00-1C-48 (hex) WiDeFi, Inc. +00-1C-49 (hex) Zoltan Technology Inc. +00-1C-4A (hex) AVM GmbH +00-1C-4B (hex) Gener8, Inc. +00-1C-4C (hex) Petrotest Instruments +00-1C-4D (hex) Zeetoo, Inc. +00-1C-4E (hex) TASA International Limited +00-1C-4F (hex) MACAB AB +00-1C-50 (hex) TCL Technoly Electronics(Huizhou)Co.,Ltd +00-1C-51 (hex) Celeno Communications +00-1C-52 (hex) VISIONEE SRL +00-1C-53 (hex) Synergy Lighting Controls +00-1C-54 (hex) Hillstone Networks Inc +00-1C-55 (hex) Shenzhen Kaifa Technology Co. +00-1C-56 (hex) Pado Systems, Inc. +00-1C-57 (hex) Cisco Systems +00-1C-58 (hex) Cisco Systems +00-1C-59 (hex) DEVON IT +00-1C-5A (hex) Advanced Relay Corporation +00-1C-5B (hex) Chubb Electronic Security Systems Ltd +00-1C-5C (hex) Integrated Medical Systems, Inc. +00-1C-5D (hex) Leica Microsystems +00-1C-5E (hex) ASTON France +00-1C-5F (hex) Winland Electronics, Inc. +00-1C-60 (hex) CSP Frontier Technologies,Inc. +00-1C-61 (hex) Galaxy Technology (HK) Ltd. +00-1C-62 (hex) LG Electronics Inc +00-1C-63 (hex) TRUEN +00-1C-64 (hex) Cellnet+Hunt +00-1C-65 (hex) JoeScan, Inc. +00-1C-66 (hex) UCAMP CO.,LTD +00-1C-67 (hex) Pumpkin Networks, Inc. +00-1C-68 (hex) Anhui Sun Create Electronics Co., Ltd +00-1C-69 (hex) Packet Vision Ltd +00-1C-6A (hex) Weiss Engineering Ltd. +00-1C-6B (hex) COVAX Co. Ltd +00-1C-6C (hex) Jabil Circuit (Guangzhou) Limited +00-1C-6D (hex) KYOHRITSU ELECTRONIC INDUSTRY CO., LTD. +00-1C-6E (hex) Newbury Networks, Inc. +00-1C-6F (hex) Emfit Ltd +00-1C-70 (hex) NOVACOMM LTDA +00-1C-71 (hex) Emergent Electronics +00-1C-72 (hex) Mayer & Cie GmbH & Co KG +00-1C-73 (hex) Arista Networks, Inc. +00-1C-74 (hex) Syswan Technologies Inc. +00-1C-75 (hex) RF Systems GmbH +00-1C-76 (hex) The Wandsworth Group Ltd +00-1C-77 (hex) Prodys +00-1C-78 (hex) WYPLAY SAS +00-1C-79 (hex) Cohesive Financial Technologies LLC +00-1C-7A (hex) Perfectone Netware Company Ltd +00-1C-7B (hex) Castlenet Technology Inc. +00-1C-7C (hex) PERQ SYSTEMS CORPORATION +00-1C-7D (hex) Excelpoint Manufacturing Pte Ltd +00-1C-7E (hex) Toshiba +00-1C-7F (hex) Check Point Software Technologies +00-1C-80 (hex) New Business Division/Rhea-Information CO., LTD. +00-1C-81 (hex) NextGen Venturi LTD +00-1C-82 (hex) Genew Technologies +00-1C-83 (hex) New Level Telecom Co., Ltd. +00-1C-84 (hex) STL Solution Co.,Ltd. +00-1C-85 (hex) Eunicorn +00-1C-86 (hex) Cranite Systems, Inc. +00-1C-87 (hex) Uriver Inc. +00-1C-88 (hex) TRANSYSTEM INC. +00-1C-89 (hex) Force Communications, Inc. +00-1C-8A (hex) Verari Systems Inc +00-1C-8B (hex) MJ Innovations Ltd. +00-1C-8C (hex) DIAL TECHNOLOGY LTD. +00-1C-8D (hex) Mesa Imaging +00-1C-8E (hex) Alcatel-Lucent IPD +00-1C-8F (hex) Advanced Electronic Design, Inc. +00-1C-90 (hex) Empacket Corporation +00-1C-91 (hex) Gefen Inc. +00-1C-92 (hex) Tervela +00-1C-93 (hex) ExaDigm Inc +00-1C-94 (hex) LI-COR Biosciences +00-1C-95 (hex) Opticomm Corporation +00-1C-96 (hex) Linkwise Technology Pte Ltd +00-1C-97 (hex) Enzytek Technology Inc., +00-1C-98 (hex) LUCKY TECHNOLOGY (HK) COMPANY LIMITED +00-1C-99 (hex) Shunra Software Ltd. +00-1C-9A (hex) Nokia Danmark A/S +00-1C-9B (hex) FEIG ELECTRONIC GmbH +00-1C-9C (hex) Nortel +00-1C-9D (hex) Liecthi AG +00-1C-9E (hex) Dualtech IT AB +00-1C-9F (hex) Razorstream, LLC +00-1C-A0 (hex) Production Resource Group, LLC +00-1C-A1 (hex) AKAMAI TECHNOLOGIES, INC. +00-1C-A2 (hex) PIRELLI BROADBAND SOLUTIONS +00-1C-A3 (hex) Terra +00-1C-A4 (hex) Sony Ericsson Mobile Communications +00-1C-A5 (hex) Zygo Corporation +00-1C-A6 (hex) Win4NET +00-1C-A7 (hex) International Quartz Limited +00-1C-A8 (hex) AirTies Wireless Networks +00-1C-A9 (hex) Audiomatica Srl +00-1C-AA (hex) Bellon Pty Ltd +00-1C-AB (hex) Meyer Sound Laboratories, Inc. +00-1C-AC (hex) Qniq Technology Corp. +00-1C-AD (hex) Wuhan Telecommunication Devices Co.,Ltd +00-1C-AE (hex) WiChorus, Inc. +00-1C-AF (hex) Plato Networks Inc. +00-1C-B0 (hex) Cisco Systems +00-1C-B1 (hex) Cisco Systems +00-1C-B2 (hex) BPT SPA +00-1C-B3 (hex) APPLE, INC +00-1C-B4 (hex) Iridium Satellite LLC +00-1C-B5 (hex) Neihua Network Technology Co.,LTD.(NHN) +00-1C-B6 (hex) Duzon CNT Co., Ltd. +00-1C-B7 (hex) USC DigiArk Corporation +00-1C-B8 (hex) CBC Co., Ltd +00-1C-B9 (hex) KWANG SUNG ELECTRONICS CO., LTD. +00-1C-BA (hex) VerScient, Inc. +00-1C-BB (hex) MusicianLink +00-1C-BC (hex) CastGrabber, LLC +00-1C-BD (hex) Ezze Mobile Tech., Inc. +00-1C-BE (hex) Nintendo Co., Ltd. +00-1C-BF (hex) Intel Corporate +00-1C-C0 (hex) Intel Corporate +00-1C-C1 (hex) Motorola Mobile Devices +00-1C-C2 (hex) Part II Research, Inc. +00-1C-C3 (hex) Pace Micro Technology plc +00-1C-C4 (hex) Hewlett Packard +00-1C-C5 (hex) 3COM LTD +00-1C-C6 (hex) ProStor Systems +00-1C-C7 (hex) Rembrandt Technologies, LLC d/b/a REMSTREAM +00-1C-C8 (hex) INDUSTRONIC Industrie-Electronic GmbH & Co. KG +00-1C-C9 (hex) Kaise Electronic Technology Co., Ltd. +00-1C-CA (hex) Shanghai Gaozhi Science & Technology Development Co. +00-1C-CB (hex) Forth Corporation Public Company Limited +00-1C-CC (hex) Research In Motion Limited +00-1C-CD (hex) Alektrona Corporation +00-1C-CE (hex) By Techdesign +00-1C-CF (hex) LIMETEK +00-1C-D0 (hex) Circleone Co.,Ltd. +00-1C-D1 (hex) Waves Audio LTD +00-1C-D2 (hex) King Champion (Hong Kong) Limited +00-1C-D3 (hex) ZP Engineering SEL +00-1C-D4 (hex) Nokia Danmark A/S +00-1C-D5 (hex) ZeeVee, Inc. +00-1C-D6 (hex) Nokia Danmark A/S +00-1C-D7 (hex) Harman/Becker Automotive Systems GmbH +00-1C-D8 (hex) BlueAnt Wireless +00-1C-D9 (hex) GlobalTop Technology Inc. +00-1C-DA (hex) Exegin Technologies Limited +00-1C-DB (hex) CARPOINT CO.,LTD +00-1C-DC (hex) Custom Computer Services, Inc. +00-1C-DD (hex) COWBELL ENGINEERING CO., LTD. +00-1C-DE (hex) Interactive Multimedia eXchange Inc. +00-1C-DF (hex) Belkin International Inc. +00-1C-E0 (hex) DASAN TPS +00-1C-E1 (hex) INDRA SISTEMAS, S.A. +00-1C-E2 (hex) Attero Tech, LLC. +00-1C-E3 (hex) Optimedical Systems +00-1C-E4 (hex) EleSy JSC +00-1C-E5 (hex) MBS Electronic Systems GmbH +00-1C-E6 (hex) INNES +00-1C-E7 (hex) Rocon PLC Research Centre +00-1C-E8 (hex) Cummins Inc +00-1C-E9 (hex) Galaxy Technology Limited +00-1C-EA (hex) Scientific-Atlanta, Inc +00-1C-EB (hex) Nortel +00-1C-EC (hex) Mobilesoft (Aust.) Pty Ltd +00-1C-ED (hex) ENVIRONNEMENT SA +00-1C-EE (hex) SHARP Corporation +00-1C-EF (hex) Primax Electronics LTD +00-1C-F0 (hex) D-Link Corporation +00-1C-F1 (hex) SUPoX Technology Co. , LTD. +00-1C-F2 (hex) Tenlon Technology Co.,Ltd. +00-1C-F3 (hex) EVS BROADCAST EQUIPMENT +00-1C-F4 (hex) Media Technology Systems Inc +00-1C-F5 (hex) Wiseblue Technology Limited +00-1C-F6 (hex) Cisco Systems +00-1C-F7 (hex) AudioScience +00-1C-F8 (hex) Parade Technologies, Ltd. +00-1C-F9 (hex) Cisco Systems +00-1C-FA (hex) Alarm.com +00-1C-FB (hex) Motorola CHS +00-1C-FC (hex) Suminet Communication Technologies (Shanghai) Co., Ltd. +00-1C-FD (hex) Universal Electronics +00-1C-FE (hex) Quartics Inc +00-1C-FF (hex) Napera Networks Inc +00-1D-00 (hex) Brivo Systems, LLC +00-1D-01 (hex) Neptune Digital +00-1D-02 (hex) Cybertech Telecom Development +00-1D-03 (hex) Design Solutions Inc. +00-1D-04 (hex) Zipit Wireless, Inc. +00-1D-05 (hex) iLight +00-1D-06 (hex) HM Electronics, Inc. +00-1D-07 (hex) Shenzhen Sang Fei Consumer Communications Co.,Ltd +00-1D-08 (hex) JIANGSU YINHE ELECTRONICS CO., LTD +00-1D-09 (hex) Dell Inc +00-1D-0A (hex) Davis Instruments, Inc. +00-1D-0B (hex) Power Standards Lab +00-1D-0C (hex) MobileCompia +00-1D-0D (hex) Sony Computer Entertainment inc. +00-1D-0E (hex) Agapha Technology co., Ltd. +00-1D-0F (hex) TP-LINK Technologies Co., Ltd. +00-1D-10 (hex) LightHaus Logic, Inc. +00-1D-11 (hex) Analogue & Micro Ltd +00-1D-12 (hex) ROHM CO., LTD. +00-1D-13 (hex) NextGTV +00-1D-14 (hex) SPERADTONE INFORMATION TECHNOLOGY LIMITED +00-1D-15 (hex) Shenzhen Dolphin Electronic Co., Ltd +00-1D-16 (hex) Efixo +00-1D-17 (hex) Digital Sky Corporation +00-1D-18 (hex) Power Innovation GmbH +00-1D-19 (hex) Arcadyan Technology Corporation +00-1D-1A (hex) OvisLink S.A. +00-1D-1B (hex) Sangean Electronics Inc. +00-1D-1C (hex) Gennet s.a. +00-1D-1D (hex) Inter-M Corporation +00-1D-1E (hex) KYUSHU TEN CO.,LTD +00-1D-1F (hex) Siauliu Tauro Televizoriai, JSC +00-1D-20 (hex) COMTREND CO. +00-1D-21 (hex) Alcad SL +00-1D-22 (hex) Foss Analytical A/S +00-1D-23 (hex) SENSUS +00-1D-24 (hex) Aclara Power-Line Systems Inc. +00-1D-25 (hex) Samsung Electronics Co.,Ltd +00-1D-26 (hex) Rockridgesound Technology Co. +00-1D-27 (hex) NAC-INTERCOM +00-1D-28 (hex) Sony Ericsson Mobile Communications AB +00-1D-29 (hex) Doro AB +00-1D-2A (hex) Tideway Electronic LTD +00-1D-2B (hex) Wuhan Pont Technology CO. , LTD +00-1D-2C (hex) Wavetrend Technologies (Pty) Limited +00-1D-2D (hex) Pylone, Inc. +00-1D-2E (hex) Ruckus Wireless +00-1D-2F (hex) QuantumVision Corporation +00-1D-30 (hex) YX Wireless S.A. +00-1D-31 (hex) HIGHPRO INTERNATIONAL R&D CO,.LTD. +00-1D-32 (hex) Longkay Communication & Technology (Shanghai) Co. Ltd +00-1D-33 (hex) Maverick Systems Inc. +00-1D-34 (hex) SYRIS Technology Corp +00-1D-35 (hex) Viconics Electronics Inc. +00-1D-36 (hex) ELECTRONICS CORPORATION OF INDIA LIMITED +00-1D-37 (hex) Thales-Panda Transportation System +00-1D-38 (hex) Seagate Technology +00-1D-39 (hex) MOOHADIGITAL CO., LTD +00-1D-3A (hex) mh acoustics LLC +00-1D-3B (hex) Nokia Danmark A/S +00-1D-3C (hex) Muscle Corporation +00-1D-3D (hex) Avidyne Corporation +00-1D-3E (hex) SAKA TECHNO SCIENCE CO.,LTD +00-1D-3F (hex) Mitron Pty Ltd +00-1D-40 (hex) Living Independently Group, Inc. +00-1D-41 (hex) Hardy Instruments +00-1D-42 (hex) Nortel +00-1D-43 (hex) Shenzhen G-link Digital Technology Co., Ltd. +00-1D-44 (hex) Krohne +00-1D-45 (hex) Cisco Systems +00-1D-46 (hex) Cisco Systems +00-1D-47 (hex) Covote GmbH & Co KG +00-1D-48 (hex) Sensor-Technik Wiedemann GmbH +00-1D-49 (hex) Innovation Wireless Inc. +00-1D-4A (hex) Carestream Health, Inc. +00-1D-4B (hex) Grid Connect Inc. +00-1D-4C (hex) Alcatel-Lucent +00-1D-4D (hex) Adaptive Recognition Hungary, Inc +00-1D-4E (hex) TCM Mobile LLC +00-1D-4F (hex) Apple Computer Inc. +00-1D-50 (hex) SPINETIX SA +00-1D-51 (hex) GE Energy +00-1D-52 (hex) Defzone B.V. +00-1D-53 (hex) S&O Electronics (Malaysia) Sdn. Bhd. +00-1D-54 (hex) Sunnic Technology & Merchandise INC. +00-1D-55 (hex) ZANTAZ, Inc +00-1D-56 (hex) Kramer Electronics Ltd. +00-1D-57 (hex) CAETEC Messtechnik +00-1D-58 (hex) CQ Inc +00-1D-59 (hex) Mitra Energy & Infrastructure +00-1D-5A (hex) 2Wire Inc. +00-1D-5B (hex) Tecvan Informatica Ltda +00-1D-5C (hex) Tom Communication Industrial Co.,Ltd. +00-1D-5D (hex) Control Dynamics Pty. Ltd. +00-1D-5E (hex) COMING MEDIA CORP. +00-1D-5F (hex) OverSpeed SARL +00-1D-60 (hex) ASUSTek COMPUTER INC. +00-1D-61 (hex) BIJ Corporation +00-1D-62 (hex) InPhase Technologies +00-1D-63 (hex) Miele & Cie. KG +00-1D-64 (hex) Adam Communications Systems Int Ltd +00-1D-65 (hex) Microwave Radio Communications +00-1D-66 (hex) Hyundai Telecom +00-1D-67 (hex) AMEC +00-1D-68 (hex) Thomson Telecom Belgium +00-1D-69 (hex) Knorr-Bremse AG +00-1D-6A (hex) Alpha Networks Inc. +00-1D-6B (hex) Motorola (formerly Netopia, Inc +00-1D-6C (hex) ClariPhy Communications, Inc. +00-1D-6D (hex) Confidant International LLC +00-1D-6E (hex) Nokia Danmark A/S +00-1D-6F (hex) Chainzone Technology Co., Ltd +00-1D-70 (hex) Cisco Systems +00-1D-71 (hex) Cisco Systems +00-1D-72 (hex) Wistron Corporation +00-1D-73 (hex) Buffalo Inc. +00-1D-74 (hex) Tianjin China-Silicon Microelectronics Co., Ltd. +00-1D-75 (hex) Radioscape PLC +00-1D-76 (hex) Eyeheight Ltd. +00-1D-77 (hex) NSGate +00-1D-78 (hex) Invengo Information Technology Co.,Ltd +00-1D-79 (hex) SIGNAMAX LLC +00-1D-7A (hex) Wideband Semiconductor, Inc. +00-1D-7B (hex) Ice Energy, Inc. +00-1D-7C (hex) ABE Elettronica S.p.A. +00-1D-7D (hex) GIGA-BYTE TECHNOLOGY CO.,LTD. +00-1D-7E (hex) Cisco-Linksys, LLC +00-1D-7F (hex) Tekron International Ltd +00-1D-80 (hex) Beijing Huahuan Eletronics Co.,Ltd +00-1D-81 (hex) GUANGZHOU GATEWAY ELECTRONICS CO., LTD +00-1D-82 (hex) GN A/S (GN Netcom A/S) +00-1D-83 (hex) Emitech Corporation +00-1D-84 (hex) Gateway, Inc. +00-1D-85 (hex) Call Direct Cellular Solutions +00-1D-86 (hex) Shinwa Industries(China) Ltd. +00-1D-87 (hex) VigTech Labs Sdn Bhd +00-1D-88 (hex) Clearwire +00-1D-89 (hex) VaultStor Corporation +00-1D-8A (hex) TechTrex Inc +00-1D-8B (hex) PIRELLI BROADBAND SOLUTIONS +00-1D-8C (hex) La Crosse Technology LTD +00-1D-8D (hex) Raytek GmbH +00-1D-8E (hex) Alereon, Inc. +00-1D-8F (hex) PureWave Networks +00-1D-90 (hex) EMCO Flow Systems +00-1D-91 (hex) Digitize, Inc +00-1D-92 (hex) MICRO-STAR INT'L CO.,LTD. +00-1D-93 (hex) Modacom +00-1D-94 (hex) Climax Technology Co., Ltd +00-1D-95 (hex) Flash, Inc. +00-1D-96 (hex) WatchGuard Video +00-1D-97 (hex) Alertus Technologies LLC +00-1D-98 (hex) Nokia Danmark A/S +00-1D-99 (hex) Cyan Optic, Inc. +00-1D-9A (hex) GODEX INTERNATIONAL CO., LTD +00-1D-9B (hex) Hokuyo Automatic Co., Ltd. +00-1D-9C (hex) Rockwell Automation +00-1D-9D (hex) ARTJOY INTERNATIONAL LIMITED +00-1D-9E (hex) AXION TECHNOLOGIES +00-1D-9F (hex) MATT R.P.Traczynscy Sp.J. +00-1D-A0 (hex) Heng Yu Electronic Manufacturing Company Limited +00-1D-A1 (hex) Cisco Systems +00-1D-A2 (hex) Cisco Systems +00-1D-A3 (hex) SabiOso +00-1D-A4 (hex) Hangzhou System Technology CO., LTD +00-1D-A5 (hex) WB Electronics +00-1D-A6 (hex) Media Numerics Limited +00-1D-A7 (hex) Seamless Internet +00-1D-A8 (hex) Takahata Electronics Co.,Ltd +00-1D-A9 (hex) Castles Technology, Co., LTD +00-1D-AA (hex) DrayTek Corp. +00-1D-AB (hex) SwissQual License AG +00-1D-AC (hex) Gigamon Systems LLC +00-1D-AD (hex) Sinotech Engineering Consultants, Inc. Geotechnical Enginee +00-1D-AE (hex) CHANG TSENG TECHNOLOGY CO., LTD +00-1D-AF (hex) Nortel +00-1D-B0 (hex) FuJian HengTong Information Technology Co.,Ltd +00-1D-B1 (hex) Crescendo Networks +00-1D-B2 (hex) HOKKAIDO ELECTRIC ENGINEERING CO.,LTD. +00-1D-B3 (hex) ProCurve Networking by HP +00-1D-B4 (hex) KUMHO ENG CO.,LTD +00-1D-B5 (hex) Juniper networks +00-1D-B6 (hex) BestComm Networks, Inc. +00-1D-B7 (hex) Tendril Networks, Inc. +00-1D-B8 (hex) Intoto Inc. +00-1D-B9 (hex) Wellspring Wireless +00-1D-BA (hex) Sony Corporation +00-1D-BB (hex) Dynamic System Electronics Corp. +00-1D-BC (hex) Nintendo Co., Ltd. +00-1D-BD (hex) Versamed Inc. +00-1D-BE (hex) Motorola Mobile Devices +00-1D-BF (hex) Radiient Technologies, Inc. +00-1D-C0 (hex) Enphase Energy +00-1D-C1 (hex) Audinate +00-1D-C2 (hex) XORTEC OY +00-1D-C3 (hex) RIKOR TV, Ltd +00-1D-C4 (hex) AIOI Systems Co., Ltd. +00-1D-C5 (hex) Beijing Jiaxun Feihong Electricial Co., Ltd. +00-1D-C6 (hex) SNR Inc. +00-1D-C7 (hex) L-3 Communications Geneva Aerospace +00-1D-C8 (hex) ScadaMetrcs, LLC. +00-1D-C9 (hex) GainSpan Corp. +00-1D-CA (hex) PAV Electronics Limited +00-1D-CB (hex) Exéns Development Oy +00-1D-CC (hex) Hetra Secure Solutions +00-1D-CD (hex) ARRIS Group, Inc. +00-1D-CE (hex) ARRIS Group, Inc. +00-1D-CF (hex) ARRIS Group, Inc. +00-1D-D0 (hex) ARRIS Group, Inc. +00-1D-D1 (hex) ARRIS Group, Inc. +00-1D-D2 (hex) ARRIS Group, Inc. +00-1D-D3 (hex) ARRIS Group, Inc. +00-1D-D4 (hex) ARRIS Group, Inc. +00-1D-D5 (hex) ARRIS Group, Inc. +00-1D-D6 (hex) ARRIS Group, Inc. +00-1D-D7 (hex) Algolith +00-1D-D8 (hex) Microsoft Corporation +00-1D-D9 (hex) Hon Hai Precision Ind.Co.,Ltd. +00-1D-DA (hex) Mikroelektronika spol. s r. o. +00-1D-DB (hex) C-BEL Corporation +00-1D-DC (hex) HangZhou DeChangLong Tech&Info Co.,Ltd +00-1D-DD (hex) DAT H.K. LIMITED +00-1D-DE (hex) Zhejiang Broadcast&Television Technology Co.,Ltd. +00-1D-DF (hex) Sunitec Enterprise Co., Ltd. +00-1D-E0 (hex) Intel Corporate +00-1D-E1 (hex) Intel Corporate +00-1D-E2 (hex) Radionor Communications +00-1D-E3 (hex) Intuicom +00-1D-E4 (hex) Visioneered Image Systems +00-1D-E5 (hex) Cisco Systems +00-1D-E6 (hex) Cisco Systems +00-1D-E7 (hex) Marine Sonic Technology, Ltd. +00-1D-E8 (hex) Nikko Denki Tsushin Company(NDTC) +00-1D-E9 (hex) Nokia Danmark A/S +00-1D-EA (hex) Commtest Instruments Ltd +00-1D-EB (hex) DINEC International +00-1D-EC (hex) Marusys +00-1D-ED (hex) Grid Net, Inc. +00-1D-EE (hex) NEXTVISION SISTEMAS DIGITAIS DE TELEVISÃO LTDA. +00-1D-EF (hex) TRIMM, INC. +00-1D-F0 (hex) Vidient Systems, Inc. +00-1D-F1 (hex) Intego Systems, Inc. +00-1D-F2 (hex) Netflix, Inc. +00-1D-F3 (hex) SBS Science & Technology Co., Ltd +00-1D-F4 (hex) Magellan Technology Pty Limited +00-1D-F5 (hex) Sunshine Co,LTD +00-1D-F6 (hex) Samsung Electronics Co.,Ltd +00-1D-F7 (hex) R. STAHL Schaltgeräte GmbH +00-1D-F8 (hex) Webpro Vision Technology Corporation +00-1D-F9 (hex) Cybiotronics (Far East) Limited +00-1D-FA (hex) Fujian LANDI Commercial Equipment Co.,Ltd +00-1D-FB (hex) NETCLEUS Systems Corporation +00-1D-FC (hex) KSIC +00-1D-FD (hex) Nokia Danmark A/S +00-1D-FE (hex) Palm, Inc +00-1D-FF (hex) Network Critical Solutions Ltd +00-1E-00 (hex) Shantou Institute of Ultrasonic Instruments +00-1E-01 (hex) Renesas Technology Sales Co., Ltd. +00-1E-02 (hex) Sougou Keikaku Kougyou Co.,Ltd. +00-1E-03 (hex) LiComm Co., Ltd. +00-1E-04 (hex) Hanson Research Corporation +00-1E-05 (hex) Xseed Technologies & Computing +00-1E-06 (hex) WIBRAIN +00-1E-07 (hex) Winy Technology Co., Ltd. +00-1E-08 (hex) Centec Networks Inc +00-1E-09 (hex) ZEFATEK Co.,LTD +00-1E-0A (hex) Syba Tech Limited +00-1E-0B (hex) Hewlett Packard +00-1E-0C (hex) Sherwood Information Partners, Inc. +00-1E-0D (hex) Micran Ltd. +00-1E-0E (hex) MAXI VIEW HOLDINGS LIMITED +00-1E-0F (hex) Briot International +00-1E-10 (hex) ShenZhen Huawei Communication Technologies Co.,Ltd. +00-1E-11 (hex) ELELUX INTERNATIONAL LTD +00-1E-12 (hex) Ecolab +00-1E-13 (hex) Cisco Systems +00-1E-14 (hex) Cisco Systems +00-1E-15 (hex) Beech Hill Electronics +00-1E-16 (hex) Keytronix +00-1E-17 (hex) STN BV +00-1E-18 (hex) Radio Activity srl +00-1E-19 (hex) GTRI +00-1E-1A (hex) Best Source Taiwan Inc. +00-1E-1B (hex) Digital Stream Technology, Inc. +00-1E-1C (hex) SWS Australia Pty Limited +00-1E-1D (hex) East Coast Datacom, Inc. +00-1E-1E (hex) Honeywell Life Safety +00-1E-1F (hex) Nortel +00-1E-20 (hex) Intertain Inc. +00-1E-21 (hex) Qisda Co. +00-1E-22 (hex) ARVOO Imaging Products BV +00-1E-23 (hex) Electronic Educational Devices, Inc +00-1E-24 (hex) Zhejiang Bell Technology Co.,ltd +00-1E-25 (hex) Intek Digital Inc +00-1E-26 (hex) Digifriends Co. Ltd +00-1E-27 (hex) SBN TECH Co.,Ltd. +00-1E-28 (hex) Lumexis Corporation +00-1E-29 (hex) Hypertherm Inc +00-1E-2A (hex) Netgear Inc. +00-1E-2B (hex) Radio Systems Design, Inc. +00-1E-2C (hex) CyVerse Corporation +00-1E-2D (hex) STIM +00-1E-2E (hex) SIRTI S.p.A. +00-1E-2F (hex) DiMoto Pty Ltd +00-1E-30 (hex) Shireen Inc +00-1E-31 (hex) INFOMARK CO.,LTD. +00-1E-32 (hex) Zensys +00-1E-33 (hex) Inventec Corporation +00-1E-34 (hex) CryptoMetrics +00-1E-35 (hex) Nintendo Co., Ltd. +00-1E-36 (hex) IPTE +00-1E-37 (hex) USI +00-1E-38 (hex) Bluecard Software Technology Co., Ltd. +00-1E-39 (hex) Comsys Communication Ltd. +00-1E-3A (hex) Nokia Danmark A/S +00-1E-3B (hex) Nokia Danmark A/S +00-1E-3C (hex) Lyngbox Media AB +00-1E-3D (hex) Alps Electric Co., Ltd +00-1E-3E (hex) KMW Inc. +00-1E-3F (hex) TrellisWare Technologies, Inc. +00-1E-40 (hex) Shanghai DareGlobal Technologies Co.,Ltd. +00-1E-41 (hex) Microwave Communication & Component, Inc. +00-1E-42 (hex) Teltonika +00-1E-43 (hex) AISIN AW CO.,LTD. +00-1E-44 (hex) SANTEC +00-1E-45 (hex) Sony Ericsson Mobile Communications AB +00-1E-46 (hex) Motorola CHS +00-1E-47 (hex) PT. Hariff Daya Tunggal Engineering +00-1E-48 (hex) Wi-Links +00-1E-49 (hex) Cisco Systems +00-1E-4A (hex) Cisco Systems +00-1E-4B (hex) City Theatrical +00-1E-4C (hex) Hon Hai Precision Ind.Co., Ltd. +00-1E-4D (hex) Welkin Sciences, LLC +00-1E-4E (hex) DAKO EDV-Ingenieur- und Systemhaus GmbH +00-1E-4F (hex) Dell Inc. +00-1E-50 (hex) BATTISTONI RESEARCH +00-1E-51 (hex) Converter Industry Srl +00-1E-52 (hex) Apple Computer Inc +00-1E-53 (hex) Further Tech Co., LTD +00-1E-54 (hex) TOYO ELECTRIC Corporation +00-1E-55 (hex) COWON SYSTEMS,Inc. +00-1E-56 (hex) Bally Wulff Entertainment GmbH +00-1E-57 (hex) ALCOMA, spol. s r.o. +00-1E-58 (hex) D-Link Corporation +00-1E-59 (hex) Silicon Turnkey Express, LLC +00-1E-5A (hex) Motorola CHS +00-1E-5B (hex) Unitron Company, Inc. +00-1E-5C (hex) RB GeneralEkonomik +00-1E-5D (hex) Holosys d.o.o. +00-1E-5E (hex) COmputime Ltd. +00-1E-5F (hex) KwikByte, LLC +00-1E-60 (hex) Digital Lighting Systems, Inc +00-1E-61 (hex) ITEC GmbH +00-1E-62 (hex) Siemon +00-1E-63 (hex) Vibro-Meter SA +00-1E-64 (hex) Intel Corporate +00-1E-65 (hex) Intel Corporate +00-1E-66 (hex) RESOL Elektronische Regelungen GmbH +00-1E-67 (hex) Intel Corporate +00-1E-68 (hex) Quanta Computer +00-1E-69 (hex) Thomson Inc. +00-1E-6A (hex) Beijing Bluexon Technology Co.,Ltd +00-1E-6B (hex) Scientific Atlanta, A Cisco Company +00-1E-6C (hex) Carbon Mountain LLC +00-1E-6D (hex) IT R&D Center +00-1E-6E (hex) Shenzhen First Mile Communications Ltd +00-1E-6F (hex) Magna-Power Electronics, Inc. +00-1E-70 (hex) Cobham Defence Communications Ltd +00-1E-71 (hex) IgeaCare Systems Inc. +00-1E-72 (hex) PCS +00-1E-73 (hex) ZTE CORPORATION +00-1E-74 (hex) SAGEM COMMUNICATION +00-1E-75 (hex) LG Electronics +00-1E-76 (hex) Thermo Fisher Scientific +00-1E-77 (hex) Air2App +00-1E-78 (hex) Owitek Technology Ltd., +00-1E-79 (hex) Cisco Systems +00-1E-7A (hex) Cisco Systems +00-1E-7B (hex) R.I.CO. S.r.l. +00-1E-7C (hex) Taiwick Limited +00-1E-7D (hex) Samsung Electronics Co.,Ltd +00-1E-7E (hex) Nortel +00-1E-7F (hex) CBM of America +00-1E-80 (hex) Last Mile Ltd. +00-1E-81 (hex) CNB Technology Inc. +00-1E-82 (hex) Pliant Technology, Inc. +00-1E-83 (hex) LAN/MAN Standards Association (LMSC) +00-1E-84 (hex) Pika Technologies Inc. +00-1E-85 (hex) Lagotek Corporation +00-1E-86 (hex) MEL Co.,Ltd. +00-1E-87 (hex) Realease Limited +00-1E-88 (hex) ANDOR SYSTEM SUPPORT CO., LTD. +00-1E-89 (hex) CRFS Limited +00-1E-8A (hex) eCopy, Inc +00-1E-8B (hex) Infra Access Korea Co., Ltd. +00-1E-8C (hex) ASUSTek COMPUTER INC. +00-1E-8D (hex) Motorola Mobile Devices +00-1E-8E (hex) Hunkeler AG +00-1E-8F (hex) CANON INC. +00-1E-90 (hex) Elitegroup Computer Systems Co +00-1E-91 (hex) KIMIN Electronic Co., Ltd. +00-1E-92 (hex) JEULIN S.A. +00-1E-93 (hex) CiriTech Systems Inc +00-1E-94 (hex) SUPERCOM TECHNOLOGY CORPORATION +00-1E-95 (hex) SIGMALINK +00-1E-96 (hex) Sepura Plc +00-1E-97 (hex) Medium Link System Technology CO., LTD, +00-1E-98 (hex) GreenLine Communications +00-1E-99 (hex) Vantanol Industrial Corporation +00-1E-9A (hex) HAMILTON Bonaduz AG +00-1E-9B (hex) San-Eisha, Ltd. +00-1E-9C (hex) Fidustron INC +00-1E-9D (hex) Recall Technologies, Inc. +00-1E-9E (hex) ddm hopt + schuler Gmbh + Co. KG +00-1E-9F (hex) Visioneering Systems, Inc. +00-1E-A0 (hex) XLN-t +00-1E-A1 (hex) Brunata a/s +00-1E-A2 (hex) Symx Systems, Inc. +00-1E-A3 (hex) Nokia Danmark A/S +00-1E-A4 (hex) Nokia Danmark A/S +00-1E-A5 (hex) ROBOTOUS, Inc. +00-1E-A6 (hex) Best IT World (India) Pvt. Ltd. +00-1E-A7 (hex) ActionTec Electronics, Inc +00-1E-A8 (hex) Datang Mobile Communications Equipment CO.,LTD +00-1E-A9 (hex) Nintendo Co., Ltd. +00-1E-AA (hex) E-Senza Technologies GmbH +00-1E-AB (hex) TeleWell Oy +00-1E-AC (hex) Armadeus Systems +00-1E-AD (hex) Wingtech Group Limited +00-1E-AE (hex) Continental Automotive Systems +00-1E-AF (hex) Ophir Optronics Ltd +00-1E-B0 (hex) ImesD Electronica S.L. +00-1E-B1 (hex) Cryptsoft Pty Ltd +00-1E-B2 (hex) LG innotek +00-1E-B3 (hex) Primex Wireless +00-1E-B4 (hex) UNIFAT TECHNOLOGY LTD. +00-1E-B5 (hex) Ever Sparkle Technologies Ltd +00-1E-B6 (hex) TAG Heuer SA +00-1E-B7 (hex) TBTech, Co., Ltd. +00-1E-B8 (hex) Fortis, Inc. +00-1E-B9 (hex) Sing Fai Technology Limited +00-1E-BA (hex) High Density Devices AS +00-1E-BB (hex) BLUELIGHT TECHNOLOGY INC. +00-1E-BC (hex) WINTECH AUTOMATION CO.,LTD. +00-1E-BD (hex) Cisco Systems +00-1E-BE (hex) Cisco Systems +00-1E-BF (hex) Haas Automation Inc. +00-1E-C0 (hex) ZeroG Wireless Inc. +00-1E-C1 (hex) 3COM EUROPE LTD +00-1E-C2 (hex) Apple, Inc +00-1E-C3 (hex) Kozio, Inc. +00-1E-C4 (hex) Celio Corp +00-1E-C5 (hex) Middle Atlantic Products Inc +00-1E-C6 (hex) Obvius Holdings LLC +00-1E-C7 (hex) 2Wire +00-1E-C8 (hex) Rapid Mobile (Pty) Ltd +00-1E-C9 (hex) Dell Inc +00-1E-CA (hex) Nortel +00-1E-CB (hex) "RPC "Energoautomatika" Ltd +00-1E-CC (hex) CDVI +00-1E-CD (hex) KYLAND +00-1E-CE (hex) BISA Technologies (Hong Kong) Limited +00-1E-CF (hex) PHILIPS ELECTRONICS UK LTD +00-1E-D0 (hex) CONNEXIUM +00-1E-D1 (hex) Keyprocessor B.V. +00-1E-D2 (hex) Ray Shine Video Technology Inc +00-1E-D3 (hex) Dot Technology Int'l Co., Ltd. +00-1E-D4 (hex) Doble Engineering +00-1E-D5 (hex) Tekon-Automatics +00-1E-D6 (hex) Alentec & Orion AB +00-1E-D7 (hex) H-Stream Wireless, Inc. +00-1E-D8 (hex) Digital United Inc. +00-1E-D9 (hex) Mitsubishi Precision Co.,LTd. +00-1E-DA (hex) Wesemann Elektrotechniek B.V. +00-1E-DB (hex) Giken Trastem Co., Ltd. +00-1E-DC (hex) Sony Ericsson Mobile Communications AB +00-1E-DD (hex) WASKO S.A. +00-1E-DE (hex) BYD COMPANY LIMITED +00-1E-DF (hex) Master Industrialization Center Kista +00-1E-E0 (hex) Urmet Domus SpA +00-1E-E1 (hex) Samsung Electronics Co.,Ltd +00-1E-E2 (hex) Samsung Electronics Co.,Ltd +00-1E-E3 (hex) T&W Electronics (ShenZhen) Co.,Ltd +00-1E-E4 (hex) ACS Solutions France +00-1E-E5 (hex) Cisco-Linksys, LLC +00-1E-E6 (hex) Shenzhen Advanced Video Info-Tech Co., Ltd. +00-1E-E7 (hex) Epic Systems Inc +00-1E-E8 (hex) Mytek +00-1E-E9 (hex) Stoneridge Electronics AB +00-1E-EA (hex) Sensor Switch, Inc. +00-1E-EB (hex) Talk-A-Phone Co. +00-1E-EC (hex) COMPAL INFORMATION (KUNSHAN) CO., LTD. +00-1E-ED (hex) Adventiq Ltd. +00-1E-EE (hex) ETL Systems Ltd +00-1E-EF (hex) Cantronic International Limited +00-1E-F0 (hex) Gigafin Networks +00-1E-F1 (hex) Servimat +00-1E-F2 (hex) Micro Motion Inc +00-1E-F3 (hex) From2 +00-1E-F4 (hex) L-3 Communications Display Systems +00-1E-F5 (hex) Hitek Automated Inc. +00-1E-F6 (hex) Cisco Systems +00-1E-F7 (hex) Cisco Systems +00-1E-F8 (hex) Emfinity Inc. +00-1E-F9 (hex) Pascom Kommunikations systeme GmbH. +00-1E-FA (hex) PROTEI Ltd. +00-1E-FB (hex) Trio Motion Technology Ltd +00-1E-FC (hex) JSC "MASSA-K" +00-1E-FD (hex) Microbit 2.0 AB +00-1E-FE (hex) LEVEL s.r.o. +00-1E-FF (hex) Mueller-Elektronik GmbH & Co. KG +00-1F-00 (hex) Nokia Danmark A/S +00-1F-01 (hex) Nokia Danmark A/S +00-1F-02 (hex) Pixelmetrix Corporation Pte Ltd +00-1F-03 (hex) NUM AG +00-1F-04 (hex) Granch Ltd. +00-1F-05 (hex) iTAS Technology Corp. +00-1F-06 (hex) Integrated Dispatch Solutions +00-1F-07 (hex) AZTEQ Mobile +00-1F-08 (hex) RISCO LTD +00-1F-09 (hex) JASTEC CO., LTD. +00-1F-0A (hex) Nortel +00-1F-0B (hex) Federal State Unitary Enterprise Industrial Union"Electropribor" +00-1F-0C (hex) Intelligent Digital Services GmbH +00-1F-0D (hex) L3 Communications - Telemetry West +00-1F-0E (hex) Japan Kyastem Co., Ltd +00-1F-0F (hex) Select Engineered Systems +00-1F-10 (hex) TOLEDO DO BRASIL INDUSTRIA DE BALANCAS LTDA +00-1F-11 (hex) OPENMOKO, INC. +00-1F-12 (hex) Juniper Networks +00-1F-13 (hex) S.& A.S. Ltd. +00-1F-14 (hex) NexG +00-1F-15 (hex) Bioscrypt Inc +00-1F-16 (hex) Wistron Corporation +00-1F-17 (hex) IDX Company, Ltd. +00-1F-18 (hex) Hakusan.Mfg.Co,.Ltd +00-1F-19 (hex) BEN-RI ELECTRONICA S.A. +00-1F-1A (hex) Prominvest +00-1F-1B (hex) RoyalTek Company Ltd. +00-1F-1C (hex) KOBISHI ELECTRIC Co.,Ltd. +00-1F-1D (hex) Atlas Material Testing Technology LLC +00-1F-1E (hex) Astec Technology Co., Ltd +00-1F-1F (hex) Edimax Technology Co. Ltd. +00-1F-20 (hex) Logitech Europe SA +00-1F-21 (hex) Inner Mongolia Yin An Science & Technology Development Co.,L +00-1F-22 (hex) Fiberxon, Inc. +00-1F-23 (hex) Interacoustics +00-1F-24 (hex) DIGITVIEW TECHNOLOGY CO., LTD. +00-1F-25 (hex) MBS GmbH +00-1F-26 (hex) Cisco Systems +00-1F-27 (hex) Cisco Systems +00-1F-28 (hex) ProCurve Networking by HP +00-1F-29 (hex) Hewlett Packard +00-1F-2A (hex) ACCM +00-1F-2B (hex) Orange Logic +00-1F-2C (hex) Starbridge Networks +00-1F-2D (hex) Electro-Optical Imaging, Inc. +00-1F-2E (hex) Triangle Research Int'l Pte Ltd +00-1F-2F (hex) Berker GmbH & Co. KG +00-1F-30 (hex) Travelping +00-1F-31 (hex) Radiocomp +00-1F-32 (hex) Nintendo Co., Ltd. +00-1F-33 (hex) Netgear Inc. +00-1F-34 (hex) Lung Hwa Electronics Co., Ltd. +00-1F-35 (hex) AIR802 LLC +00-1F-36 (hex) Bellwin Information Co. Ltd., +00-1F-37 (hex) Genesis I&C +00-1F-38 (hex) POSITRON +00-1F-39 (hex) Construcciones y Auxiliar de Ferrocarriles, S.A. +00-1F-3A (hex) Hon Hai Precision Ind.Co., Ltd. +00-1F-3B (hex) Intel Corporate +00-1F-3C (hex) Intel Corporate +00-1F-3D (hex) Qbit GmbH +00-1F-3E (hex) RP-Technik e.K. +00-1F-3F (hex) AVM GmbH +00-1F-40 (hex) Speakercraft Inc. +00-1F-41 (hex) Ruckus Wireless +00-1F-42 (hex) Etherstack Pty Ltd +00-1F-43 (hex) ENTES ELEKTRONIK +00-1F-44 (hex) GE Transportation Systems +00-1F-45 (hex) Enterasys +00-1F-46 (hex) Nortel +00-1F-47 (hex) MCS Logic Inc. +00-1F-48 (hex) Mojix Inc. +00-1F-49 (hex) Eurosat Distribution Ltd +00-1F-4A (hex) Albentia Systems S.A. +00-1F-4B (hex) Lineage Power +00-1F-4C (hex) Roseman Engineering Ltd +00-1F-4D (hex) Segnetics LLC +00-1F-4E (hex) ConMed Linvatec +00-1F-4F (hex) Thinkware Co. Ltd. +00-1F-50 (hex) Swissdis AG +00-1F-51 (hex) HD Communications Corp +00-1F-52 (hex) UVT Unternehmensberatung für Verkehr und Technik GmbH +00-1F-53 (hex) GEMAC Gesellschaft für Mikroelektronikanwendung Chemnitz mbH +00-1F-54 (hex) Lorex Technology Inc. +00-1F-55 (hex) Honeywell Security (China) Co., Ltd. +00-1F-56 (hex) DIGITAL FORECAST +00-1F-57 (hex) Phonik Innovation Co.,LTD +00-1F-58 (hex) EMH Energiemesstechnik GmbH +00-1F-59 (hex) Kronback Tracers +00-1F-5A (hex) Beckwith Electric Co. +00-1F-5B (hex) Apple, Inc. +00-1F-5C (hex) Nokia Danmark A/S +00-1F-5D (hex) Nokia Danmark A/S +00-1F-5E (hex) Dyna Technology Co.,Ltd. +00-1F-5F (hex) Blatand GmbH +00-1F-60 (hex) COMPASS SYSTEMS CORP. +00-1F-61 (hex) Talent Communication Networks Inc. +00-1F-62 (hex) JSC "Stilsoft" +00-1F-63 (hex) JSC Goodwin-Europa +00-1F-64 (hex) Beijing Autelan Technology Inc. +00-1F-65 (hex) KOREA ELECTRIC TERMINAL CO., LTD. +00-1F-66 (hex) PLANAR LLC +00-1F-67 (hex) Hitachi,Ltd. +00-1F-68 (hex) Martinsson Elektronik AB +00-1F-69 (hex) Pingood Technology Co., Ltd. +00-1F-6A (hex) PacketFlux Technologies, Inc. +00-1F-6B (hex) LG Electronics +00-1F-6C (hex) Cisco Systems +00-1F-6D (hex) Cisco Systems +00-1F-6E (hex) Vtech Engineering Corporation +00-1F-6F (hex) Fujian Sunnada Communication Co.,Ltd. +00-1F-70 (hex) Botik Technologies LTD +00-1F-71 (hex) xG Technology, Inc. +00-1F-72 (hex) QingDao Hiphone Technology Co,.Ltd +00-1F-73 (hex) Teraview Technology Co., Ltd. +00-1F-74 (hex) Eigen Development +00-1F-75 (hex) GiBahn Media +00-1F-76 (hex) AirLogic Systems Inc. +00-1F-77 (hex) HEOL DESIGN +00-1F-78 (hex) Blue Fox Porini Textile +00-1F-79 (hex) Lodam Electronics A/S +00-1F-7A (hex) WiWide Inc. +00-1F-7B (hex) TechNexion Ltd. +00-1F-7C (hex) Witelcom AS +00-1F-7D (hex) embedded wireless GmbH +00-1F-7E (hex) Motorola Mobile Devices +00-1F-7F (hex) Phabrix Limited +00-1F-80 (hex) Lucas Holding bv +00-1F-81 (hex) Accel Semiconductor Corp +00-1F-82 (hex) Cal-Comp Electronics & Communications Co., Ltd +00-1F-83 (hex) Teleplan Technology Services Sdn Bhd +00-1F-84 (hex) Gigle Semiconductor +00-1F-85 (hex) Apriva ISS, LLC +00-1F-86 (hex) digEcor +00-1F-87 (hex) Skydigital Inc. +00-1F-88 (hex) FMS Force Measuring Systems AG +00-1F-89 (hex) Signalion GmbH +00-1F-8A (hex) Ellion Digital Inc. +00-1F-8B (hex) Storspeed, Inc. +00-1F-8C (hex) CCS Inc. +00-1F-8D (hex) Ingenieurbuero Stark GmbH und Ko. KG +00-1F-8E (hex) Metris USA Inc. +00-1F-8F (hex) Shanghai Bellmann Digital Source Co.,Ltd. +00-1F-90 (hex) Actiontec Electronics, Inc +00-1F-91 (hex) DBS Lodging Technologies, LLC +00-1F-92 (hex) VideoIQ, Inc. +00-1F-93 (hex) Xiotech Corporation +00-1F-94 (hex) Lascar Electronics Ltd +00-1F-95 (hex) SAGEM COMMUNICATION +00-1F-96 (hex) APROTECH CO.LTD +00-1F-97 (hex) BERTANA SRL +00-1F-98 (hex) DAIICHI-DENTSU LTD. +00-1F-99 (hex) SERONICS co.ltd +00-1F-9A (hex) Nortel Networks +00-1F-9B (hex) POSBRO +00-1F-9C (hex) LEDCO +00-1F-9D (hex) Cisco Systems +00-1F-9E (hex) Cisco Systems +00-1F-9F (hex) Thomson Telecom Belgium +00-1F-A0 (hex) A10 Networks +00-1F-A1 (hex) Gtran Inc +00-1F-A2 (hex) Datron World Communications, Inc. +00-1F-A3 (hex) T&W Electronics(Shenzhen)Co.,Ltd. +00-1F-A4 (hex) ShenZhen Gongjin Electronics Co.,Ltd +00-1F-A5 (hex) Blue-White Industries +00-1F-A6 (hex) Stilo srl +00-1F-A7 (hex) Sony Computer Entertainment Inc. +00-1F-A8 (hex) ANI Technologies Corp. +00-1F-A9 (hex) Atlanta DTH, Inc. +00-1F-AA (hex) Taseon, Inc. +00-1F-AB (hex) I.S HIGH TECH.INC +00-1F-AC (hex) Goodmill Systems Ltd +00-1F-AD (hex) Brown Innovations, Inc +00-1F-AE (hex) Blick South Africa (Pty) Ltd +00-1F-AF (hex) NextIO, Inc. +00-1F-B0 (hex) TimeIPS, Inc. +00-1F-B1 (hex) Cybertech Inc. +00-1F-B2 (hex) Sontheim Industrie Elektronik GmbH +00-1F-B3 (hex) 2Wire +00-1F-B4 (hex) SmartShare Systems +00-1F-B5 (hex) I/O Interconnect Inc. +00-1F-B6 (hex) Chi Lin Technology Co., Ltd. +00-1F-B7 (hex) WiMate Technologies Corp. +00-1F-B8 (hex) Universal Remote Control, Inc. +00-1F-B9 (hex) Paltronics +00-1F-BA (hex) BoYoung Tech. & Marketing, Inc. +00-1F-BB (hex) Xenatech Co.,LTD +00-1F-BC (hex) EVGA Corporation +00-1F-BD (hex) Kyocera Wireless Corp. +00-1F-BE (hex) Shenzhen Mopnet Industrial Co.,Ltd +00-1F-BF (hex) Fulhua Microelectronics Corp. Taiwan Branch +00-1F-C0 (hex) Control Express Finland Oy +00-1F-C1 (hex) Hanlong Technology Co.,LTD +00-1F-C2 (hex) Jow Tong Technology Co Ltd +00-1F-C3 (hex) SmartSynch, Inc +00-1F-C4 (hex) Motorola CHS +00-1F-C5 (hex) Nintendo Co., Ltd. +00-1F-C6 (hex) ASUSTek COMPUTER INC. +00-1F-C7 (hex) Casio Hitachi Mobile Comunications Co., Ltd. +00-1F-C8 (hex) Up-Today Industrial Co., Ltd. +00-1F-C9 (hex) Cisco Systems +00-1F-CA (hex) Cisco Systems +00-1F-CB (hex) NIW Solutions +00-1F-CC (hex) Samsung Electronics Co.,Ltd +00-1F-CD (hex) Samsung Electronics +00-1F-CE (hex) QTECH LLC +00-1F-CF (hex) MSI Technology GmbH +00-1F-D0 (hex) GIGA-BYTE TECHNOLOGY CO.,LTD. +00-1F-D1 (hex) OPTEX CO.,LTD. +00-1F-D2 (hex) COMMTECH TECHNOLOGY MACAO COMMERCIAL OFFSHORE LTD. +00-1F-D3 (hex) RIVA Networks Inc. +00-1F-D4 (hex) 4IPNET, INC. +00-1F-D5 (hex) MICRORISC s.r.o. +00-1F-D6 (hex) Shenzhen Allywll +00-1F-D7 (hex) TELERAD SA +00-1F-D8 (hex) A-TRUST COMPUTER CORPORATION +00-1F-D9 (hex) RSD Communications Ltd +00-1F-DA (hex) Nortel Networks +00-1F-DB (hex) Network Supply Corp., +00-1F-DC (hex) Mobile Safe Track Ltd +00-1F-DD (hex) GDI LLC +00-1F-DE (hex) Nokia Danmark A/S +00-1F-DF (hex) Nokia Danmark A/S +00-1F-E0 (hex) EdgeVelocity Corp +00-1F-E1 (hex) Hon Hai Precision Ind. Co., Ltd. +00-1F-E2 (hex) Hon Hai Precision Ind. Co., Ltd. +00-1F-E3 (hex) LG Electronics +00-1F-E4 (hex) Sony Ericsson Mobile Communications +00-1F-E5 (hex) In-Circuit GmbH +00-1F-E6 (hex) Alphion Corporation +00-1F-E7 (hex) Simet +00-1F-E8 (hex) KURUSUGAWA Electronics Industry Inc,. +00-1F-E9 (hex) Printrex, Inc. +00-1F-EA (hex) Applied Media Technologies Corporation +00-1F-EB (hex) Trio Datacom Pty Ltd +00-1F-EC (hex) Synapse électronique +00-1F-ED (hex) Tecan Systems Inc. +00-1F-EE (hex) ubisys technologies GmbH +00-1F-EF (hex) SHINSEI INDUSTRIES CO.,LTD +00-1F-F0 (hex) Audio Partnership +00-1F-F1 (hex) Paradox Hellas S.A. +00-1F-F2 (hex) VIA Technologies, Inc. +00-1F-F3 (hex) Apple, Inc +00-1F-F4 (hex) Power Monitors, Inc. +00-1F-F5 (hex) Kongsberg Defence & Aerospace +00-1F-F6 (hex) PS Audio International +00-1F-F7 (hex) Nakajima All Precision Co., Ltd. +00-1F-F8 (hex) Siemens AG, Sector Industry, Drive Technologies, Motion Control Systems +00-1F-F9 (hex) Advanced Knowledge Associates +00-1F-FA (hex) Coretree, Co, Ltd +00-1F-FB (hex) Green Packet Bhd +00-1F-FC (hex) Riccius+Sohn GmbH +00-1F-FD (hex) Indigo Mobile Technologies Corp. +00-1F-FE (hex) ProCurve Networking by HP +00-1F-FF (hex) Respironics, Inc. +00-20-00 (hex) LEXMARK INTERNATIONAL, INC. +00-20-01 (hex) DSP SOLUTIONS, INC. +00-20-02 (hex) SERITECH ENTERPRISE CO., LTD. +00-20-03 (hex) PIXEL POWER LTD. +00-20-04 (hex) YAMATAKE-HONEYWELL CO., LTD. +00-20-05 (hex) SIMPLE TECHNOLOGY +00-20-06 (hex) GARRETT COMMUNICATIONS, INC. +00-20-07 (hex) SFA, INC. +00-20-08 (hex) CABLE & COMPUTER TECHNOLOGY +00-20-09 (hex) PACKARD BELL ELEC., INC. +00-20-0A (hex) SOURCE-COMM CORP. +00-20-0B (hex) OCTAGON SYSTEMS CORP. +00-20-0C (hex) ADASTRA SYSTEMS CORP. +00-20-0D (hex) CARL ZEISS +00-20-0E (hex) SATELLITE TECHNOLOGY MGMT, INC +00-20-0F (hex) TANBAC CO., LTD. +00-20-10 (hex) JEOL SYSTEM TECHNOLOGY CO. LTD +00-20-11 (hex) CANOPUS CO., LTD. +00-20-12 (hex) CAMTRONICS MEDICAL SYSTEMS +00-20-13 (hex) DIVERSIFIED TECHNOLOGY, INC. +00-20-14 (hex) GLOBAL VIEW CO., LTD. +00-20-15 (hex) ACTIS COMPUTER SA +00-20-16 (hex) SHOWA ELECTRIC WIRE & CABLE CO +00-20-17 (hex) ORBOTECH +00-20-18 (hex) CIS TECHNOLOGY INC. +00-20-19 (hex) OHLER GmbH +00-20-1A (hex) MRV Communications, Inc. +00-20-1B (hex) NORTHERN TELECOM/NETWORK +00-20-1C (hex) EXCEL, INC. +00-20-1D (hex) KATANA PRODUCTS +00-20-1E (hex) NETQUEST CORPORATION +00-20-1F (hex) BEST POWER TECHNOLOGY, INC. +00-20-20 (hex) MEGATRON COMPUTER INDUSTRIES PTY, LTD. +00-20-21 (hex) ALGORITHMS SOFTWARE PVT. LTD. +00-20-22 (hex) NMS Communications +00-20-23 (hex) T.C. TECHNOLOGIES PTY. LTD +00-20-24 (hex) PACIFIC COMMUNICATION SCIENCES +00-20-25 (hex) CONTROL TECHNOLOGY, INC. +00-20-26 (hex) AMKLY SYSTEMS, INC. +00-20-27 (hex) MING FORTUNE INDUSTRY CO., LTD +00-20-28 (hex) WEST EGG SYSTEMS, INC. +00-20-29 (hex) TELEPROCESSING PRODUCTS, INC. +00-20-2A (hex) N.V. DZINE +00-20-2B (hex) ADVANCED TELECOMMUNICATIONS MODULES, LTD. +00-20-2C (hex) WELLTRONIX CO., LTD. +00-20-2D (hex) TAIYO CORPORATION +00-20-2E (hex) DAYSTAR DIGITAL +00-20-2F (hex) ZETA COMMUNICATIONS, LTD. +00-20-30 (hex) ANALOG & DIGITAL SYSTEMS +00-20-31 (hex) ERTEC GmbH +00-20-32 (hex) ALCATEL TAISEL +00-20-33 (hex) SYNAPSE TECHNOLOGIES, INC. +00-20-34 (hex) ROTEC INDUSTRIEAUTOMATION GMBH +00-20-35 (hex) IBM CORPORATION +00-20-36 (hex) BMC SOFTWARE +00-20-37 (hex) SEAGATE TECHNOLOGY +00-20-38 (hex) VME MICROSYSTEMS INTERNATIONAL CORPORATION +00-20-39 (hex) SCINETS +00-20-3A (hex) DIGITAL BI0METRICS INC. +00-20-3B (hex) WISDM LTD. +00-20-3C (hex) EUROTIME AB +00-20-3D (hex) Honeywell ECC +00-20-3E (hex) LogiCan Technologies, Inc. +00-20-3F (hex) JUKI CORPORATION +00-20-40 (hex) Motorola Broadband Communications Sector +00-20-41 (hex) DATA NET +00-20-42 (hex) DATAMETRICS CORP. +00-20-43 (hex) NEURON COMPANY LIMITED +00-20-44 (hex) GENITECH PTY LTD +00-20-45 (hex) ION Networks, Inc. +00-20-46 (hex) CIPRICO, INC. +00-20-47 (hex) STEINBRECHER CORP. +00-20-48 (hex) Marconi Communications +00-20-49 (hex) COMTRON, INC. +00-20-4A (hex) PRONET GMBH +00-20-4B (hex) AUTOCOMPUTER CO., LTD. +00-20-4C (hex) MITRON COMPUTER PTE LTD. +00-20-4D (hex) INOVIS GMBH +00-20-4E (hex) NETWORK SECURITY SYSTEMS, INC. +00-20-4F (hex) DEUTSCHE AEROSPACE AG +00-20-50 (hex) KOREA COMPUTER INC. +00-20-51 (hex) Verilink Corporation +00-20-52 (hex) RAGULA SYSTEMS +00-20-53 (hex) HUNTSVILLE MICROSYSTEMS, INC. +00-20-54 (hex) Sycamore Networks +00-20-55 (hex) ALTECH CO., LTD. +00-20-56 (hex) NEOPRODUCTS +00-20-57 (hex) TITZE DATENTECHNIK GmbH +00-20-58 (hex) ALLIED SIGNAL INC. +00-20-59 (hex) MIRO COMPUTER PRODUCTS AG +00-20-5A (hex) COMPUTER IDENTICS +00-20-5B (hex) Kentrox, LLC +00-20-5C (hex) InterNet Systems of Florida, Inc. +00-20-5D (hex) NANOMATIC OY +00-20-5E (hex) CASTLE ROCK, INC. +00-20-5F (hex) GAMMADATA COMPUTER GMBH +00-20-60 (hex) ALCATEL ITALIA S.p.A. +00-20-61 (hex) GarrettCom, Inc. +00-20-62 (hex) SCORPION LOGIC, LTD. +00-20-63 (hex) WIPRO INFOTECH LTD. +00-20-64 (hex) PROTEC MICROSYSTEMS, INC. +00-20-65 (hex) SUPERNET NETWORKING INC. +00-20-66 (hex) GENERAL MAGIC, INC. +00-20-67 (hex) PRIVATE +00-20-68 (hex) ISDYNE +00-20-69 (hex) ISDN SYSTEMS CORPORATION +00-20-6A (hex) OSAKA COMPUTER CORP. +00-20-6B (hex) KONICA MINOLTA HOLDINGS, INC. +00-20-6C (hex) EVERGREEN TECHNOLOGY CORP. +00-20-6D (hex) DATA RACE, INC. +00-20-6E (hex) XACT, INC. +00-20-6F (hex) FLOWPOINT CORPORATION +00-20-70 (hex) HYNET, LTD. +00-20-71 (hex) IBR GMBH +00-20-72 (hex) WORKLINK INNOVATIONS +00-20-73 (hex) FUSION SYSTEMS CORPORATION +00-20-74 (hex) SUNGWOON SYSTEMS +00-20-75 (hex) MOTOROLA COMMUNICATION ISRAEL +00-20-76 (hex) REUDO CORPORATION +00-20-77 (hex) KARDIOS SYSTEMS CORP. +00-20-78 (hex) RUNTOP, INC. +00-20-79 (hex) MIKRON GMBH +00-20-7A (hex) WiSE Communications, Inc. +00-20-7B (hex) Intel Corporation +00-20-7C (hex) AUTEC GmbH +00-20-7D (hex) ADVANCED COMPUTER APPLICATIONS +00-20-7E (hex) FINECOM Co., Ltd. +00-20-7F (hex) KYOEI SANGYO CO., LTD. +00-20-80 (hex) SYNERGY (UK) LTD. +00-20-81 (hex) TITAN ELECTRONICS +00-20-82 (hex) ONEAC CORPORATION +00-20-83 (hex) PRESTICOM INCORPORATED +00-20-84 (hex) OCE PRINTING SYSTEMS, GMBH +00-20-85 (hex) EXIDE ELECTRONICS +00-20-86 (hex) MICROTECH ELECTRONICS LIMITED +00-20-87 (hex) MEMOTEC, INC. +00-20-88 (hex) GLOBAL VILLAGE COMMUNICATION +00-20-89 (hex) T3PLUS NETWORKING, INC. +00-20-8A (hex) SONIX COMMUNICATIONS, LTD. +00-20-8B (hex) LAPIS TECHNOLOGIES, INC. +00-20-8C (hex) GALAXY NETWORKS, INC. +00-20-8D (hex) CMD TECHNOLOGY +00-20-8E (hex) CHEVIN SOFTWARE ENG. LTD. +00-20-8F (hex) ECI TELECOM LTD. +00-20-90 (hex) ADVANCED COMPRESSION TECHNOLOGY, INC. +00-20-91 (hex) J125, NATIONAL SECURITY AGENCY +00-20-92 (hex) CHESS ENGINEERING B.V. +00-20-93 (hex) LANDINGS TECHNOLOGY CORP. +00-20-94 (hex) CUBIX CORPORATION +00-20-95 (hex) RIVA ELECTRONICS +00-20-96 (hex) Invensys +00-20-97 (hex) APPLIED SIGNAL TECHNOLOGY +00-20-98 (hex) HECTRONIC AB +00-20-99 (hex) BON ELECTRIC CO., LTD. +00-20-9A (hex) THE 3DO COMPANY +00-20-9B (hex) ERSAT ELECTRONIC GMBH +00-20-9C (hex) PRIMARY ACCESS CORP. +00-20-9D (hex) LIPPERT AUTOMATIONSTECHNIK +00-20-9E (hex) BROWN'S OPERATING SYSTEM SERVICES, LTD. +00-20-9F (hex) MERCURY COMPUTER SYSTEMS, INC. +00-20-A0 (hex) OA LABORATORY CO., LTD. +00-20-A1 (hex) DOVATRON +00-20-A2 (hex) GALCOM NETWORKING LTD. +00-20-A3 (hex) DIVICOM INC. +00-20-A4 (hex) MULTIPOINT NETWORKS +00-20-A5 (hex) API ENGINEERING +00-20-A6 (hex) PROXIM, INC. +00-20-A7 (hex) PAIRGAIN TECHNOLOGIES, INC. +00-20-A8 (hex) SAST TECHNOLOGY CORP. +00-20-A9 (hex) WHITE HORSE INDUSTRIAL +00-20-AA (hex) DIGIMEDIA VISION LTD. +00-20-AB (hex) MICRO INDUSTRIES CORP. +00-20-AC (hex) INTERFLEX DATENSYSTEME GMBH +00-20-AD (hex) LINQ SYSTEMS +00-20-AE (hex) ORNET DATA COMMUNICATION TECH. +00-20-AF (hex) 3COM CORPORATION +00-20-B0 (hex) GATEWAY DEVICES, INC. +00-20-B1 (hex) COMTECH RESEARCH INC. +00-20-B2 (hex) GKD Gesellschaft Fur Kommunikation Und Datentechnik +00-20-B3 (hex) SCLTEC COMMUNICATIONS SYSTEMS +00-20-B4 (hex) TERMA ELEKTRONIK AS +00-20-B5 (hex) YASKAWA ELECTRIC CORPORATION +00-20-B6 (hex) AGILE NETWORKS, INC. +00-20-B7 (hex) NAMAQUA COMPUTERWARE +00-20-B8 (hex) PRIME OPTION, INC. +00-20-B9 (hex) METRICOM, INC. +00-20-BA (hex) CENTER FOR HIGH PERFORMANCE +00-20-BB (hex) ZAX CORPORATION +00-20-BC (hex) Long Reach Networks Pty Ltd +00-20-BD (hex) NIOBRARA R & D CORPORATION +00-20-BE (hex) LAN ACCESS CORP. +00-20-BF (hex) AEHR TEST SYSTEMS +00-20-C0 (hex) PULSE ELECTRONICS, INC. +00-20-C1 (hex) SAXA, Inc. +00-20-C2 (hex) TEXAS MEMORY SYSTEMS, INC. +00-20-C3 (hex) COUNTER SOLUTIONS LTD. +00-20-C4 (hex) INET,INC. +00-20-C5 (hex) EAGLE TECHNOLOGY +00-20-C6 (hex) NECTEC +00-20-C7 (hex) AKAI Professional M.I. Corp. +00-20-C8 (hex) LARSCOM INCORPORATED +00-20-C9 (hex) VICTRON BV +00-20-CA (hex) DIGITAL OCEAN +00-20-CB (hex) PRETEC ELECTRONICS CORP. +00-20-CC (hex) DIGITAL SERVICES, LTD. +00-20-CD (hex) HYBRID NETWORKS, INC. +00-20-CE (hex) LOGICAL DESIGN GROUP, INC. +00-20-CF (hex) TEST & MEASUREMENT SYSTEMS INC +00-20-D0 (hex) VERSALYNX CORPORATION +00-20-D1 (hex) MICROCOMPUTER SYSTEMS (M) SDN. +00-20-D2 (hex) RAD DATA COMMUNICATIONS, LTD. +00-20-D3 (hex) OST (OUEST STANDARD TELEMATIQU +00-20-D4 (hex) CABLETRON - ZEITTNET INC. +00-20-D5 (hex) VIPA GMBH +00-20-D6 (hex) BREEZECOM +00-20-D7 (hex) JAPAN MINICOMPUTER SYSTEMS CO., Ltd. +00-20-D8 (hex) Nortel Networks +00-20-D9 (hex) PANASONIC TECHNOLOGIES, INC./MIECO-US +00-20-DA (hex) Alcatel North America ESD +00-20-DB (hex) XNET TECHNOLOGY, INC. +00-20-DC (hex) DENSITRON TAIWAN LTD. +00-20-DD (hex) Cybertec Pty Ltd +00-20-DE (hex) JAPAN DIGITAL LABORAT'Y CO.LTD +00-20-DF (hex) KYOSAN ELECTRIC MFG. CO., LTD. +00-20-E0 (hex) Actiontec Electronics, Inc. +00-20-E1 (hex) ALAMAR ELECTRONICS +00-20-E2 (hex) INFORMATION RESOURCE ENGINEERING +00-20-E3 (hex) MCD KENCOM CORPORATION +00-20-E4 (hex) HSING TECH ENTERPRISE CO., LTD +00-20-E5 (hex) APEX DATA, INC. +00-20-E6 (hex) LIDKOPING MACHINE TOOLS AB +00-20-E7 (hex) B&W NUCLEAR SERVICE COMPANY +00-20-E8 (hex) DATATREK CORPORATION +00-20-E9 (hex) DANTEL +00-20-EA (hex) EFFICIENT NETWORKS, INC. +00-20-EB (hex) CINCINNATI MICROWAVE, INC. +00-20-EC (hex) TECHWARE SYSTEMS CORP. +00-20-ED (hex) GIGA-BYTE TECHNOLOGY CO., LTD. +00-20-EE (hex) GTECH CORPORATION +00-20-EF (hex) USC CORPORATION +00-20-F0 (hex) UNIVERSAL MICROELECTRONICS CO. +00-20-F1 (hex) ALTOS INDIA LIMITED +00-20-F2 (hex) SUN MICROSYSTEMS, INC. +00-20-F3 (hex) RAYNET CORPORATION +00-20-F4 (hex) SPECTRIX CORPORATION +00-20-F5 (hex) PANDATEL AG +00-20-F6 (hex) NET TEK AND KARLNET, INC. +00-20-F7 (hex) CYBERDATA +00-20-F8 (hex) CARRERA COMPUTERS, INC. +00-20-F9 (hex) PARALINK NETWORKS, INC. +00-20-FA (hex) GDE SYSTEMS, INC. +00-20-FB (hex) OCTEL COMMUNICATIONS CORP. +00-20-FC (hex) MATROX +00-20-FD (hex) ITV TECHNOLOGIES, INC. +00-20-FE (hex) TOPWARE INC. / GRAND COMPUTER +00-20-FF (hex) SYMMETRICAL TECHNOLOGIES +00-21-00 (hex) GemTek Technology Co., Ltd. +00-21-01 (hex) Aplicaciones Electronicas Quasar (AEQ) +00-21-02 (hex) UpdateLogic Inc. +00-21-03 (hex) GHI Electronics, LLC +00-21-04 (hex) Gigaset Communications GmbH +00-21-05 (hex) Alcatel-Lucent +00-21-06 (hex) RIM Testing Services +00-21-07 (hex) Seowonintech Co Ltd. +00-21-08 (hex) Nokia Danmark A/S +00-21-09 (hex) Nokia Danmark A/S +00-21-0A (hex) byd:sign Corporation +00-21-0B (hex) GEMINI TRAZE RFID PVT. LTD. +00-21-0C (hex) Cymtec Systems, Inc. +00-21-0D (hex) SAMSIN INNOTEC +00-21-0E (hex) Orpak Systems L.T.D. +00-21-0F (hex) Cernium Corp +00-21-10 (hex) Clearbox Systems +00-21-11 (hex) Uniphone Inc. +00-21-12 (hex) WISCOM SYSTEM CO.,LTD +00-21-13 (hex) Padtec S/A +00-21-14 (hex) Hylab Technology Inc. +00-21-15 (hex) PHYWE Systeme GmbH & Co. KG +00-21-16 (hex) Transcon Electronic Systems, spol. s r. o. +00-21-17 (hex) Tellord +00-21-18 (hex) Athena Tech, Inc. +00-21-19 (hex) Samsung Electro-Mechanics +00-21-1A (hex) LInTech Corporation +00-21-1B (hex) Cisco Systems +00-21-1C (hex) Cisco Systems +00-21-1D (hex) Dataline AB +00-21-1E (hex) Motorola CHS +00-21-1F (hex) SHINSUNG DELTATECH CO.,LTD. +00-21-20 (hex) Sequel Technologies, LLC +00-21-21 (hex) VRmagic GmbH +00-21-22 (hex) Chip-pro Ltd. +00-21-23 (hex) Aerosat Avionics +00-21-24 (hex) Optos Plc +00-21-25 (hex) KUK JE TONG SHIN Co.,LTD +00-21-26 (hex) Shenzhen Torch Equipment Co., Ltd. +00-21-27 (hex) TP-LINK Technology Co., Ltd. +00-21-28 (hex) Sun Microsystems Inc +00-21-29 (hex) Cisco-Linksys, LLC +00-21-2A (hex) Audiovox Corporation +00-21-2B (hex) MSA Auer +00-21-2C (hex) SemIndia System Private Limited +00-21-2D (hex) SCIMOLEX CORPORATION +00-21-2E (hex) dresden-elektronik +00-21-2F (hex) Phoebe Micro Inc. +00-21-30 (hex) Keico Hightech Inc. +00-21-31 (hex) Blynke Inc. +00-21-32 (hex) Masterclock, Inc. +00-21-33 (hex) Building B, Inc +00-21-34 (hex) Brandywine Communications +00-21-35 (hex) ALCATEL-LUCENT +00-21-36 (hex) Motorola Mobile Devices business (MDb) +00-21-37 (hex) Bay Controls, LLC +00-21-38 (hex) Cepheid +00-21-39 (hex) Escherlogic Inc. +00-21-3A (hex) Winchester Systems Inc. +00-21-3B (hex) Berkshire Products, Inc +00-21-3C (hex) AliphCom +00-21-3D (hex) Cermetek Microelectronics, Inc. +00-21-3E (hex) TomTom +00-21-3F (hex) A-Team Technology Ltd. +00-21-40 (hex) EN Technologies Inc. +00-21-41 (hex) RADLIVE +00-21-42 (hex) Advanced Control Systems doo +00-21-43 (hex) Motorola CHS +00-21-44 (hex) SS Telecoms +00-21-45 (hex) Semptian Technologies Ltd. +00-21-46 (hex) SCI Technology +00-21-47 (hex) Nintendo Co., Ltd. +00-21-48 (hex) Kaco Solar Korea +00-21-49 (hex) China Daheng Group ,Inc. +00-21-4A (hex) Pixel Velocity, Inc +00-21-4B (hex) Shenzhen HAMP Science & Technology Co.,Ltd +00-21-4C (hex) SAMSUNG ELECTRONICS CO., LTD. +00-21-4D (hex) Guangzhou Skytone Transmission Technology Com. Ltd. +00-21-4E (hex) GS Yuasa Power Supply Ltd. +00-21-4F (hex) ALPS Electric Co., Ltd +00-21-50 (hex) EYEVIEW ELECTRONICS +00-21-51 (hex) Millinet Co., Ltd. +00-21-52 (hex) General Satellite Trading Limited +00-21-53 (hex) SeaMicro Inc. +00-21-54 (hex) D-TACQ Solutions Ltd +00-21-55 (hex) Cisco Systems +00-21-56 (hex) Cisco Systems +00-21-57 (hex) National Datacast, Inc. +00-21-58 (hex) Style Flying Technology Co. +00-21-59 (hex) Juniper Networks +00-21-5A (hex) Hewlett Packard +00-21-5B (hex) Inotive +00-21-5C (hex) Intel Corporate +00-21-5D (hex) Intel Corporate +00-21-5E (hex) IBM +00-21-5F (hex) IHSE GmbH +00-21-60 (hex) Hidea Solutions Co. Ltd. +00-21-61 (hex) Yournet Inc. +00-21-62 (hex) Nortel +00-21-63 (hex) ASKEY COMPUTER CORP +00-21-64 (hex) Special Design Bureau for Seismic Instrumentation +00-21-65 (hex) Presstek Inc. +00-21-66 (hex) NovAtel Inc. +00-21-67 (hex) HWA JIN T&I Corp. +00-21-68 (hex) iVeia, LLC +00-21-69 (hex) Prologix, LLC. +00-21-6A (hex) Intel Corporate +00-21-6B (hex) Intel Corporate +00-21-6C (hex) ODVA +00-21-6D (hex) Soltech Co., Ltd. +00-21-6E (hex) Function ATI (Huizhou) Telecommunications Co., Ltd. +00-21-6F (hex) SymCom, Inc. +00-21-70 (hex) Dell Inc +00-21-71 (hex) Wesung TNC Co., Ltd. +00-21-72 (hex) Seoultek Valley +00-21-73 (hex) Ion Torrent Systems, Inc. +00-21-74 (hex) AvaLAN Wireless +00-21-75 (hex) Pacific Satellite International Ltd. +00-21-76 (hex) YMax Telecom Ltd. +00-21-77 (hex) W. L. Gore & Associates +00-21-78 (hex) Matuschek Messtechnik GmbH +00-21-79 (hex) IOGEAR, Inc. +00-21-7A (hex) Sejin Electron, Inc. +00-21-7B (hex) Bastec AB +00-21-7C (hex) 2Wire +00-21-7D (hex) PYXIS S.R.L. +00-21-7E (hex) Telit Communication s.p.a +00-21-7F (hex) Intraco Technology Pte Ltd +00-21-80 (hex) Motorola CHS +00-21-81 (hex) Si2 Microsystems Limited +00-21-82 (hex) SandLinks Systems, Ltd. +00-21-83 (hex) VATECH HYDRO +00-21-84 (hex) POWERSOFT SRL +00-21-85 (hex) MICRO-STAR INT'L CO.,LTD. +00-21-86 (hex) USI +00-21-87 (hex) Imacs GmbH +00-21-88 (hex) Data Domain, Inc. +00-21-89 (hex) AppTech, Inc. +00-21-8A (hex) Electronic Design and Manufacturing Company +00-21-8B (hex) Wescon Technology, Inc. +00-21-8C (hex) TopControl GMBH +00-21-8D (hex) AP Router Ind. Eletronica LTDA +00-21-8E (hex) MEKICS CO., LTD. +00-21-8F (hex) Avantgarde Acoustic Lautsprechersysteme GmbH +00-21-90 (hex) Goliath Solutions +00-21-91 (hex) D-Link Corporation +00-21-92 (hex) Baoding Galaxy Electronic Technology Co.,Ltd +00-21-93 (hex) Videofon MV +00-21-94 (hex) Ping Communication +00-21-95 (hex) GWD Media Limited +00-21-96 (hex) Telsey S.p.A. +00-21-97 (hex) ELITEGROUP COMPUTER SYSTEM +00-21-98 (hex) Thai Radio Co, LTD +00-21-99 (hex) Vacon Plc +00-21-9A (hex) Cambridge Visual Networks Ltd +00-21-9B (hex) Dell Inc +00-21-9C (hex) Honeywld Technology Corp. +00-21-9D (hex) Adesys BV +00-21-9E (hex) Sony Ericsson Mobile Communications +00-21-9F (hex) SATEL OY +00-21-A0 (hex) Cisco Systems +00-21-A1 (hex) Cisco Systems +00-21-A2 (hex) EKE-Electronics Ltd. +00-21-A3 (hex) Micromint +00-21-A4 (hex) Dbii Networks +00-21-A5 (hex) ERLPhase Power Technologies Ltd. +00-21-A6 (hex) Videotec Spa +00-21-A7 (hex) Hantle System Co., Ltd. +00-21-A8 (hex) Telephonics Corporation +00-21-A9 (hex) Mobilink Telecom Co.,Ltd +00-21-AA (hex) Nokia Danmark A/S +00-21-AB (hex) Nokia Danmark A/S +00-21-AC (hex) Infrared Integrated Systems Ltd +00-21-AD (hex) Nordic ID Oy +00-21-AE (hex) ALCATEL-LUCENT FRANCE - WTD +00-21-AF (hex) Radio Frequency Systems +00-21-B0 (hex) Tyco Telecommunications +00-21-B1 (hex) DIGITAL SOLUTIONS LTD +00-21-B2 (hex) Fiberblaze A/S +00-21-B3 (hex) Ross Controls +00-21-B4 (hex) APRO MEDIA CO., LTD +00-21-B5 (hex) Vyro Games Limited +00-21-B6 (hex) Triacta Power Technologies Inc. +00-21-B7 (hex) Lexmark International Inc. +00-21-B8 (hex) Inphi Corporation +00-21-B9 (hex) Universal Devices Inc. +00-21-BA (hex) Texas Instruments +00-21-BB (hex) Riken Keiki Co., Ltd. +00-21-BC (hex) ZALA COMPUTER +00-21-BD (hex) Nintendo Co., Ltd. +00-21-BE (hex) Cisco, Service Provider Video Technology Group +00-21-BF (hex) Hitachi High-Tech Control Systems Corporation +00-21-C0 (hex) Mobile Appliance, Inc. +00-21-C1 (hex) ABB Oy / Distribution Automation +00-21-C2 (hex) GL Communications Inc +00-21-C3 (hex) CORNELL Communications, Inc. +00-21-C4 (hex) Consilium AB +00-21-C5 (hex) 3DSP Corp +00-21-C6 (hex) CSJ Global, Inc. +00-21-C7 (hex) Russound +00-21-C8 (hex) LOHUIS Networks +00-21-C9 (hex) Wavecom Asia Pacific Limited +00-21-CA (hex) ART System Co., Ltd. +00-21-CB (hex) SMS TECNOLOGIA ELETRONICA LTDA +00-21-CC (hex) Flextronics International +00-21-CD (hex) LiveTV +00-21-CE (hex) NTC-Metrotek +00-21-CF (hex) The Crypto Group +00-21-D0 (hex) Global Display Solutions Spa +00-21-D1 (hex) Samsung Electronics Co.,Ltd +00-21-D2 (hex) Samsung Electronics Co.,Ltd +00-21-D3 (hex) BOCOM SECURITY(ASIA PACIFIC) LIMITED +00-21-D4 (hex) Vollmer Werke GmbH +00-21-D5 (hex) X2E GmbH +00-21-D6 (hex) LXI Consortium +00-21-D7 (hex) Cisco Systems +00-21-D8 (hex) Cisco Systems +00-21-D9 (hex) SEKONIC CORPORATION +00-21-DA (hex) Automation Products Group Inc. +00-21-DB (hex) Santachi Video Technology (Shenzhen) Co., Ltd. +00-21-DC (hex) TECNOALARM S.r.l. +00-21-DD (hex) Northstar Systems Corp +00-21-DE (hex) Firepro Wireless +00-21-DF (hex) Martin Christ GmbH +00-21-E0 (hex) CommAgility Ltd +00-21-E1 (hex) Nortel Networks +00-21-E2 (hex) Creative Electronic GmbH +00-21-E3 (hex) SerialTek LLC +00-21-E4 (hex) I-WIN +00-21-E5 (hex) Display Solution AG +00-21-E6 (hex) Starlight Video Limited +00-21-E7 (hex) Informatics Services Corporation +00-21-E8 (hex) Murata Manufacturing Co., Ltd. +00-21-E9 (hex) Apple, Inc +00-21-EA (hex) Bystronic Laser AG +00-21-EB (hex) ESP SYSTEMS, LLC +00-21-EC (hex) Solutronic GmbH +00-21-ED (hex) Telegesis +00-21-EE (hex) Full Spectrum Inc. +00-21-EF (hex) Kapsys +00-21-F0 (hex) EW3 Technologies LLC +00-21-F1 (hex) Tutus Data AB +00-21-F2 (hex) EASY3CALL Technology Limited +00-21-F3 (hex) Si14 SpA +00-21-F4 (hex) INRange Systems, Inc +00-21-F5 (hex) Western Engravers Supply, Inc. +00-21-F6 (hex) Virtual Iron Software +00-21-F7 (hex) ProCurve Networking by HP +00-21-F8 (hex) Enseo, Inc. +00-21-F9 (hex) WIRECOM Technologies +00-21-FA (hex) A4SP Technologies Ltd. +00-21-FB (hex) LG Electronics +00-21-FC (hex) Nokia Danmark A/S +00-21-FD (hex) DSTA S.L. +00-21-FE (hex) Nokia Danmark A/S +00-21-FF (hex) Cyfrowy Polsat SA +00-22-00 (hex) BLADE Network Technology +00-22-01 (hex) Aksys Networks Inc +00-22-02 (hex) Excito Elektronik i Skåne AB +00-22-03 (hex) Glensound Electronics Ltd +00-22-04 (hex) KORATEK +00-22-05 (hex) WeLink Solutions, Inc. +00-22-06 (hex) Cyberdyne Inc. +00-22-07 (hex) Inteno Broadband Technology AB +00-22-08 (hex) Certicom Corp +00-22-09 (hex) Omron Healthcare Co., Ltd +00-22-0A (hex) Rearden Labs +00-22-0B (hex) National Source Coding Center +00-22-0C (hex) Cisco Systems +00-22-0D (hex) Cisco Systems +00-22-0E (hex) Indigo Security Co., Ltd. +00-22-0F (hex) MoCA (Multimedia over Coax Alliance) +00-22-10 (hex) Motorola CHS +00-22-11 (hex) Rohati Systems +00-22-12 (hex) CAI Networks, Inc. +00-22-13 (hex) PCI CORPORATION +00-22-14 (hex) RINNAI KOREA +00-22-15 (hex) ASUSTek COMPUTER INC. +00-22-16 (hex) SHIBAURA VENDING MACHINE CORPORATION +00-22-17 (hex) Neat Electronics +00-22-18 (hex) Verivue Inc. +00-22-19 (hex) Dell Inc +00-22-1A (hex) Audio Precision +00-22-1B (hex) Morega Systems +00-22-1C (hex) PRIVATE +00-22-1D (hex) Freegene Technology LTD +00-22-1E (hex) Media Devices Co., Ltd. +00-22-1F (hex) eSang Technologies Co., Ltd. +00-22-20 (hex) Mitac Technology Corp +00-22-21 (hex) ITOH DENKI CO,LTD. +00-22-22 (hex) Betec Engineering GmbH +00-22-23 (hex) TimeKeeping Systems, Inc. +00-22-24 (hex) Good Will Instrument Co., Ltd. +00-22-25 (hex) Thales Avionics Ltd +00-22-26 (hex) Avaak, Inc. +00-22-27 (hex) uv-electronic GmbH +00-22-28 (hex) Breeze Innovations Ltd. +00-22-29 (hex) Compumedics Ltd +00-22-2A (hex) SoundEar A/S +00-22-2B (hex) Nucomm, Inc. +00-22-2C (hex) Ceton Corp +00-22-2D (hex) SMC Networks Inc. +00-22-2E (hex) maintech GmbH +00-22-2F (hex) Open Grid Computing, Inc. +00-22-30 (hex) FutureLogic Inc. +00-22-31 (hex) SMT&C Co., Ltd. +00-22-32 (hex) Design Design Technology Ltd +00-22-33 (hex) Pirelli Broadband Solutions +00-22-34 (hex) Corventis Inc. +00-22-35 (hex) Strukton Systems bv +00-22-36 (hex) VECTOR SP. Z O.O. +00-22-37 (hex) Shinhint Group +00-22-38 (hex) LOGIPLUS +00-22-39 (hex) Indiana Life Sciences Incorporated +00-22-3A (hex) Scientific Atlanta, Cisco SPVT Group +00-22-3B (hex) Communication Networks, LLC +00-22-3C (hex) RATIO Entwicklungen GmbH +00-22-3D (hex) JumpGen Systems, LLC +00-22-3E (hex) IRTrans GmbH +00-22-3F (hex) Netgear Inc. +00-22-40 (hex) Universal Telecom S/A +00-22-41 (hex) Apple, Inc +00-22-42 (hex) Alacron Inc. +00-22-43 (hex) AzureWave Technologies, Inc. +00-22-44 (hex) Chengdu Linkon Communications Device Co., Ltd +00-22-45 (hex) Leine & Linde AB +00-22-46 (hex) Evoc Intelligent Technology Co.,Ltd. +00-22-47 (hex) DAC ENGINEERING CO., LTD. +00-22-48 (hex) Microsoft Corporation +00-22-49 (hex) HOME MULTIENERGY SL +00-22-4A (hex) RAYLASE AG +00-22-4B (hex) AIRTECH TECHNOLOGIES, INC. +00-22-4C (hex) Nintendo Co., Ltd. +00-22-4D (hex) MITAC INTERNATIONAL CORP. +00-22-4E (hex) SEEnergy Corp. +00-22-4F (hex) Byzoro Networks Ltd. +00-22-50 (hex) Point Six Wireless, LLC +00-22-51 (hex) Lumasense Technologies +00-22-52 (hex) ZOLL Lifecor Corporation +00-22-53 (hex) Entorian Technologies +00-22-54 (hex) Bigelow Aerospace +00-22-55 (hex) Cisco Systems +00-22-56 (hex) Cisco Systems +00-22-57 (hex) 3Com Europe Ltd +00-22-58 (hex) Taiyo Yuden Co., Ltd. +00-22-59 (hex) Guangzhou New Postcom Equipment Co.,Ltd. +00-22-5A (hex) Garde Security AB +00-22-5B (hex) Teradici Corporation +00-22-5C (hex) Multimedia & Communication Technology +00-22-5D (hex) Digicable Network India Pvt. Ltd. +00-22-5E (hex) Uwin Technologies Co.,LTD +00-22-5F (hex) Liteon Technology Corporation +00-22-60 (hex) AFREEY Inc. +00-22-61 (hex) Frontier Silicon Ltd +00-22-62 (hex) BEP Marine +00-22-63 (hex) Koos Technical Services, Inc. +00-22-64 (hex) Hewlett Packard +00-22-65 (hex) Nokia Danmark A/S +00-22-66 (hex) Nokia Danmark A/S +00-22-67 (hex) Nortel Networks +00-22-68 (hex) Hon Hai Precision Ind. Co., Ltd. +00-22-69 (hex) Hon Hai Precision Ind. Co., Ltd. +00-22-6A (hex) Honeywell +00-22-6B (hex) Cisco-Linksys, LLC +00-22-6C (hex) LinkSprite Technologies, Inc. +00-22-6D (hex) Shenzhen GIEC Electronics Co., Ltd. +00-22-6E (hex) Gowell Electronic Limited +00-22-6F (hex) 3onedata Technology Co. Ltd. +00-22-70 (hex) ABK North America, LLC +00-22-71 (hex) Jäger Computergesteuerte Messtechnik GmbH +00-22-72 (hex) American Micro-Fuel Device Corp. +00-22-73 (hex) Techway +00-22-74 (hex) FamilyPhone AB +00-22-75 (hex) Belkin International, Inc. +00-22-76 (hex) Triple EYE B.V. +00-22-77 (hex) NEC Australia Pty Ltd +00-22-78 (hex) Shenzhen Tongfang Multimedia Technology Co.,Ltd. +00-22-79 (hex) Nippon Conlux Co., Ltd. +00-22-7A (hex) Telecom Design +00-22-7B (hex) Apogee Labs, Inc. +00-22-7C (hex) Woori SMT Co.,ltd +00-22-7D (hex) YE DATA INC. +00-22-7E (hex) Chengdu 30Kaitian Communication Industry Co.Ltd +00-22-7F (hex) Ruckus Wireless +00-22-80 (hex) A2B Electronics AB +00-22-81 (hex) Daintree Networks Inc +00-22-82 (hex) 8086 Limited +00-22-83 (hex) Juniper Networks +00-22-84 (hex) DESAY A&V SCIENCE AND TECHNOLOGY CO.,LTD +00-22-85 (hex) NOMUS COMM SYSTEMS +00-22-86 (hex) ASTRON +00-22-87 (hex) Titan Wireless LLC +00-22-88 (hex) Sagrad, Inc. +00-22-89 (hex) Optosecurity Inc. +00-22-8A (hex) Teratronik elektronische systeme gmbh +00-22-8B (hex) Kensington Computer Products Group +00-22-8C (hex) Photon Europe GmbH +00-22-8D (hex) GBS Laboratories LLC +00-22-8E (hex) TV-NUMERIC +00-22-8F (hex) CNRS +00-22-90 (hex) Cisco Systems +00-22-91 (hex) Cisco Systems +00-22-92 (hex) Cinetal +00-22-93 (hex) ZTE Corporation +00-22-94 (hex) Kyocera Corporation +00-22-95 (hex) SGM Technology for lighting spa +00-22-96 (hex) LinoWave Corporation +00-22-97 (hex) XMOS Semiconductor +00-22-98 (hex) Sony Ericsson Mobile Communications +00-22-99 (hex) SeaMicro Inc. +00-22-9A (hex) Lastar, Inc. +00-22-9B (hex) AverLogic Technologies, Inc. +00-22-9C (hex) Verismo Networks Inc +00-22-9D (hex) PYUNG-HWA IND.CO.,LTD +00-22-9E (hex) Social Aid Research Co., Ltd. +00-22-9F (hex) Sensys Traffic AB +00-22-A0 (hex) Delphi Corporation +00-22-A1 (hex) Huawei Symantec Technologies Co.,Ltd. +00-22-A2 (hex) Xtramus Technologies +00-22-A3 (hex) California Eastern Laboratories +00-22-A4 (hex) 2Wire +00-22-A5 (hex) Texas Instruments +00-22-A6 (hex) Sony Computer Entertainment America +00-22-A7 (hex) Tyco Electronics AMP GmbH +00-22-A8 (hex) Ouman Finland Oy +00-22-A9 (hex) LG Electronics Inc +00-22-AA (hex) Nintendo Co., Ltd. +00-22-AB (hex) Shenzhen Turbosight Technology Ltd +00-22-AC (hex) Hangzhou Siyuan Tech. Co., Ltd +00-22-AD (hex) TELESIS TECHNOLOGIES, INC. +00-22-AE (hex) Mattel Inc. +00-22-AF (hex) Safety Vision +00-22-B0 (hex) D-Link Corporation +00-22-B1 (hex) Elbit Systems +00-22-B2 (hex) 4RF Communications Ltd +00-22-B3 (hex) Sei S.p.A. +00-22-B4 (hex) Motorola Mobile Devices +00-22-B5 (hex) NOVITA +00-22-B6 (hex) Superflow Technologies Group +00-22-B7 (hex) GSS Grundig SAT-Systems GmbH +00-22-B8 (hex) Norcott +00-22-B9 (hex) Analogix Seminconductor, Inc +00-22-BA (hex) HUTH Elektronik Systeme GmbH +00-22-BB (hex) beyerdynamic GmbH & Co. KG +00-22-BC (hex) JDSU France SAS +00-22-BD (hex) Cisco Systems +00-22-BE (hex) Cisco Systems +00-22-BF (hex) SieAmp Group of Companies +00-22-C0 (hex) Shenzhen Forcelink Electronic Co, Ltd +00-22-C1 (hex) Active Storage Inc. +00-22-C2 (hex) Proview Eletronica do Brasil LTDA +00-22-C3 (hex) Zeeport Technology Inc. +00-22-C4 (hex) epro GmbH +00-22-C5 (hex) INFORSON Co,Ltd. +00-22-C6 (hex) Sutus Inc +00-22-C7 (hex) SEGGER Microcontroller GmbH & Co. KG +00-22-C8 (hex) Applied Instruments +00-22-C9 (hex) Lenord, Bauer & Co GmbH +00-22-CA (hex) Anviz Biometric Tech. Co., Ltd. +00-22-CB (hex) IONODES Inc. +00-22-CC (hex) SciLog, Inc. +00-22-CD (hex) Ared Technology Co., Ltd. +00-22-CE (hex) Cisco, Service Provider Video Technology Group +00-22-CF (hex) PLANEX Communications INC +00-22-D0 (hex) Polar Electro Oy +00-22-D1 (hex) Albrecht Jung GmbH & Co. KG +00-22-D2 (hex) All Earth Comércio de Eletrônicos LTDA. +00-22-D3 (hex) Hub-Tech +00-22-D4 (hex) ComWorth Co., Ltd. +00-22-D5 (hex) Eaton Corp. Electrical Group Data Center Solutions - Pulizzi +00-22-D6 (hex) Cypak AB +00-22-D7 (hex) Nintendo Co., Ltd. +00-22-D8 (hex) Shenzhen GST Security and Safety Technology Limited +00-22-D9 (hex) Fortex Industrial Ltd. +00-22-DA (hex) ANATEK, LLC +00-22-DB (hex) Translogic Corporation +00-22-DC (hex) Vigil Health Solutions Inc. +00-22-DD (hex) Protecta Electronics Ltd +00-22-DE (hex) OPPO Digital, Inc. +00-22-DF (hex) TAMUZ Monitors +00-22-E0 (hex) Atlantic Software Technologies S.r.L. +00-22-E1 (hex) ZORT Labs, LLC. +00-22-E2 (hex) WABTEC Transit Division +00-22-E3 (hex) Amerigon +00-22-E4 (hex) APASS TECHNOLOGY CO., LTD. +00-22-E5 (hex) Fisher-Rosemount Systems Inc. +00-22-E6 (hex) Intelligent Data +00-22-E7 (hex) WPS Parking Systems +00-22-E8 (hex) Applition Co., Ltd. +00-22-E9 (hex) ProVision Communications +00-22-EA (hex) Rustelcom Inc. +00-22-EB (hex) Data Respons A/S +00-22-EC (hex) IDEALBT TECHNOLOGY CORPORATION +00-22-ED (hex) TSI Power Corporation +00-22-EE (hex) Algo Communication Products Ltd +00-22-EF (hex) Ibis Tek, LLC +00-22-F0 (hex) 3 Greens Aviation Limited +00-22-F1 (hex) PRIVATE +00-22-F2 (hex) SunPower Corp +00-22-F3 (hex) SHARP CORPORATION +00-22-F4 (hex) AMPAK Technology, Inc. +00-22-F5 (hex) Advanced Realtime Tracking GmbH +00-22-F6 (hex) Syracuse Research Corporation +00-22-F7 (hex) Conceptronic +00-22-F8 (hex) PIMA Electronic Systems Ltd. +00-22-F9 (hex) Pollin Electronic GmbH +00-22-FA (hex) Intel Corporate +00-22-FB (hex) Intel Corporate +00-22-FC (hex) Nokia Danmark A/S +00-22-FD (hex) Nokia Danmark A/S +00-22-FE (hex) Microprocessor Designs Inc +00-22-FF (hex) NIVIS LLC +00-23-00 (hex) Cayee Computer Ltd. +00-23-01 (hex) Witron Technology Limited +00-23-02 (hex) Cobalt Digital, Inc. +00-23-03 (hex) LITE-ON IT Corporation +00-23-04 (hex) Cisco Systems +00-23-05 (hex) Cisco Systems +00-23-06 (hex) ALPS Electric Co., Ltd +00-23-07 (hex) FUTURE INNOVATION TECH CO.,LTD +00-23-08 (hex) Arcadyan Technology Corporation +00-23-09 (hex) Janam Technologies LLC +00-23-0A (hex) ARBURG GmbH & Co KG +00-23-0B (hex) Motorola CHS +00-23-0C (hex) CLOVER ELECTRONICS CO.,LTD. +00-23-0D (hex) Nortel Networks +00-23-0E (hex) Gorba AG +00-23-0F (hex) Hirsch Electronics Corporation +00-23-10 (hex) LNC Technology Co., Ltd. +00-23-11 (hex) Gloscom Co., Ltd. +00-23-12 (hex) Apple, Inc +00-23-13 (hex) Qool Technologies Ltd. +00-23-14 (hex) Intel Corporate +00-23-15 (hex) Intel Corporate +00-23-16 (hex) KISAN ELECTRONICS CO +00-23-17 (hex) Lasercraft Inc +00-23-18 (hex) Toshiba +00-23-19 (hex) Sielox LLC +00-23-1A (hex) ITF Co., Ltd. +00-23-1B (hex) Danaher Motion - Kollmorgen +00-23-1C (hex) Fourier Systems Ltd. +00-23-1D (hex) Deltacom Electronics Ltd +00-23-1E (hex) Cezzer Multimedia Technologies +00-23-1F (hex) Guangda Electronic & Telecommunication Technology Development Co., Ltd. +00-23-20 (hex) Nicira Network +00-23-21 (hex) Avitech International Corp +00-23-22 (hex) KISS Teknical Solutions, Inc. +00-23-23 (hex) Zylin AS +00-23-24 (hex) G-PRO COMPUTER +00-23-25 (hex) IOLAN Holding +00-23-26 (hex) Fujitsu Limited +00-23-27 (hex) Shouyo Electronics CO., LTD +00-23-28 (hex) ALCON TELECOMMUNICATIONS CO., LTD. +00-23-29 (hex) DDRdrive LLC +00-23-2A (hex) eonas IT-Beratung und -Entwicklung GmbH +00-23-2B (hex) IRD A/S +00-23-2C (hex) Senticare +00-23-2D (hex) SandForce +00-23-2E (hex) Kedah Electronics Engineering, LLC +00-23-2F (hex) Advanced Card Systems Ltd. +00-23-30 (hex) DIZIPIA, INC. +00-23-31 (hex) Nintendo Co., Ltd. +00-23-32 (hex) Apple, Inc +00-23-33 (hex) Cisco Systems +00-23-34 (hex) Cisco Systems +00-23-35 (hex) Linkflex Co.,Ltd +00-23-36 (hex) METEL s.r.o. +00-23-37 (hex) Global Star Solutions ULC +00-23-38 (hex) OJ-Electronics A/S +00-23-39 (hex) Samsung Electronics +00-23-3A (hex) Samsung Electronics Co.,Ltd +00-23-3B (hex) C-Matic Systems Ltd +00-23-3C (hex) Alflex +00-23-3D (hex) novero GmbH +00-23-3E (hex) Alcatel-Lucent-IPD +00-23-3F (hex) Purechoice Inc +00-23-40 (hex) MiX Telematics +00-23-41 (hex) Siemens Building Technologies Fire & Security Products GmbH & Co. oHG +00-23-42 (hex) Coffee Equipment Company +00-23-43 (hex) TEM AG +00-23-44 (hex) Objective Interface Systems +00-23-45 (hex) Sony Ericsson Mobile Communications +00-23-46 (hex) Vestac +00-23-47 (hex) ProCurve Networking by HP +00-23-48 (hex) SAGEM COMMUNICATION +00-23-49 (hex) Helmholtz Centre Berlin for Material and Energy +00-23-4A (hex) PRIVATE +00-23-4B (hex) Inyuan Technology Inc. +00-23-4C (hex) KTC AB +00-23-4D (hex) Hon Hai Precision Ind. Co., Ltd. +00-23-4E (hex) Hon Hai Precision Ind. Co., Ltd. +00-23-4F (hex) Luminous Power Technologies Pvt. Ltd. +00-23-50 (hex) LynTec +00-23-51 (hex) 2Wire +00-23-52 (hex) DATASENSOR S.p.A. +00-23-53 (hex) F E T Elettronica snc +00-23-54 (hex) ASUSTek COMPUTER INC. +00-23-55 (hex) Kinco Automation(Shanghai) Ltd. +00-23-56 (hex) Packet Forensics LLC +00-23-57 (hex) Pitronot Technologies and Engineering P.T.E. Ltd. +00-23-58 (hex) SYSTEL SA +00-23-59 (hex) Benchmark Electronics ( Thailand ) Public Company Limited +00-23-5A (hex) COMPAL INFORMATION (KUNSHAN) CO., Ltd. +00-23-5B (hex) Gulfstream +00-23-5C (hex) Aprius, Inc. +00-23-5D (hex) Cisco Systems +00-23-5E (hex) Cisco Systems +00-23-5F (hex) Silicon Micro Sensors GmbH +00-23-60 (hex) Lookit Technology Co., Ltd +00-23-61 (hex) Unigen Corporation +00-23-62 (hex) Goldline Controls +00-23-63 (hex) Zhuhai RaySharp Technology Co., Ltd. +00-23-64 (hex) Power Instruments Pte Ltd +00-23-65 (hex) ELKA-Elektronik GmbH +00-23-66 (hex) Beijing Siasun Electronic System Co.,Ltd. +00-23-67 (hex) UniControls a.s. +00-23-68 (hex) Motorola +00-23-69 (hex) Cisco-Linksys, LLC +00-23-6A (hex) ClearAccess, Inc. +00-23-6B (hex) Xembedded, Inc. +00-23-6C (hex) Apple, Inc +00-23-6D (hex) ResMed Ltd +00-23-6E (hex) Burster GmbH & Co KG +00-23-6F (hex) DAQ System +00-23-70 (hex) PRO-BEL LIMITED +00-23-71 (hex) SOAM Systel +00-23-72 (hex) MORE STAR INDUSTRIAL GROUP LIMITED +00-23-73 (hex) GridIron Systems, Inc. +00-23-74 (hex) Motorola CHS +00-23-75 (hex) Motorola CHS +00-23-76 (hex) HTC Corporation +00-23-77 (hex) Isotek Electronics Ltd +00-23-78 (hex) GN Netcom A/S +00-23-79 (hex) Union Business Machines Co. Ltd. +00-23-7A (hex) RIM +00-23-7B (hex) WHDI LLC +00-23-7C (hex) NEOTION +00-23-7D (hex) Hewlett Packard +00-23-7E (hex) ELSTER GMBH +00-23-7F (hex) PLANTRONICS +00-23-80 (hex) Nanoteq +00-23-81 (hex) Lengda Technology(Xiamen) Co.,Ltd. +00-23-82 (hex) Lih Rong Electronic Enterprise Co., Ltd. +00-23-83 (hex) InMage Systems Inc +00-23-84 (hex) GGH Engineering s.r.l. +00-23-85 (hex) ANTIPODE +00-23-86 (hex) Tour & Andersson AB +00-23-87 (hex) ThinkFlood, Inc. +00-23-88 (hex) V.T. Telematica S.p.a. +00-23-89 (hex) HANGZHOU H3C Technologies Co., Ltd. +00-23-8A (hex) Ciena Corporation +00-23-8B (hex) Quanta Computer Inc. +00-23-8C (hex) PRIVATE +00-23-8D (hex) Techno Design Co., Ltd. +00-23-8E (hex) PIRELLI BROADBAND SOLUTIONS +00-23-8F (hex) NIDEC COPAL CORPORATION +00-23-90 (hex) Algolware Corporation +00-23-91 (hex) Maxian +00-23-92 (hex) Proteus Industries Inc. +00-23-93 (hex) AJINEXTEK +00-23-94 (hex) Samjeon +00-23-95 (hex) Motorola CHS +00-23-96 (hex) ANDES TECHNOLOGY CORPORATION +00-23-97 (hex) Westell Technologies Inc. +00-23-98 (hex) Sky Control +00-23-99 (hex) VD Division, Samsung Electronics Co. +00-23-9A (hex) EasyData Software GmbH +00-23-9B (hex) Elster Integrated Solutions +00-23-9C (hex) Juniper Networks +00-23-9D (hex) Mapower Electronics Co., Ltd +00-23-9E (hex) Jiangsu Lemote Technology Corporation Limited +00-23-9F (hex) Institut für Prüftechnik +00-23-A0 (hex) Hana CNS Co., LTD. +00-23-A1 (hex) Trend Electronics Ltd +00-23-A2 (hex) Motorola CHS +00-23-A3 (hex) Motorola CHS +00-23-A4 (hex) New Concepts Development Corp. +00-23-A5 (hex) SageTV, LLC +00-23-A6 (hex) E-Mon +00-23-A7 (hex) Redpine Signals, Inc. +00-23-A8 (hex) Marshall Electronics +00-23-A9 (hex) Beijing Detianquan Electromechanical Equipment Co., Ltd +00-23-AA (hex) HFR, Inc. +00-23-AB (hex) Cisco Systems +00-23-AC (hex) Cisco Systems +00-23-AD (hex) Xmark Corporation +00-23-AE (hex) Dell Inc. +00-23-AF (hex) Motorola Mobile Devices +00-23-B0 (hex) COMXION Technology Inc. +00-23-B1 (hex) Longcheer Technology (Singapore) Pte Ltd +00-23-B2 (hex) Intelligent Mechatronic Systems Inc +00-23-B3 (hex) Lyyn AB +00-23-B4 (hex) Nokia Danmark A/S +00-23-B5 (hex) ORTANA LTD +00-23-B6 (hex) SECURITE COMMUNICATIONS / HONEYWELL +00-23-B7 (hex) Q-Light Co., Ltd. +00-23-B8 (hex) Sichuan Jiuzhou Electronic Technology Co.,Ltd +00-23-B9 (hex) EADS Deutschland GmbH +00-23-BA (hex) Chroma +00-23-BB (hex) Schmitt Industries +00-23-BC (hex) EQ-SYS GmbH +00-23-BD (hex) Digital Ally, Inc. +00-23-BE (hex) Cisco SPVTG +00-23-BF (hex) Mainpine, Inc. +00-23-C0 (hex) Broadway Networks +00-23-C1 (hex) Securitas Direct AB +00-23-C2 (hex) SAMSUNG Electronics. Co. LTD +00-23-C3 (hex) LogMeIn, Inc. +00-23-C4 (hex) Lux Lumen +00-23-C5 (hex) Radiation Safety and Control Services Inc +00-23-C6 (hex) SMC Corporation +00-23-C7 (hex) AVSystem +00-23-C8 (hex) TEAM-R +00-23-C9 (hex) Sichuan Tianyi Information Science & Technology Stock CO.,LTD +00-23-CA (hex) Behind The Set, LLC +00-23-CB (hex) Shenzhen Full-join Technology Co.,Ltd +00-23-CC (hex) Nintendo Co., Ltd. +00-23-CD (hex) TP-LINK TECHNOLOGIES CO., LTD. +00-23-CE (hex) KITA DENSHI CORPORATION +00-23-CF (hex) CUMMINS-ALLISON CORP. +00-23-D0 (hex) Uniloc USA Inc. +00-23-D1 (hex) TRG +00-23-D2 (hex) Inhand Electronics, Inc. +00-23-D3 (hex) AirLink WiFi Networking Corp. +00-23-D4 (hex) Texas Instruments +00-23-D5 (hex) WAREMA electronic GmbH +00-23-D6 (hex) Samsung Electronics Co.,LTD +00-23-D7 (hex) Samsung Electronics +00-23-D8 (hex) Ball-It Oy +00-23-D9 (hex) Banner Engineering +00-23-DA (hex) Industrial Computer Source (Deutschland)GmbH +00-23-DB (hex) saxnet gmbh +00-23-DC (hex) Benein, Inc +00-23-DD (hex) ELGIN S.A. +00-23-DE (hex) Ansync Inc. +00-23-DF (hex) Apple, Inc +00-23-E0 (hex) INO Therapeutics LLC +00-23-E1 (hex) Cavena Image Products AB +00-23-E2 (hex) SEA Signalisation +00-23-E3 (hex) Microtronic AG +00-23-E4 (hex) IPnect co. ltd. +00-23-E5 (hex) IPaXiom Networks +00-23-E6 (hex) Pirkus, Inc. +00-23-E7 (hex) Hinke A/S +00-23-E8 (hex) Demco Corp. +00-23-E9 (hex) F5 Networks, Inc. +00-23-EA (hex) Cisco Systems +00-23-EB (hex) Cisco Systems +00-23-EC (hex) Algorithmix GmbH +00-23-ED (hex) Motorola CHS +00-23-EE (hex) Motorola CHS +00-23-EF (hex) Zuend Systemtechnik AG +00-23-F0 (hex) Shanghai Jinghan Weighing Apparatus Co. Ltd. +00-23-F1 (hex) Sony Ericsson Mobile Communications +00-23-F2 (hex) TVLogic +00-23-F3 (hex) Glocom, Inc. +00-23-F4 (hex) Masternaut +00-23-F5 (hex) WILO SE +00-23-F6 (hex) Softwell Technology Co., Ltd. +00-23-F7 (hex) PRIVATE +00-23-F8 (hex) ZyXEL Communications Corporation +00-23-F9 (hex) Double-Take Software, INC. +00-23-FA (hex) RG Nets, Inc. +00-23-FB (hex) IP Datatel, Inc. +00-23-FC (hex) Ultra Stereo Labs, Inc +00-23-FD (hex) AFT Atlas Fahrzeugtechnik GmbH +00-23-FE (hex) Biodevices, SA +00-23-FF (hex) Beijing HTTC Technology Ltd. +00-24-00 (hex) Nortel Networks +00-24-01 (hex) D-Link Corporation +00-24-02 (hex) Op-Tection GmbH +00-24-03 (hex) Nokia Danmark A/S +00-24-04 (hex) Nokia Danmark A/S +00-24-05 (hex) Dilog Nordic AB +00-24-06 (hex) Pointmobile +00-24-07 (hex) TELEM SAS +00-24-08 (hex) Pacific Biosciences +00-24-09 (hex) The Toro Company +00-24-0A (hex) US Beverage Net +00-24-0B (hex) Virtual Computer Inc. +00-24-0C (hex) DELEC GmbH +00-24-0D (hex) OnePath Networks LTD. +00-24-0E (hex) Inventec Besta Co., Ltd. +00-24-0F (hex) Ishii Tool & Engineering Corporation +00-24-10 (hex) NUETEQ Technology,Inc. +00-24-11 (hex) PharmaSmart LLC +00-24-12 (hex) Benign Technologies Co, Ltd. +00-24-13 (hex) Cisco Systems +00-24-14 (hex) Cisco Systems +00-24-15 (hex) Magnetic Autocontrol GmbH +00-24-16 (hex) Any Use +00-24-17 (hex) Thomson Telecom Belgium +00-24-18 (hex) Nextwave Semiconductor +00-24-19 (hex) PRIVATE +00-24-1A (hex) Red Beetle Inc. +00-24-1B (hex) iWOW Communications Pte Ltd +00-24-1C (hex) FuGang Electronic (DG) Co.,Ltd +00-24-1D (hex) GIGA-BYTE TECHNOLOGY CO.,LTD. +00-24-1E (hex) Nintendo Co., Ltd. +00-24-1F (hex) DCT-Delta GmbH +00-24-20 (hex) NetUP Inc. +00-24-21 (hex) MICRO-STAR INT'L CO., LTD. +00-24-22 (hex) Knapp Logistik Automation GmbH +00-24-23 (hex) AzureWave Technologies (Shanghai) Inc. +00-24-24 (hex) Axis Network Technology +00-24-25 (hex) Shenzhenshi chuangzhicheng Technology Co.,Ltd +00-24-26 (hex) NOHMI BOSAI LTD. +00-24-27 (hex) SSI COMPUTER CORP +00-24-28 (hex) EnergyICT +00-24-29 (hex) MK MASTER INC. +00-24-2A (hex) Hittite Microwave Corporation +00-24-2B (hex) Hon Hai Precision Ind.Co.,Ltd. +00-24-2C (hex) Hon Hai Precision Ind. Co., Ltd. +00-24-2E (hex) Datastrip Inc. +00-24-2F (hex) VirtenSys Inc +00-24-30 (hex) Ruby Tech Corp. +00-24-31 (hex) Uni-v co.,ltd +00-24-32 (hex) Neostar Technology Co.,LTD +00-24-33 (hex) Alps Electric Co., Ltd +00-24-34 (hex) Lectrosonics, Inc. +00-24-35 (hex) WIDE CORPORATION +00-24-36 (hex) Apple, Inc +00-24-37 (hex) Motorola - BSG +00-24-38 (hex) Brocade Communications Systems, Inc +00-24-39 (hex) Essential Viewing Systems Limited +00-24-3A (hex) Ludl Electronic Products +00-24-3B (hex) CSSI (S) Pte Ltd +00-24-3C (hex) S.A.A.A. +00-24-3D (hex) Emerson Appliance Motors and Controls +00-24-3F (hex) Storwize, Inc. +00-24-40 (hex) Halo Monitoring, Inc. +00-24-41 (hex) Wanzl Metallwarenfabrik GmbH +00-24-42 (hex) Axona Limited +00-24-43 (hex) Nortel Networks +00-24-44 (hex) Nintendo Co., Ltd. +00-24-45 (hex) LiquidxStream Systems Inc. +00-24-46 (hex) MMB Research Inc. +00-24-47 (hex) Kaztek Systems +00-24-48 (hex) SpiderCloud Wireless, Inc +00-24-49 (hex) Shen Zhen Lite Star Electronics Technology Co., Ltd +00-24-4A (hex) Voyant International +00-24-4B (hex) PERCEPTRON INC +00-24-4C (hex) Solartron Metrology Ltd +00-24-4D (hex) Hokkaido Electronics Corporation +00-24-4E (hex) RadChips, Inc. +00-24-4F (hex) Asantron Technologies Ltd. +00-24-50 (hex) Cisco Systems +00-24-51 (hex) Cisco Systems +00-24-52 (hex) Silicon Software GmbH +00-24-53 (hex) Initra d.o.o. +00-24-54 (hex) Samsung Electronics Co., LTD +00-24-55 (hex) MuLogic BV +00-24-56 (hex) 2Wire +00-24-58 (hex) PA Bastion CC +00-24-59 (hex) ABB STOTZ-KONTAKT GmbH +00-24-5A (hex) Nanjing Panda Electronics Company Limited +00-24-5B (hex) RAIDON TECHNOLOGY, INC. +00-24-5C (hex) Design-Com Technologies Pty. Ltd. +00-24-5D (hex) Terberg besturingstechniek B.V. +00-24-5E (hex) Hivision Co.,ltd +00-24-5F (hex) Vine Telecom CO.,Ltd. +00-24-60 (hex) Giaval Science Development Co. Ltd. +00-24-61 (hex) Shin Wang Tech. +00-24-62 (hex) Rayzone Corporation +00-24-63 (hex) Phybridge Inc +00-24-64 (hex) Bridge Technologies Co AS +00-24-65 (hex) Elentec +00-24-66 (hex) Unitron nv +00-24-67 (hex) AOC International (Europe) GmbH +00-24-68 (hex) Sumavision Technologies Co.,Ltd +00-24-69 (hex) Smart Doorphones +00-24-6A (hex) Solid Year Co., Ltd. +00-24-6B (hex) Coventive +00-24-6C (hex) ARUBA NETWORKS, INC. +00-24-6D (hex) Weinzierl Engineering GmbH +00-24-6E (hex) Phihong USA Corp. +00-24-6F (hex) Onda Communication spa +00-24-70 (hex) AUROTECH ultrasound AS. +00-24-71 (hex) Fusion MultiSystems dba Fusion-io +00-24-72 (hex) ReDriven Power Inc. +00-24-73 (hex) 3Com Europe Ltd +00-24-74 (hex) Autronica Fire And Securirty +00-24-75 (hex) Compass System(Embedded Dept.) +00-24-76 (hex) TAP.tv +00-24-77 (hex) Tibbo Technology +00-24-78 (hex) Mag Tech Electronics Co Limited +00-24-79 (hex) Optec Displays, Inc. +00-24-7A (hex) FU YI CHENG Technology Co., Ltd. +00-24-7B (hex) Actiontec Electronics, Inc +00-24-7C (hex) Nokia Danmark A/S +00-24-7D (hex) Nokia Danmark A/S +00-24-7E (hex) USI +00-24-7F (hex) Nortel Networks +00-24-80 (hex) Meteocontrol GmbH +00-24-81 (hex) Hewlett Packard +00-24-82 (hex) Ruckus Wireless +00-24-83 (hex) LG Electronics +00-24-84 (hex) Bang and Olufsen Medicom a/s +00-24-85 (hex) ConteXtream Ltd +00-24-86 (hex) DesignArt Networks +00-24-87 (hex) Blackboard Inc. +00-24-88 (hex) Centre For Development Of Telematics +00-24-89 (hex) Vodafone Omnitel N.V. +00-24-8A (hex) Kaga Electronics Co., Ltd. +00-24-8B (hex) HYBUS CO., LTD. +00-24-8C (hex) ASUSTek COMPUTER INC. +00-24-8D (hex) Sony Computer Entertainment Inc. +00-24-8E (hex) Infoware ZRt. +00-24-8F (hex) DO-MONIX +00-24-90 (hex) Samsung Electronics Co.,LTD +00-24-91 (hex) Samsung Electronics +00-24-92 (hex) Motorola, Broadband Solutions Group +00-24-93 (hex) Motorola, Inc +00-24-94 (hex) Shenzhen Baoxin Tech CO., Ltd. +00-24-95 (hex) Motorola Mobile Devices +00-24-96 (hex) Ginzinger electronic systems +00-24-97 (hex) Cisco Systems +00-24-98 (hex) Cisco Systems +00-24-99 (hex) Aquila Technologies +00-24-9A (hex) Beijing Zhongchuang Telecommunication Test Co., Ltd. +00-24-9B (hex) Action Star Enterprise Co., Ltd. +00-24-9C (hex) Bimeng Comunication System Co. Ltd +00-24-9D (hex) NES Technology Inc. +00-24-9E (hex) ADC-Elektronik GmbH +00-24-9F (hex) RIM Testing Services +00-24-A0 (hex) Motorola CHS +00-24-A1 (hex) Motorola CHS +00-24-A2 (hex) Hong Kong Middleware Technology Limited +00-24-A3 (hex) Sonim Technologies Inc +00-24-A4 (hex) Siklu Communication +00-24-A5 (hex) Buffalo Inc. +00-24-A6 (hex) TELESTAR DIGITAL GmbH +00-24-A7 (hex) Advanced Video Communications Inc. +00-24-A8 (hex) ProCurve Networking by HP +00-24-A9 (hex) Ag Leader Technology +00-24-AA (hex) Dycor Technologies Ltd. +00-24-AB (hex) A7 Engineering, Inc. +00-24-AC (hex) Hangzhou DPtech Technologies Co., Ltd. +00-24-AD (hex) Adolf Thies Gmbh & Co. KG +00-24-AE (hex) SAGEM SECURITE +00-24-AF (hex) EchoStar Technologies +00-24-B0 (hex) ESAB AB +00-24-B1 (hex) Coulomb Technologies +00-24-B2 (hex) Netgear +00-24-B3 (hex) Graf-Syteco GmbH & Co. KG +00-24-B4 (hex) ESCATRONIC GmbH +00-24-B5 (hex) Nortel Networks +00-24-B6 (hex) Seagate Technology +00-24-B7 (hex) GridPoint, Inc. +00-24-B8 (hex) free alliance sdn bhd +00-24-B9 (hex) Wuhan Higheasy Electronic Technology Development Co.Ltd +00-24-BA (hex) Texas Instruments +00-24-BB (hex) CENTRAL Corporation +00-24-BC (hex) HuRob Co.,Ltd +00-24-BD (hex) Hainzl Industriesysteme GmbH +00-24-BE (hex) Sony Corporation +00-24-BF (hex) CIAT +00-24-C0 (hex) NTI COMODO INC +00-24-C1 (hex) Hangzhou Motorola Technologies LTD. +00-24-C2 (hex) Asumo Co.,Ltd. +00-24-C3 (hex) Cisco Systems +00-24-C4 (hex) Cisco Systems +00-24-C5 (hex) Meridian Audio Limited +00-24-C6 (hex) Hager Electro SAS +00-24-C7 (hex) Mobilarm Ltd +00-24-C8 (hex) Broadband Solutions Group +00-24-C9 (hex) Broadband Solutions Group +00-24-CA (hex) Tobii Technology AB +00-24-CB (hex) Autonet Mobile +00-24-CC (hex) Fascinations Toys and Gifts, Inc. +00-24-CD (hex) Willow Garage, Inc. +00-24-CE (hex) Exeltech Inc +00-24-CF (hex) Inscape Data Corporation +00-24-D0 (hex) Shenzhen SOGOOD Industry CO.,LTD. +00-24-D1 (hex) Thomson Inc. +00-24-D2 (hex) Askey Computer +00-24-D3 (hex) QUALICA Inc. +00-24-D4 (hex) FREEBOX SA +00-24-D5 (hex) Winward Industrial Limited +00-24-D6 (hex) Intel Corporate +00-24-D7 (hex) Intel Corporate +00-24-D8 (hex) IlSung Precision +00-24-D9 (hex) BICOM, Inc. +00-24-DA (hex) Innovar Systems Limited +00-24-DB (hex) Alcohol Monitoring Systems +00-24-DC (hex) Juniper Networks +00-24-DD (hex) Centrak, Inc. +00-24-DE (hex) GLOBAL Technology Inc. +00-24-DF (hex) Digitalbox Europe GmbH +00-24-E0 (hex) DS Tech, LLC +00-24-E1 (hex) Convey Computer Corp. +00-24-E2 (hex) HASEGAWA ELECTRIC CO.,LTD. +00-24-E3 (hex) CAO Group +00-24-E4 (hex) Withings +00-24-E5 (hex) Seer Technology, Inc +00-24-E6 (hex) In Motion Technology Inc. +00-24-E7 (hex) Plaster Networks +00-24-E8 (hex) Dell Inc. +00-24-E9 (hex) Samsung Electronics Co., Ltd., Storage System Division +00-24-EA (hex) iris-GmbH infrared & intelligent sensors +00-24-EB (hex) ClearPath Networks, Inc. +00-24-EC (hex) United Information Technology Co.,Ltd. +00-24-ED (hex) YT Elec. Co,.Ltd. +00-24-EE (hex) Wynmax Inc. +00-24-EF (hex) Sony Ericsson Mobile Communications +00-24-F0 (hex) Seanodes +00-24-F1 (hex) Shenzhen Fanhai Sanjiang Electronics Co., Ltd. +00-24-F2 (hex) Uniphone Telecommunication Co., Ltd. +00-24-F3 (hex) Nintendo Co., Ltd. +00-24-F4 (hex) Kaminario Technologies Ltd. +00-24-F5 (hex) NDS Surgical Imaging +00-24-F6 (hex) MIYOSHI ELECTRONICS CORPORATION +00-24-F7 (hex) Cisco Systems +00-24-F8 (hex) Technical Solutions Company Ltd. +00-24-F9 (hex) Cisco Systems +00-24-FA (hex) Hilger u. Kern GMBH +00-24-FB (hex) PRIVATE +00-24-FC (hex) QuoPin Co., Ltd. +00-24-FD (hex) Prosilient Technologies AB +00-24-FE (hex) AVM GmbH +00-24-FF (hex) QLogic Corporation +00-25-00 (hex) Apple, Inc +00-25-01 (hex) JSC "Supertel" +00-25-02 (hex) NaturalPoint +00-25-03 (hex) BLADE Network Technology +00-25-04 (hex) Valiant Communications Limited +00-25-05 (hex) eks Engel GmbH & Co. KG +00-25-06 (hex) A.I. ANTITACCHEGGIO ITALIA SRL +00-25-07 (hex) ASTAK Inc. +00-25-08 (hex) Maquet Cardiopulmonary AG +00-25-09 (hex) SHARETRONIC Group LTD +00-25-0A (hex) Security Expert Co. Ltd +00-25-0B (hex) CENTROFACTOR INC +00-25-0C (hex) Enertrac +00-25-0D (hex) GZT Telkom-Telmor sp. z o.o. +00-25-0E (hex) gt german telematics gmbh +00-25-0F (hex) On-Ramp Wireless, Inc. +00-25-10 (hex) Pico-Tesla Magnetic Therapies +00-25-11 (hex) ELITEGROUP COMPUTER SYSTEM CO., LTD. +00-25-12 (hex) ZTE Corporation +00-25-13 (hex) CXP DIGITAL BV +00-25-14 (hex) PC Worth Int'l Co., Ltd. +00-25-15 (hex) SFR +00-25-16 (hex) Integrated Design Tools, Inc. +00-25-17 (hex) Venntis, LLC +00-25-18 (hex) Power PLUS Communications AG +00-25-19 (hex) Viaas Inc +00-25-1A (hex) Psiber Data Systems Inc. +00-25-1B (hex) Philips CareServant +00-25-1C (hex) EDT +00-25-1D (hex) DSA Encore, LLC +00-25-1E (hex) ROTEL TECHNOLOGIES +00-25-1F (hex) ZYNUS VISION INC. +00-25-20 (hex) SMA Railway Technology GmbH +00-25-21 (hex) Logitek Electronic Systems, Inc. +00-25-22 (hex) ASRock Incorporation +00-25-23 (hex) OCP Inc. +00-25-24 (hex) Lightcomm Technology Co., Ltd +00-25-25 (hex) CTERA Networks Ltd. +00-25-26 (hex) Genuine Technologies Co., Ltd. +00-25-27 (hex) Bitrode Corp. +00-25-28 (hex) Daido Signal Co., Ltd. +00-25-29 (hex) COMELIT GROUP S.P.A +00-25-2A (hex) Chengdu GeeYa Technology Co.,LTD +00-25-2B (hex) Stirling Energy Systems +00-25-2C (hex) Entourage Systems, Inc. +00-25-2D (hex) Kiryung Electronics +00-25-2E (hex) Cisco SPVTG +00-25-2F (hex) Energy, Inc. +00-25-30 (hex) Aetas Systems Inc. +00-25-31 (hex) Cloud Engines, Inc. +00-25-32 (hex) Digital Recorders +00-25-33 (hex) WITTENSTEIN AG +00-25-35 (hex) Minimax GmbH & Co KG +00-25-36 (hex) Oki Electric Industry Co., Ltd. +00-25-37 (hex) Runcom Technologies Ltd. +00-25-38 (hex) Samsung Electronics Co., Ltd., Memory Division +00-25-39 (hex) IfTA GmbH +00-25-3A (hex) CEVA, Ltd. +00-25-3B (hex) din Dietmar Nocker Facilitymanagement GmbH +00-25-3C (hex) 2Wire +00-25-3D (hex) DRS Consolidated Controls +00-25-3E (hex) Sensus Metering Systems +00-25-40 (hex) Quasar Technologies, Inc. +00-25-41 (hex) Maquet Critical Care AB +00-25-42 (hex) Pittasoft +00-25-43 (hex) MONEYTECH +00-25-44 (hex) LoJack Corporation +00-25-45 (hex) Cisco Systems +00-25-46 (hex) Cisco Systems +00-25-47 (hex) Nokia Danmark A/S +00-25-48 (hex) Nokia Danmark A/S +00-25-49 (hex) Jeorich Tech. Co.,Ltd. +00-25-4A (hex) RingCube Technologies, Inc. +00-25-4B (hex) Apple, Inc +00-25-4C (hex) Videon Central, Inc. +00-25-4D (hex) Singapore Technologies Electronics Limited +00-25-4E (hex) Vertex Wireless Co., Ltd. +00-25-4F (hex) ELETTROLAB Srl +00-25-50 (hex) Riverbed Technology +00-25-51 (hex) SE-Elektronic GmbH +00-25-52 (hex) VXI CORPORATION +00-25-53 (hex) PIRELLI BROADBAND SOLUTIONS +00-25-54 (hex) Pixel8 Networks +00-25-55 (hex) Visonic Technologies 1993 Ltd +00-25-56 (hex) Hon Hai Precision Ind. Co., Ltd. +00-25-57 (hex) Research In Motion +00-25-58 (hex) MPEDIA +00-25-59 (hex) Syphan Technologies Ltd +00-25-5A (hex) Tantalus Systems Corp. +00-25-5B (hex) CoachComm, LLC +00-25-5C (hex) NEC Corporation +00-25-5D (hex) Morningstar Corporation +00-25-5E (hex) Shanghai Dare Technologies Co.,Ltd. +00-25-5F (hex) SenTec AG +00-25-60 (hex) Ibridge Networks & Communications Ltd. +00-25-61 (hex) ProCurve Networking by HP +00-25-62 (hex) interbro Co. Ltd. +00-25-63 (hex) Luxtera Inc +00-25-64 (hex) Dell Inc. +00-25-65 (hex) Vizimax Inc. +00-25-66 (hex) Samsung Electronics Co.,Ltd +00-25-67 (hex) Samsung Electronics +00-25-68 (hex) Shenzhen Huawei Communication Technologies Co., Ltd +00-25-69 (hex) SAGEM COMMUNICATION +00-25-6A (hex) inIT - Institut Industrial IT +00-25-6B (hex) ATENIX E.E. s.r.l. +00-25-6C (hex) "Azimut" Production Association JSC +00-25-6D (hex) Broadband Forum +00-25-6E (hex) Van Breda B.V. +00-25-6F (hex) Dantherm Power +00-25-70 (hex) Eastern Communications Company Limited +00-25-71 (hex) Zhejiang Tianle Digital Electric Co.,Ltd +00-25-72 (hex) Nemo-Q International AB +00-25-73 (hex) ST Electronics (Info-Security) Pte Ltd +00-25-74 (hex) KUNIMI MEDIA DEVICE Co., Ltd. +00-25-75 (hex) FiberPlex Inc +00-25-76 (hex) NELI TECHNOLOGIES +00-25-77 (hex) D-BOX Technologies +00-25-78 (hex) JSC "Concern "Sozvezdie" +00-25-79 (hex) J & F Labs +00-25-7A (hex) CAMCO Produktions- und Vertriebs-GmbH für Beschallungs- und Beleuchtungsanlagen +00-25-7B (hex) STJ ELECTRONICS PVT LTD +00-25-7C (hex) Huachentel Technology Development Co., Ltd +00-25-7D (hex) PointRed Telecom Private Ltd. +00-25-7E (hex) NEW POS Technology Limited +00-25-7F (hex) CallTechSolution Co.,Ltd +00-25-80 (hex) Equipson S.A. +00-25-81 (hex) x-star networks Inc. +00-25-82 (hex) Maksat Technologies (P) Ltd +00-25-83 (hex) Cisco Systems +00-25-84 (hex) Cisco Systems +00-25-85 (hex) KOKUYO S&T Co., Ltd. +00-25-86 (hex) TP-LINK Technologies Co., Ltd. +00-25-87 (hex) Vitality, Inc. +00-25-88 (hex) Genie Industries, Inc. +00-25-89 (hex) Hills Industries Limited +00-25-8A (hex) Pole/Zero Corporation +00-25-8B (hex) Mellanox Technologies Ltd +00-25-8C (hex) ESUS ELEKTRONIK SAN. VE DIS. TIC. LTD. STI. +00-25-8D (hex) Haier +00-25-8E (hex) The Weather Channel +00-25-8F (hex) Trident Microsystems, Inc. +00-25-90 (hex) Super Micro Computer, Inc. +00-25-91 (hex) NEXTEK, Inc. +00-25-92 (hex) Guangzhou Shirui Electronic Co., Ltd +00-25-93 (hex) DatNet Informatikai Kft. +00-25-94 (hex) Eurodesign BG LTD +00-25-95 (hex) Northwest Signal Supply, Inc +00-25-96 (hex) GIGAVISION srl +00-25-97 (hex) Kalki Communication Technologies +00-25-98 (hex) Zhong Shan City Litai Electronic Industrial Co. Ltd +00-25-99 (hex) Hedon e.d. B.V. +00-25-9A (hex) CEStronics GmbH +00-25-9B (hex) Beijing PKUNITY Microsystems Technology Co., Ltd +00-25-9C (hex) Cisco-Linksys, LLC +00-25-9D (hex) PRIVATE +00-25-9E (hex) Huawei Technologies Co., Ltd. +00-25-9F (hex) TechnoDigital Technologies GmbH +00-25-A0 (hex) Nintendo Co., Ltd. +00-25-A1 (hex) Enalasys +00-25-A2 (hex) Alta Definicion LINCEO S.L. +00-25-A3 (hex) Trimax Wireless, Inc. +00-25-A4 (hex) EuroDesign embedded technologies GmbH +00-25-A5 (hex) Walnut Media Network +00-25-A6 (hex) Central Network Solution Co., Ltd. +00-25-A7 (hex) Comverge, Inc. +00-25-A8 (hex) Kontron (BeiJing) Technology Co.,Ltd +00-25-A9 (hex) Shanghai Embedway Information Technologies Co.,Ltd +00-25-AA (hex) Beijing Soul Technology Co.,Ltd. +00-25-AB (hex) AIO LCD PC BU / TPV +00-25-AC (hex) I-Tech corporation +00-25-AD (hex) Manufacturing Resources International +00-25-AE (hex) Microsoft Corporation +00-25-AF (hex) COMFILE Technology +00-25-B0 (hex) Schmartz Inc +00-25-B1 (hex) Maya-Creation Corporation +00-25-B2 (hex) LFK-Lenkflugkörpersysteme GmbH +00-25-B3 (hex) Hewlett Packard +00-25-B4 (hex) Cisco Systems +00-25-B5 (hex) Cisco Systems +00-25-B6 (hex) Telecom FM +00-25-B7 (hex) Costar electronics, inc., +00-25-B8 (hex) Agile Communications, Inc. +00-25-B9 (hex) Agilink Systems Corp. +00-25-BA (hex) Alcatel-Lucent IPD +00-25-BB (hex) INNERINT Co., Ltd. +00-25-BC (hex) Apple, Inc +00-25-BD (hex) Italdata Ingegneria dell'Idea S.p.A. +00-25-BE (hex) Tektrap Systems Inc. +00-25-BF (hex) Wireless Cables Inc. +00-25-C0 (hex) ZillionTV Corporation +00-25-C1 (hex) Nawoo Korea Corp. +00-25-C2 (hex) RingBell Co.,Ltd. +00-25-C3 (hex) Nortel Networks +00-25-C4 (hex) Ruckus Wireless +00-25-C5 (hex) Star Link Communication Pvt. Ltd. +00-25-C6 (hex) kasercorp, ltd +00-25-C7 (hex) altek Corporation +00-25-C8 (hex) S-Access GmbH +00-25-C9 (hex) SHENZHEN HUAPU DIGITAL CO., LTD +00-25-CA (hex) LS Research, LLC +00-25-CB (hex) Reiner SCT +00-25-CC (hex) Mobile Communications Korea Incorporated +00-25-CD (hex) Skylane Optics +00-25-CE (hex) InnerSpace +00-25-CF (hex) Nokia Danmark A/S +00-25-D0 (hex) Nokia Danmark A/S +00-25-D1 (hex) Eastech Electronics (Taiwan) Inc. +00-25-D2 (hex) InpegVision Co., Ltd +00-25-D3 (hex) AzureWave Technologies, Inc +00-25-D4 (hex) Fortress Technologies +00-25-D5 (hex) Robonica (Pty) Ltd +00-25-D6 (hex) The Kroger Co. +00-25-D7 (hex) CEDO +00-25-D8 (hex) KOREA MAINTENANCE +00-25-D9 (hex) DataFab Systems Inc. +00-25-DA (hex) Secura Key +00-25-DB (hex) ATI Electronics(Shenzhen) Co., LTD +00-25-DC (hex) Sumitomo Electric Networks, Inc +00-25-DD (hex) SUNNYTEK INFORMATION CO., LTD. +00-25-DE (hex) Probits Co., LTD. +00-25-DF (hex) PRIVATE +00-25-E0 (hex) CeedTec Sdn Bhd +00-25-E1 (hex) SHANGHAI SEEYOO ELECTRONIC & TECHNOLOGY CO., LTD +00-25-E2 (hex) Everspring Industry Co., Ltd. +00-25-E3 (hex) Hanshinit Inc. +00-25-E4 (hex) OMNI-WiFi, LLC +00-25-E5 (hex) LG Electronics Inc +00-25-E6 (hex) Belgian Monitoring Systems bvba +00-25-E7 (hex) Sony Ericsson Mobile Communications +00-25-E8 (hex) Idaho Technology +00-25-E9 (hex) i-mate Development, Inc. +00-25-EA (hex) Iphion BV +00-25-EB (hex) Reutech Radar Systems (PTY) Ltd +00-25-EC (hex) Humanware +00-25-ED (hex) NuVo Technologies LLC +00-25-EE (hex) Avtex Ltd +00-25-EF (hex) I-TEC Co., Ltd. +00-25-F0 (hex) Suga Electronics Limited +00-25-F1 (hex) Motorola CHS +00-25-F2 (hex) Motorola CHS +00-25-F3 (hex) Nordwestdeutsche Zählerrevision +00-25-F4 (hex) KoCo Connector AG +00-25-F5 (hex) DVS Korea, Co., Ltd +00-25-F6 (hex) netTALK.com, Inc. +00-25-F7 (hex) Ansaldo STS USA +00-25-F9 (hex) GMK electronic design GmbH +00-25-FA (hex) J&M Analytik AG +00-25-FB (hex) Tunstall Healthcare A/S +00-25-FC (hex) ENDA ENDUSTRIYEL ELEKTRONIK LTD. STI. +00-25-FD (hex) OBR Centrum Techniki Morskiej S.A. +00-25-FE (hex) Pilot Electronics Corporation +00-25-FF (hex) CreNova Technology GmbH +00-26-00 (hex) TEAC Australia Pty Ltd. +00-26-01 (hex) PRIVATE +00-26-02 (hex) SMART Temps LLC +00-26-03 (hex) Shenzhen Wistar Technology Co., Ltd +00-26-04 (hex) Audio Processing Technology Ltd +00-26-05 (hex) CC Systems AB +00-26-06 (hex) RAUMFELD GmbH +00-26-07 (hex) Enabling Technology Pty Ltd +00-26-08 (hex) Apple, Inc +00-26-09 (hex) Phyllis Co., Ltd. +00-26-0A (hex) Cisco Systems +00-26-0B (hex) Cisco Systems +00-26-0C (hex) Dataram +00-26-0D (hex) Micronetics, Inc. +00-26-0E (hex) Ablaze Systems, LLC +00-26-0F (hex) Linn Products Ltd +00-26-10 (hex) Apacewave Technologies +00-26-11 (hex) Licera AB +00-26-12 (hex) Space Exploration Technologies +00-26-13 (hex) Engel Axil S.L. +00-26-14 (hex) KTNF +00-26-15 (hex) Teracom Limited +00-26-16 (hex) Rosemount Inc. +00-26-17 (hex) OEM Worldwide +00-26-18 (hex) ASUSTek COMPUTER INC. +00-26-19 (hex) FRC +00-26-1A (hex) Femtocomm System Technology Corp. +00-26-1B (hex) LAUREL BANK MACHINES CO., LTD. +00-26-1C (hex) NEOVIA INC. +00-26-1D (hex) COP SECURITY SYSTEM CORP. +00-26-1E (hex) QINGBANG ELEC(SZ) CO., LTD +00-26-1F (hex) SAE Magnetics (H.K.) Ltd. +00-26-20 (hex) ISGUS GmbH +00-26-21 (hex) InteliCloud Technology Inc. +00-26-22 (hex) COMPAL INFORMATION (KUNSHAN) CO., LTD. +00-26-23 (hex) JRD Communication Inc +00-26-24 (hex) Thomson Inc. +00-26-25 (hex) MediaSputnik +00-26-26 (hex) Geophysical Survey Systems, Inc. +00-26-27 (hex) Truesell +00-26-28 (hex) companytec automação e controle ltda +00-26-29 (hex) Juphoon System Software Inc. +00-26-2A (hex) Proxense, LLC +00-26-2B (hex) Wongs Electronics Co. Ltd. +00-26-2C (hex) IKT Advanced Technologies s.r.o. +00-26-2D (hex) Wistron Corporation +00-26-2E (hex) Chengdu Jiuzhou Electronic Technology Inc +00-26-2F (hex) HAMAMATSU TOA ELECTRONICS +00-26-30 (hex) ACOREL S.A.S +00-26-31 (hex) COMMTACT LTD +00-26-32 (hex) Instrumentation Technologies d.d. +00-26-33 (hex) MIR - Medical International Research +00-26-34 (hex) Infineta Systems, Inc +00-26-35 (hex) Bluetechnix GmbH +00-26-36 (hex) Motorola Mobile Devices +00-26-37 (hex) Samsung Electro-Mechanics +00-26-38 (hex) Xia Men Joyatech Co., Ltd. +00-26-39 (hex) T.M. Electronics, Inc. +00-26-3A (hex) Digitec Systems +00-26-3B (hex) Onbnetech +00-26-3C (hex) Bachmann GmbH & Co. KG +00-26-3D (hex) MIA Corporation +00-26-3E (hex) Trapeze Networks +00-26-3F (hex) LIOS Technology GmbH +00-26-40 (hex) Baustem Broadband Technologies, Ltd. +00-26-41 (hex) Motorola, Inc +00-26-42 (hex) Motorola, Inc +00-26-43 (hex) Alps Electric Co., Ltd +00-26-44 (hex) Thomson Telecom Belgium +00-26-45 (hex) Circontrol S.A. +00-26-46 (hex) SHENYANG TONGFANG MULTIMEDIA TECHNOLOGY COMPANY LIMITED +00-26-47 (hex) WFE TECHNOLOGY CORP. +00-26-48 (hex) Emitech Corp. +00-26-4A (hex) Apple, Inc +00-26-4C (hex) Shanghai DigiVision Technology Co., Ltd. +00-26-4D (hex) Arcadyan Technology Corporation +00-26-4E (hex) Rail & Road Protec GmbH +00-26-4F (hex) Krüger&Gothe GmbH +00-26-50 (hex) 2Wire +00-26-51 (hex) Cisco Systems +00-26-52 (hex) Cisco Systems +00-26-53 (hex) DaySequerra Corporation +00-26-54 (hex) 3Com Corporation +00-26-55 (hex) Hewlett Packard +00-26-56 (hex) Sansonic Electronics USA +00-26-57 (hex) OOO NPP EKRA +00-26-58 (hex) T-Platforms (Cyprus) Limited +00-26-59 (hex) Nintendo Co., Ltd. +00-26-5A (hex) D-Link Corporation +00-26-5B (hex) Hitron Technologies. Inc +00-26-5C (hex) Hon Hai Precision Ind. Co.,Ltd. +00-26-5D (hex) Samsung Electronics +00-26-5E (hex) Hon Hai Precision Ind. Co.,Ltd. +00-26-5F (hex) Samsung Electronics Co.,Ltd +00-26-60 (hex) Logiways +00-26-61 (hex) Irumtek Co., Ltd. +00-26-62 (hex) Actiontec Electronics, Inc +00-26-63 (hex) Shenzhen Huitaiwei Tech. Ltd, co. +00-26-64 (hex) Core System Japan +00-26-65 (hex) ProtectedLogic Corporation +00-26-66 (hex) EFM Networks +00-26-67 (hex) CARECOM CO.,LTD. +00-26-68 (hex) Nokia Danmark A/S +00-26-69 (hex) Nokia Danmark A/S +00-26-6A (hex) ESSENSIUM NV +00-26-6B (hex) SHINE UNION ENTERPRISE LIMITED +00-26-6C (hex) Inventec +00-26-6D (hex) MobileAccess Networks +00-26-6E (hex) Nissho-denki Co.,LTD. +00-26-6F (hex) Coordiwise Technology Corp. +00-26-70 (hex) Cinch Connectors +00-26-71 (hex) AUTOVISION Co., Ltd +00-26-72 (hex) AAMP of America +00-26-73 (hex) RICOH COMPANY LTD. +00-26-74 (hex) Electronic Solutions, Inc. +00-26-75 (hex) Aztech Electronics Pte Ltd +00-26-76 (hex) COMMidt AS +00-26-77 (hex) DEIF A/S +00-26-78 (hex) Logic Instrument SA +00-26-79 (hex) Euphonic Technologies, Inc. +00-26-7A (hex) wuhan hongxin telecommunication technologies co.,ltd +00-26-7B (hex) GSI Helmholtzzentrum für Schwerionenforschung GmbH +00-26-7C (hex) Metz-Werke GmbH & Co KG +00-26-7D (hex) A-Max Technology Macao Commercial Offshore Company Limited +00-26-7E (hex) Parrot SA +00-26-7F (hex) Zenterio AB +00-26-80 (hex) Lockie Innovation Pty Ltd +00-26-81 (hex) Interspiro AB +00-26-82 (hex) Gemtek Technology Co., Ltd. +00-26-83 (hex) Ajoho Enterprise Co., Ltd. +00-26-84 (hex) KISAN SYSTEM +00-26-85 (hex) Digital Innovation +00-26-86 (hex) Quantenna Communcations, Inc. +00-26-87 (hex) ALLIED TELESIS, K.K corega division. +00-26-88 (hex) Juniper Networks +00-26-89 (hex) General Dynamics Robotic Systems +00-26-8A (hex) Terrier SC Ltd +00-26-8B (hex) Guangzhou Escene Computer Technology Limited +00-26-8C (hex) StarLeaf Ltd. +00-26-8D (hex) CellTel S.p.A. +00-26-8E (hex) Alta Solutions, Inc. +00-26-8F (hex) MTA SpA +00-26-90 (hex) I DO IT +00-26-91 (hex) SAGEM COMMUNICATION +00-26-92 (hex) Mitsubishi Electric Co. +00-26-93 (hex) QVidium Technologies, Inc. +00-26-94 (hex) Senscient Ltd +00-26-95 (hex) ZT Group Int'l Inc +00-26-96 (hex) NOOLIX Co., Ltd +00-26-97 (hex) Cheetah Technologies, L.P. +00-26-98 (hex) Cisco Systems +00-26-99 (hex) Cisco Systems +00-26-9A (hex) carina system co., ltd. +00-26-9B (hex) SOKRAT Ltd. +00-26-9C (hex) ITUS JAPAN CO. LTD +00-26-9D (hex) M2Mnet Co., Ltd. +00-26-9E (hex) Quanta Computer Inc +00-26-9F (hex) PRIVATE +00-26-A0 (hex) moblic +00-26-A1 (hex) Megger +00-26-A2 (hex) Instrumentation Technology Systems +00-26-A3 (hex) FQ Ingenieria Electronica S.A. +00-26-A4 (hex) Novus Produtos Eletronicos Ltda +00-26-A5 (hex) MICROROBOT.CO.,LTD +00-26-A6 (hex) TRIXELL +00-26-A7 (hex) CONNECT SRL +00-26-A8 (hex) DAEHAP HYPER-TECH +00-26-A9 (hex) Strong Technologies Pty Ltd +00-26-AA (hex) Kenmec Mechanical Engineering Co., Ltd. +00-26-AB (hex) SEIKO EPSON CORPORATION +00-26-AC (hex) Shanghai LUSTER Teraband photonic Co., Ltd. +00-26-AD (hex) Arada Systems, Inc. +00-26-AE (hex) Wireless Measurement Ltd +00-26-AF (hex) Duelco A/S +00-26-B0 (hex) Apple, Inc +00-26-B1 (hex) Harman/Navis +00-26-B2 (hex) Setrix AG +00-26-B3 (hex) Thales Communications Inc +00-26-B4 (hex) Ford Motor Company +00-26-B5 (hex) ICOMM Tele Ltd +00-26-B6 (hex) Askey Computer +00-26-B7 (hex) Kingston Technology Company, Inc. +00-26-B8 (hex) Actiontec Electronics, Inc +00-26-B9 (hex) Dell Inc +00-26-BA (hex) Motorola Mobile Devices +00-26-BB (hex) Apple, Inc +00-26-BC (hex) General Jack Technology Ltd. +00-26-BD (hex) JTEC Card & Communication Co., Ltd. +00-26-BE (hex) Schoonderbeek Elektronica Systemen B.V. +00-26-BF (hex) ShenZhen Temobi Science&Tech Development Co.,Ltd +00-26-C0 (hex) EnergyHub +00-26-C1 (hex) ARTRAY CO., LTD. +00-26-C2 (hex) SCDI Co. LTD +00-26-C3 (hex) Insightek Corp. +00-26-C4 (hex) Cadmos microsystems S.r.l. +00-26-C5 (hex) Guangdong Gosun Telecommunications Co.,Ltd +00-26-C6 (hex) Intel Corporate +00-26-C7 (hex) Intel Corporate +00-26-C8 (hex) System Sensor +00-26-C9 (hex) Proventix Systems, Inc. +00-26-CA (hex) Cisco Systems +00-26-CB (hex) Cisco Systems +00-26-CC (hex) Nokia Danmark A/S +00-26-CD (hex) PurpleComm, Inc. +00-26-CE (hex) Kozumi USA Corp. +00-26-CF (hex) DEKA R&D +00-26-D0 (hex) Semihalf +00-26-D1 (hex) S Squared Innovations Inc. +00-26-D2 (hex) Pcube Systems, Inc. +00-26-D3 (hex) Zeno Information System +00-26-D4 (hex) IRCA SpA +00-26-D5 (hex) Ory Solucoes em Comercio de Informatica Ltda. +00-26-D6 (hex) Ningbo Andy Optoelectronic Co., Ltd. +00-26-D7 (hex) Xiamen BB Electron & Technology Co., Ltd. +00-26-D8 (hex) Magic Point Inc. +00-26-D9 (hex) Pace Micro Technology plc +00-26-DA (hex) Universal Media Corporation /Slovakia/ s.r.o. +00-26-DB (hex) Ionics EMS Inc. +00-26-DC (hex) Optical Systems Design +00-26-DD (hex) Fival Corporation +00-26-DE (hex) FDI MATELEC +00-26-DF (hex) TaiDoc Technology Corp. +00-26-E0 (hex) ASITEQ +00-26-E1 (hex) Stanford University, OpenFlow Group +00-26-E2 (hex) LG Electronics +00-26-E3 (hex) DTI +00-26-E4 (hex) CANAL OVERSEAS +00-26-E5 (hex) AEG Power Solutions +00-26-E6 (hex) Visionhitech Co., Ltd. +00-26-E7 (hex) Shanghai ONLAN Communication Tech. Co., Ltd. +00-26-E8 (hex) Murata Manufacturing Co., Ltd. +00-26-E9 (hex) SP Corp +00-26-EA (hex) Cheerchip Electronic Technology (ShangHai) Co., Ltd. +00-26-EB (hex) Advanced Spectrum Technology Co., Ltd. +00-26-EC (hex) Legrand Home Systems, Inc +00-26-ED (hex) zte corporation +00-26-EE (hex) TKM GmbH +00-26-EF (hex) Technology Advancement Group, Inc. +00-26-F0 (hex) cTrixs International GmbH. +00-26-F1 (hex) ProCurve Networking by HP +00-26-F2 (hex) Netgear +00-26-F3 (hex) SMC Networks +00-26-F4 (hex) Nesslab +00-26-F5 (hex) XRPLUS Inc. +00-26-F6 (hex) Military Communication Institute +00-26-F7 (hex) Infosys Technologies Ltd. +00-26-F8 (hex) Golden Highway Industry Development Co., Ltd. +00-26-F9 (hex) S.E.M. srl +00-26-FA (hex) BandRich Inc. +00-26-FB (hex) AirDio Wireless, Inc. +00-26-FC (hex) AcSiP Technology Corp. +00-26-FD (hex) Interactive Intelligence +00-26-FE (hex) MKD Technology Inc. +00-26-FF (hex) Research In Motion +00-27-00 (hex) Shenzhen Siglent Technology Co., Ltd. +00-27-01 (hex) INCOstartec GmbH +00-27-02 (hex) SolarEdge Technologies +00-27-03 (hex) Testech Electronics Pte Ltd +00-27-04 (hex) Accelerated Concepts, LLC +00-27-05 (hex) Sectronic +00-27-06 (hex) YOISYS +00-27-07 (hex) Lift Complex DS, JSC +00-27-08 (hex) Nordiag ASA +00-27-09 (hex) Nintendo Co., Ltd. +00-27-0A (hex) IEE S.A. +00-27-0B (hex) Adura Technologies +00-27-0C (hex) Cisco Systems +00-27-0D (hex) Cisco Systems +00-27-0E (hex) Intel Corporate +00-27-0F (hex) Envisionnovation Inc +00-27-10 (hex) Intel Corporate +00-27-11 (hex) LanPro Inc +00-27-12 (hex) MaxVision LLC +00-27-13 (hex) USI +00-27-14 (hex) Grainmustards, Co,ltd. +00-27-15 (hex) Rebound Telecom. Co., Ltd +00-27-16 (hex) Adachi-Syokai Co., Ltd. +00-27-17 (hex) CE Digital(Zhenjiang)Co.,Ltd +00-27-18 (hex) Suzhou NEW SEAUNION Video Technology Co.,Ltd +00-27-19 (hex) TP-LINK TECHNOLOGIES CO., LTD. +00-27-1A (hex) Geenovo Technology Ltd. +00-27-1B (hex) Alec Sicherheitssysteme GmbH +00-27-1C (hex) MERCURY CORPORATION +00-27-1D (hex) Comba Telecom Systems (China) Ltd. +00-27-1E (hex) Xagyl Communications +00-27-1F (hex) MIPRO Electronics Co., Ltd +00-27-20 (hex) NEW-SOL COM +00-27-21 (hex) Shenzhen Baoan Fenda Industrial Co., Ltd +00-27-22 (hex) Ubiquiti Networks +00-30-00 (hex) ALLWELL TECHNOLOGY CORP. +00-30-01 (hex) SMP +00-30-02 (hex) Expand Networks +00-30-03 (hex) Phasys Ltd. +00-30-04 (hex) LEADTEK RESEARCH INC. +00-30-05 (hex) Fujitsu Siemens Computers +00-30-06 (hex) SUPERPOWER COMPUTER +00-30-07 (hex) OPTI, INC. +00-30-08 (hex) AVIO DIGITAL, INC. +00-30-09 (hex) Tachion Networks, Inc. +00-30-0A (hex) AZTECH Electronics Pte Ltd +00-30-0B (hex) mPHASE Technologies, Inc. +00-30-0C (hex) CONGRUENCY, LTD. +00-30-0D (hex) MMC Technology, Inc. +00-30-0E (hex) Klotz Digital AG +00-30-0F (hex) IMT - Information Management T +00-30-10 (hex) VISIONETICS INTERNATIONAL +00-30-11 (hex) HMS FIELDBUS SYSTEMS AB +00-30-12 (hex) DIGITAL ENGINEERING LTD. +00-30-13 (hex) NEC Corporation +00-30-14 (hex) DIVIO, INC. +00-30-15 (hex) CP CLARE CORP. +00-30-16 (hex) ISHIDA CO., LTD. +00-30-17 (hex) BlueArc UK Ltd +00-30-18 (hex) Jetway Information Co., Ltd. +00-30-19 (hex) CISCO SYSTEMS, INC. +00-30-1A (hex) SMARTBRIDGES PTE. LTD. +00-30-1B (hex) SHUTTLE, INC. +00-30-1C (hex) ALTVATER AIRDATA SYSTEMS +00-30-1D (hex) SKYSTREAM, INC. +00-30-1E (hex) 3COM Europe Ltd. +00-30-1F (hex) OPTICAL NETWORKS, INC. +00-30-20 (hex) TSI, Inc.. +00-30-21 (hex) HSING TECH. ENTERPRISE CO.,LTD +00-30-22 (hex) Fong Kai Industrial Co., Ltd. +00-30-23 (hex) COGENT COMPUTER SYSTEMS, INC. +00-30-24 (hex) CISCO SYSTEMS, INC. +00-30-25 (hex) CHECKOUT COMPUTER SYSTEMS, LTD +00-30-26 (hex) HeiTel Digital Video GmbH +00-30-27 (hex) KERBANGO, INC. +00-30-28 (hex) FASE Saldatura srl +00-30-29 (hex) OPICOM +00-30-2A (hex) SOUTHERN INFORMATION +00-30-2B (hex) INALP NETWORKS, INC. +00-30-2C (hex) SYLANTRO SYSTEMS CORPORATION +00-30-2D (hex) QUANTUM BRIDGE COMMUNICATIONS +00-30-2E (hex) Hoft & Wessel AG +00-30-2F (hex) GE Aviation System +00-30-30 (hex) HARMONIX CORPORATION +00-30-31 (hex) LIGHTWAVE COMMUNICATIONS, INC. +00-30-32 (hex) MagicRam, Inc. +00-30-33 (hex) ORIENT TELECOM CO., LTD. +00-30-34 (hex) SET ENGINEERING +00-30-35 (hex) Corning Incorporated +00-30-36 (hex) RMP ELEKTRONIKSYSTEME GMBH +00-30-37 (hex) Packard Bell Nec Services +00-30-38 (hex) XCP, INC. +00-30-39 (hex) SOFTBOOK PRESS +00-30-3A (hex) MAATEL +00-30-3B (hex) PowerCom Technology +00-30-3C (hex) ONNTO CORP. +00-30-3D (hex) IVA CORPORATION +00-30-3E (hex) Radcom Ltd. +00-30-3F (hex) TurboComm Tech Inc. +00-30-40 (hex) CISCO SYSTEMS, INC. +00-30-41 (hex) SAEJIN T & M CO., LTD. +00-30-42 (hex) DeTeWe-Deutsche Telephonwerke +00-30-43 (hex) IDREAM TECHNOLOGIES, PTE. LTD. +00-30-44 (hex) Portsmith LLC +00-30-45 (hex) Village Networks, Inc. (VNI) +00-30-46 (hex) Controlled Electronic Manageme +00-30-47 (hex) NISSEI ELECTRIC CO., LTD. +00-30-48 (hex) Supermicro Computer, Inc. +00-30-49 (hex) BRYANT TECHNOLOGY, LTD. +00-30-4A (hex) Fraunhofer IPMS +00-30-4B (hex) ORBACOM SYSTEMS, INC. +00-30-4C (hex) APPIAN COMMUNICATIONS, INC. +00-30-4D (hex) ESI +00-30-4E (hex) BUSTEC PRODUCTION LTD. +00-30-4F (hex) PLANET Technology Corporation +00-30-50 (hex) Versa Technology +00-30-51 (hex) ORBIT AVIONIC & COMMUNICATION +00-30-52 (hex) ELASTIC NETWORKS +00-30-53 (hex) Basler AG +00-30-54 (hex) CASTLENET TECHNOLOGY, INC. +00-30-55 (hex) Renesas Technology America, Inc. +00-30-56 (hex) Beck IPC GmbH +00-30-57 (hex) QTelNet, Inc. +00-30-58 (hex) API MOTION +00-30-59 (hex) DIGITAL-LOGIC AG +00-30-5A (hex) TELGEN CORPORATION +00-30-5B (hex) Toko Inc. +00-30-5C (hex) SMAR Laboratories Corp. +00-30-5D (hex) DIGITRA SYSTEMS, INC. +00-30-5E (hex) Abelko Innovation +00-30-5F (hex) Hasselblad +00-30-60 (hex) Powerfile, Inc. +00-30-61 (hex) MobyTEL +00-30-62 (hex) PATH 1 NETWORK TECHNOL'S INC. +00-30-63 (hex) SANTERA SYSTEMS, INC. +00-30-64 (hex) ADLINK TECHNOLOGY, INC. +00-30-65 (hex) APPLE COMPUTER, INC. +00-30-66 (hex) RFM +00-30-67 (hex) BIOSTAR MICROTECH INT'L CORP. +00-30-68 (hex) CYBERNETICS TECH. CO., LTD. +00-30-69 (hex) IMPACCT TECHNOLOGY CORP. +00-30-6A (hex) PENTA MEDIA CO., LTD. +00-30-6B (hex) CMOS SYSTEMS, INC. +00-30-6C (hex) Hitex Holding GmbH +00-30-6D (hex) LUCENT TECHNOLOGIES +00-30-6E (hex) HEWLETT PACKARD +00-30-6F (hex) SEYEON TECH. CO., LTD. +00-30-70 (hex) 1Net Corporation +00-30-71 (hex) Cisco Systems, Inc. +00-30-72 (hex) Intellibyte Inc. +00-30-73 (hex) International Microsystems, In +00-30-74 (hex) EQUIINET LTD. +00-30-75 (hex) ADTECH +00-30-76 (hex) Akamba Corporation +00-30-77 (hex) ONPREM NETWORKS +00-30-78 (hex) Cisco Systems, Inc. +00-30-79 (hex) CQOS, INC. +00-30-7A (hex) Advanced Technology & Systems +00-30-7B (hex) Cisco Systems, Inc. +00-30-7C (hex) ADID SA +00-30-7D (hex) GRE AMERICA, INC. +00-30-7E (hex) Redflex Communication Systems +00-30-7F (hex) IRLAN LTD. +00-30-80 (hex) CISCO SYSTEMS, INC. +00-30-81 (hex) ALTOS C&C +00-30-82 (hex) TAIHAN ELECTRIC WIRE CO., LTD. +00-30-83 (hex) Ivron Systems +00-30-84 (hex) ALLIED TELESYN INTERNAIONAL +00-30-85 (hex) CISCO SYSTEMS, INC. +00-30-86 (hex) Transistor Devices, Inc. +00-30-87 (hex) VEGA GRIESHABER KG +00-30-88 (hex) Siara Systems, Inc. +00-30-89 (hex) Spectrapoint Wireless, LLC +00-30-8A (hex) NICOTRA SISTEMI S.P.A +00-30-8B (hex) Brix Networks +00-30-8C (hex) Quantum Corporation +00-30-8D (hex) Pinnacle Systems, Inc. +00-30-8E (hex) CROSS MATCH TECHNOLOGIES, INC. +00-30-8F (hex) MICRILOR, Inc. +00-30-90 (hex) CYRA TECHNOLOGIES, INC. +00-30-91 (hex) TAIWAN FIRST LINE ELEC. CORP. +00-30-92 (hex) ModuNORM GmbH +00-30-93 (hex) Sonnet Technologies, Inc +00-30-94 (hex) Cisco Systems, Inc. +00-30-95 (hex) Procomp Informatics, Ltd. +00-30-96 (hex) CISCO SYSTEMS, INC. +00-30-97 (hex) AB Regin +00-30-98 (hex) Global Converging Technologies +00-30-99 (hex) BOENIG UND KALLENBACH OHG +00-30-9A (hex) ASTRO TERRA CORP. +00-30-9B (hex) Smartware +00-30-9C (hex) Timing Applications, Inc. +00-30-9D (hex) Nimble Microsystems, Inc. +00-30-9E (hex) WORKBIT CORPORATION. +00-30-9F (hex) AMBER NETWORKS +00-30-A0 (hex) TYCO SUBMARINE SYSTEMS, LTD. +00-30-A1 (hex) WEBGATE Inc. +00-30-A2 (hex) Lightner Engineering +00-30-A3 (hex) CISCO SYSTEMS, INC. +00-30-A4 (hex) Woodwind Communications System +00-30-A5 (hex) ACTIVE POWER +00-30-A6 (hex) VIANET TECHNOLOGIES, LTD. +00-30-A7 (hex) SCHWEITZER ENGINEERING +00-30-A8 (hex) OL'E COMMUNICATIONS, INC. +00-30-A9 (hex) Netiverse, Inc. +00-30-AA (hex) AXUS MICROSYSTEMS, INC. +00-30-AB (hex) DELTA NETWORKS, INC. +00-30-AC (hex) Systeme Lauer GmbH & Co., Ltd. +00-30-AD (hex) SHANGHAI COMMUNICATION +00-30-AE (hex) Times N System, Inc. +00-30-AF (hex) Honeywell GmbH +00-30-B0 (hex) Convergenet Technologies +00-30-B1 (hex) aXess-pro networks GmbH +00-30-B2 (hex) L-3 Sonoma EO +00-30-B3 (hex) San Valley Systems, Inc. +00-30-B4 (hex) INTERSIL CORP. +00-30-B5 (hex) Tadiran Microwave Networks +00-30-B6 (hex) CISCO SYSTEMS, INC. +00-30-B7 (hex) Teletrol Systems, Inc. +00-30-B8 (hex) RiverDelta Networks +00-30-B9 (hex) ECTEL +00-30-BA (hex) AC&T SYSTEM CO., LTD. +00-30-BB (hex) CacheFlow, Inc. +00-30-BC (hex) Optronic AG +00-30-BD (hex) BELKIN COMPONENTS +00-30-BE (hex) City-Net Technology, Inc. +00-30-BF (hex) MULTIDATA GMBH +00-30-C0 (hex) Lara Technology, Inc. +00-30-C1 (hex) HEWLETT-PACKARD +00-30-C2 (hex) COMONE +00-30-C3 (hex) FLUECKIGER ELEKTRONIK AG +00-30-C4 (hex) Canon Imaging Systems Inc. +00-30-C5 (hex) CADENCE DESIGN SYSTEMS +00-30-C6 (hex) CONTROL SOLUTIONS, INC. +00-30-C7 (hex) Macromate Corp. +00-30-C8 (hex) GAD LINE, LTD. +00-30-C9 (hex) LuxN, N +00-30-CA (hex) Discovery Com +00-30-CB (hex) OMNI FLOW COMPUTERS, INC. +00-30-CC (hex) Tenor Networks, Inc. +00-30-CD (hex) CONEXANT SYSTEMS, INC. +00-30-CE (hex) Zaffire +00-30-CF (hex) TWO TECHNOLOGIES, INC. +00-30-D0 (hex) Tellabs +00-30-D1 (hex) INOVA CORPORATION +00-30-D2 (hex) WIN TECHNOLOGIES, CO., LTD. +00-30-D3 (hex) Agilent Technologies +00-30-D4 (hex) AAE Systems, Inc +00-30-D5 (hex) DResearch GmbH +00-30-D6 (hex) MSC VERTRIEBS GMBH +00-30-D7 (hex) Innovative Systems, L.L.C. +00-30-D8 (hex) SITEK +00-30-D9 (hex) DATACORE SOFTWARE CORP. +00-30-DA (hex) COMTREND CO. +00-30-DB (hex) Mindready Solutions, Inc. +00-30-DC (hex) RIGHTECH CORPORATION +00-30-DD (hex) INDIGITA CORPORATION +00-30-DE (hex) WAGO Kontakttechnik GmbH +00-30-DF (hex) KB/TEL TELECOMUNICACIONES +00-30-E0 (hex) OXFORD SEMICONDUCTOR LTD. +00-30-E1 (hex) ACROTRON SYSTEMS, INC. +00-30-E2 (hex) GARNET SYSTEMS CO., LTD. +00-30-E3 (hex) SEDONA NETWORKS CORP. +00-30-E4 (hex) CHIYODA SYSTEM RIKEN +00-30-E5 (hex) Amper Datos S.A. +00-30-E6 (hex) Draeger Medical Systems, Inc. +00-30-E7 (hex) CNF MOBILE SOLUTIONS, INC. +00-30-E8 (hex) ENSIM CORP. +00-30-E9 (hex) GMA COMMUNICATION MANUFACT'G +00-30-EA (hex) TeraForce Technology Corporation +00-30-EB (hex) TURBONET COMMUNICATIONS, INC. +00-30-EC (hex) BORGARDT +00-30-ED (hex) Expert Magnetics Corp. +00-30-EE (hex) DSG Technology, Inc. +00-30-EF (hex) NEON TECHNOLOGY, INC. +00-30-F0 (hex) Uniform Industrial Corp. +00-30-F1 (hex) Accton Technology Corp. +00-30-F2 (hex) CISCO SYSTEMS, INC. +00-30-F3 (hex) At Work Computers +00-30-F4 (hex) STARDOT TECHNOLOGIES +00-30-F5 (hex) Wild Lab. Ltd. +00-30-F6 (hex) SECURELOGIX CORPORATION +00-30-F7 (hex) RAMIX INC. +00-30-F8 (hex) Dynapro Systems, Inc. +00-30-F9 (hex) Sollae Systems Co., Ltd. +00-30-FA (hex) TELICA, INC. +00-30-FB (hex) AZS Technology AG +00-30-FC (hex) Terawave Communications, Inc. +00-30-FD (hex) INTEGRATED SYSTEMS DESIGN +00-30-FE (hex) DSA GmbH +00-30-FF (hex) DATAFAB SYSTEMS, INC. +00-35-32 (hex) Electro-Metrics Corporation +00-3A-98 (hex) Cisco Systems +00-3A-99 (hex) Cisco Systems +00-3A-9A (hex) Cisco Systems +00-3A-9B (hex) Cisco Systems +00-3A-9C (hex) Cisco Systems +00-3A-AF (hex) BlueBit Ltd. +00-3C-C5 (hex) WONWOO Engineering Co., Ltd +00-3D-41 (hex) Hatteland Computer AS +00-40-00 (hex) PCI COMPONENTES DA AMZONIA LTD +00-40-01 (hex) ZYXEL COMMUNICATIONS, INC. +00-40-02 (hex) PERLE SYSTEMS LIMITED +00-40-03 (hex) Emerson Process Management Power & Water Solutions, Inc. +00-40-04 (hex) ICM CO. LTD. +00-40-05 (hex) ANI COMMUNICATIONS INC. +00-40-06 (hex) SAMPO TECHNOLOGY CORPORATION +00-40-07 (hex) TELMAT INFORMATIQUE +00-40-08 (hex) A PLUS INFO CORPORATION +00-40-09 (hex) TACHIBANA TECTRON CO., LTD. +00-40-0A (hex) PIVOTAL TECHNOLOGIES, INC. +00-40-0B (hex) CISCO SYSTEMS, INC. +00-40-0C (hex) GENERAL MICRO SYSTEMS, INC. +00-40-0D (hex) LANNET DATA COMMUNICATIONS,LTD +00-40-0E (hex) MEMOTEC, INC. +00-40-0F (hex) DATACOM TECHNOLOGIES +00-40-10 (hex) SONIC SYSTEMS, INC. +00-40-11 (hex) ANDOVER CONTROLS CORPORATION +00-40-12 (hex) WINDATA, INC. +00-40-13 (hex) NTT DATA COMM. SYSTEMS CORP. +00-40-14 (hex) COMSOFT GMBH +00-40-15 (hex) ASCOM INFRASYS AG +00-40-16 (hex) ADC - Global Connectivity Solutions Division +00-40-17 (hex) Silex Technology America +00-40-18 (hex) ADOBE SYSTEMS, INC. +00-40-19 (hex) AEON SYSTEMS, INC. +00-40-1A (hex) FUJI ELECTRIC CO., LTD. +00-40-1B (hex) PRINTER SYSTEMS CORP. +00-40-1C (hex) AST RESEARCH, INC. +00-40-1D (hex) INVISIBLE SOFTWARE, INC. +00-40-1E (hex) ICC +00-40-1F (hex) COLORGRAPH LTD +00-40-20 (hex) Tyco Electronics (UK) Ltd +00-40-21 (hex) RASTER GRAPHICS +00-40-22 (hex) KLEVER COMPUTERS, INC. +00-40-23 (hex) LOGIC CORPORATION +00-40-24 (hex) COMPAC INC. +00-40-25 (hex) MOLECULAR DYNAMICS +00-40-26 (hex) Buffalo, Inc +00-40-27 (hex) SMC MASSACHUSETTS, INC. +00-40-28 (hex) NETCOMM LIMITED +00-40-29 (hex) COMPEX +00-40-2A (hex) CANOGA-PERKINS +00-40-2B (hex) TRIGEM COMPUTER, INC. +00-40-2C (hex) ISIS DISTRIBUTED SYSTEMS, INC. +00-40-2D (hex) HARRIS ADACOM CORPORATION +00-40-2E (hex) PRECISION SOFTWARE, INC. +00-40-2F (hex) XLNT DESIGNS INC. +00-40-30 (hex) GK COMPUTER +00-40-31 (hex) KOKUSAI ELECTRIC CO., LTD +00-40-32 (hex) DIGITAL COMMUNICATIONS +00-40-33 (hex) ADDTRON TECHNOLOGY CO., LTD. +00-40-34 (hex) BUSTEK CORPORATION +00-40-35 (hex) OPCOM +00-40-36 (hex) TRIBE COMPUTER WORKS, INC. +00-40-37 (hex) SEA-ILAN, INC. +00-40-38 (hex) TALENT ELECTRIC INCORPORATED +00-40-39 (hex) OPTEC DAIICHI DENKO CO., LTD. +00-40-3A (hex) IMPACT TECHNOLOGIES +00-40-3B (hex) SYNERJET INTERNATIONAL CORP. +00-40-3C (hex) FORKS, INC. +00-40-3D (hex) TERADATA +00-40-3E (hex) RASTER OPS CORPORATION +00-40-3F (hex) SSANGYONG COMPUTER SYSTEMS +00-40-40 (hex) RING ACCESS, INC. +00-40-41 (hex) FUJIKURA LTD. +00-40-42 (hex) N.A.T. GMBH +00-40-43 (hex) Nokia Siemens Networks GmbH & Co. KG. +00-40-44 (hex) QNIX COMPUTER CO., LTD. +00-40-45 (hex) TWINHEAD CORPORATION +00-40-46 (hex) UDC RESEARCH LIMITED +00-40-47 (hex) WIND RIVER SYSTEMS +00-40-48 (hex) SMD INFORMATICA S.A. +00-40-49 (hex) TEGIMENTA AG +00-40-4A (hex) WEST AUSTRALIAN DEPARTMENT +00-40-4B (hex) MAPLE COMPUTER SYSTEMS +00-40-4C (hex) HYPERTEC PTY LTD. +00-40-4D (hex) TELECOMMUNICATIONS TECHNIQUES +00-40-4E (hex) FLUENT, INC. +00-40-4F (hex) SPACE & NAVAL WARFARE SYSTEMS +00-40-50 (hex) IRONICS, INCORPORATED +00-40-51 (hex) GRACILIS, INC. +00-40-52 (hex) STAR TECHNOLOGIES, INC. +00-40-53 (hex) AMPRO COMPUTERS +00-40-54 (hex) CONNECTION MACHINES SERVICES +00-40-55 (hex) METRONIX GMBH +00-40-56 (hex) MCM JAPAN LTD. +00-40-57 (hex) LOCKHEED - SANDERS +00-40-58 (hex) KRONOS, INC. +00-40-59 (hex) YOSHIDA KOGYO K. K. +00-40-5A (hex) GOLDSTAR INFORMATION & COMM. +00-40-5B (hex) FUNASSET LIMITED +00-40-5C (hex) FUTURE SYSTEMS, INC. +00-40-5D (hex) STAR-TEK, INC. +00-40-5E (hex) NORTH HILLS ISRAEL +00-40-5F (hex) AFE COMPUTERS LTD. +00-40-60 (hex) COMENDEC LTD +00-40-61 (hex) DATATECH ENTERPRISES CO., LTD. +00-40-62 (hex) E-SYSTEMS, INC./GARLAND DIV. +00-40-63 (hex) VIA TECHNOLOGIES, INC. +00-40-64 (hex) KLA INSTRUMENTS CORPORATION +00-40-65 (hex) GTE SPACENET +00-40-66 (hex) HITACHI CABLE, LTD. +00-40-67 (hex) OMNIBYTE CORPORATION +00-40-68 (hex) EXTENDED SYSTEMS +00-40-69 (hex) LEMCOM SYSTEMS, INC. +00-40-6A (hex) KENTEK INFORMATION SYSTEMS,INC +00-40-6B (hex) SYSGEN +00-40-6C (hex) COPERNIQUE +00-40-6D (hex) LANCO, INC. +00-40-6E (hex) COROLLARY, INC. +00-40-6F (hex) SYNC RESEARCH INC. +00-40-70 (hex) INTERWARE CO., LTD. +00-40-71 (hex) ATM COMPUTER GMBH +00-40-72 (hex) Applied Innovation Inc. +00-40-73 (hex) BASS ASSOCIATES +00-40-74 (hex) CABLE AND WIRELESS +00-40-75 (hex) M-TRADE (UK) LTD +00-40-76 (hex) Sun Conversion Technologies +00-40-77 (hex) MAXTON TECHNOLOGY CORPORATION +00-40-78 (hex) WEARNES AUTOMATION PTE LTD +00-40-79 (hex) JUKO MANUFACTURE COMPANY, LTD. +00-40-7A (hex) SOCIETE D'EXPLOITATION DU CNIT +00-40-7B (hex) SCIENTIFIC ATLANTA +00-40-7C (hex) QUME CORPORATION +00-40-7D (hex) EXTENSION TECHNOLOGY CORP. +00-40-7E (hex) EVERGREEN SYSTEMS, INC. +00-40-7F (hex) FLIR Systems +00-40-80 (hex) ATHENIX CORPORATION +00-40-81 (hex) MANNESMANN SCANGRAPHIC GMBH +00-40-82 (hex) LABORATORY EQUIPMENT CORP. +00-40-83 (hex) TDA INDUSTRIA DE PRODUTOS +00-40-84 (hex) HONEYWELL ACS +00-40-85 (hex) SAAB INSTRUMENTS AB +00-40-86 (hex) MICHELS & KLEBERHOFF COMPUTER +00-40-87 (hex) UBITREX CORPORATION +00-40-88 (hex) MOBIUS TECHNOLOGIES, INC. +00-40-89 (hex) MEIDENSHA CORPORATION +00-40-8A (hex) TPS TELEPROCESSING SYS. GMBH +00-40-8B (hex) RAYLAN CORPORATION +00-40-8C (hex) AXIS COMMUNICATIONS AB +00-40-8D (hex) THE GOODYEAR TIRE & RUBBER CO. +00-40-8E (hex) DIGILOG, INC. +00-40-8F (hex) WM-DATA MINFO AB +00-40-90 (hex) ANSEL COMMUNICATIONS +00-40-91 (hex) PROCOMP INDUSTRIA ELETRONICA +00-40-92 (hex) ASP COMPUTER PRODUCTS, INC. +00-40-93 (hex) PAXDATA NETWORKS LTD. +00-40-94 (hex) SHOGRAPHICS, INC. +00-40-95 (hex) R.P.T. INTERGROUPS INT'L LTD. +00-40-96 (hex) Cisco Systems, Inc. +00-40-97 (hex) DATEX DIVISION OF +00-40-98 (hex) DRESSLER GMBH & CO. +00-40-99 (hex) NEWGEN SYSTEMS CORP. +00-40-9A (hex) NETWORK EXPRESS, INC. +00-40-9B (hex) HAL COMPUTER SYSTEMS INC. +00-40-9C (hex) TRANSWARE +00-40-9D (hex) DIGIBOARD, INC. +00-40-9E (hex) CONCURRENT TECHNOLOGIES LTD. +00-40-9F (hex) LANCAST/CASAT TECHNOLOGY, INC. +00-40-A0 (hex) GOLDSTAR CO., LTD. +00-40-A1 (hex) ERGO COMPUTING +00-40-A2 (hex) KINGSTAR TECHNOLOGY INC. +00-40-A3 (hex) MICROUNITY SYSTEMS ENGINEERING +00-40-A4 (hex) ROSE ELECTRONICS +00-40-A5 (hex) CLINICOMP INTL. +00-40-A6 (hex) Cray, Inc. +00-40-A7 (hex) ITAUTEC PHILCO S.A. +00-40-A8 (hex) IMF INTERNATIONAL LTD. +00-40-A9 (hex) DATACOM INC. +00-40-AA (hex) VALMET AUTOMATION INC. +00-40-AB (hex) ROLAND DG CORPORATION +00-40-AC (hex) SUPER WORKSTATION, INC. +00-40-AD (hex) SMA REGELSYSTEME GMBH +00-40-AE (hex) DELTA CONTROLS, INC. +00-40-AF (hex) DIGITAL PRODUCTS, INC. +00-40-B0 (hex) BYTEX CORPORATION, ENGINEERING +00-40-B1 (hex) CODONICS INC. +00-40-B2 (hex) SYSTEMFORSCHUNG +00-40-B3 (hex) PAR MICROSYSTEMS CORPORATION +00-40-B4 (hex) NEXTCOM K.K. +00-40-B5 (hex) VIDEO TECHNOLOGY COMPUTERS LTD +00-40-B6 (hex) COMPUTERM CORPORATION +00-40-B7 (hex) STEALTH COMPUTER SYSTEMS +00-40-B8 (hex) IDEA ASSOCIATES +00-40-B9 (hex) MACQ ELECTRONIQUE SA +00-40-BA (hex) ALLIANT COMPUTER SYSTEMS CORP. +00-40-BB (hex) GOLDSTAR CABLE CO., LTD. +00-40-BC (hex) ALGORITHMICS LTD. +00-40-BD (hex) STARLIGHT NETWORKS, INC. +00-40-BE (hex) BOEING DEFENSE & SPACE +00-40-BF (hex) CHANNEL SYSTEMS INTERN'L INC. +00-40-C0 (hex) VISTA CONTROLS CORPORATION +00-40-C1 (hex) BIZERBA-WERKE WILHEIM KRAUT +00-40-C2 (hex) APPLIED COMPUTING DEVICES +00-40-C3 (hex) FISCHER AND PORTER CO. +00-40-C4 (hex) KINKEI SYSTEM CORPORATION +00-40-C5 (hex) MICOM COMMUNICATIONS INC. +00-40-C6 (hex) FIBERNET RESEARCH, INC. +00-40-C7 (hex) RUBY TECH CORPORATION +00-40-C8 (hex) MILAN TECHNOLOGY CORPORATION +00-40-C9 (hex) NCUBE +00-40-CA (hex) FIRST INTERNAT'L COMPUTER, INC +00-40-CB (hex) LANWAN TECHNOLOGIES +00-40-CC (hex) SILCOM MANUF'G TECHNOLOGY INC. +00-40-CD (hex) TERA MICROSYSTEMS, INC. +00-40-CE (hex) NET-SOURCE, INC. +00-40-CF (hex) STRAWBERRY TREE, INC. +00-40-D0 (hex) MITAC INTERNATIONAL CORP. +00-40-D1 (hex) FUKUDA DENSHI CO., LTD. +00-40-D2 (hex) PAGINE CORPORATION +00-40-D3 (hex) KIMPSION INTERNATIONAL CORP. +00-40-D4 (hex) GAGE TALKER CORP. +00-40-D5 (hex) Sartorius Mechatronics T&H GmbH +00-40-D6 (hex) LOCAMATION B.V. +00-40-D7 (hex) STUDIO GEN INC. +00-40-D8 (hex) OCEAN OFFICE AUTOMATION LTD. +00-40-D9 (hex) AMERICAN MEGATRENDS INC. +00-40-DA (hex) TELSPEC LTD +00-40-DB (hex) ADVANCED TECHNICAL SOLUTIONS +00-40-DC (hex) TRITEC ELECTRONIC GMBH +00-40-DD (hex) HONG TECHNOLOGIES +00-40-DE (hex) ELETTRONICA SAN GIORGIO +00-40-DF (hex) DIGALOG SYSTEMS, INC. +00-40-E0 (hex) ATOMWIDE LTD. +00-40-E1 (hex) MARNER INTERNATIONAL, INC. +00-40-E2 (hex) MESA RIDGE TECHNOLOGIES, INC. +00-40-E3 (hex) QUIN SYSTEMS LTD +00-40-E4 (hex) E-M TECHNOLOGY, INC. +00-40-E5 (hex) SYBUS CORPORATION +00-40-E6 (hex) C.A.E.N. +00-40-E7 (hex) ARNOS INSTRUMENTS & COMPUTER +00-40-E8 (hex) CHARLES RIVER DATA SYSTEMS,INC +00-40-E9 (hex) ACCORD SYSTEMS, INC. +00-40-EA (hex) PLAIN TREE SYSTEMS INC +00-40-EB (hex) MARTIN MARIETTA CORPORATION +00-40-EC (hex) MIKASA SYSTEM ENGINEERING +00-40-ED (hex) NETWORK CONTROLS INT'NATL INC. +00-40-EE (hex) OPTIMEM +00-40-EF (hex) HYPERCOM, INC. +00-40-F0 (hex) MICRO SYSTEMS, INC. +00-40-F1 (hex) CHUO ELECTRONICS CO., LTD. +00-40-F2 (hex) JANICH & KLASS COMPUTERTECHNIK +00-40-F3 (hex) NETCOR +00-40-F4 (hex) CAMEO COMMUNICATIONS, INC. +00-40-F5 (hex) OEM ENGINES +00-40-F6 (hex) KATRON COMPUTERS INC. +00-40-F7 (hex) Polaroid Corporation +00-40-F8 (hex) SYSTEMHAUS DISCOM +00-40-F9 (hex) COMBINET +00-40-FA (hex) MICROBOARDS, INC. +00-40-FB (hex) CASCADE COMMUNICATIONS CORP. +00-40-FC (hex) IBR COMPUTER TECHNIK GMBH +00-40-FD (hex) LXE +00-40-FE (hex) SYMPLEX COMMUNICATIONS +00-40-FF (hex) TELEBIT CORPORATION +00-42-52 (hex) RLX Technologies +00-45-01 (hex) Versus Technology, Inc. +00-50-00 (hex) NEXO COMMUNICATIONS, INC. +00-50-01 (hex) YAMASHITA SYSTEMS CORP. +00-50-02 (hex) OMNISEC AG +00-50-03 (hex) GRETAG MACBETH AG +00-50-04 (hex) 3COM CORPORATION +00-50-06 (hex) TAC AB +00-50-07 (hex) SIEMENS TELECOMMUNICATION SYSTEMS LIMITED +00-50-08 (hex) TIVA MICROCOMPUTER CORP. (TMC) +00-50-09 (hex) PHILIPS BROADBAND NETWORKS +00-50-0A (hex) IRIS TECHNOLOGIES, INC. +00-50-0B (hex) CISCO SYSTEMS, INC. +00-50-0C (hex) e-Tek Labs, Inc. +00-50-0D (hex) SATORI ELECTORIC CO., LTD. +00-50-0E (hex) CHROMATIS NETWORKS, INC. +00-50-0F (hex) CISCO SYSTEMS, INC. +00-50-10 (hex) NovaNET Learning, Inc. +00-50-12 (hex) CBL - GMBH +00-50-13 (hex) Chaparral Network Storage +00-50-14 (hex) CISCO SYSTEMS, INC. +00-50-15 (hex) BRIGHT STAR ENGINEERING +00-50-16 (hex) SST/WOODHEAD INDUSTRIES +00-50-17 (hex) RSR S.R.L. +00-50-18 (hex) AMIT, Inc. +00-50-19 (hex) SPRING TIDE NETWORKS, INC. +00-50-1A (hex) IQinVision +00-50-1B (hex) ABL CANADA, INC. +00-50-1C (hex) JATOM SYSTEMS, INC. +00-50-1E (hex) Miranda Technologies, Inc. +00-50-1F (hex) MRG SYSTEMS, LTD. +00-50-20 (hex) MEDIASTAR CO., LTD. +00-50-21 (hex) EIS INTERNATIONAL, INC. +00-50-22 (hex) ZONET TECHNOLOGY, INC. +00-50-23 (hex) PG DESIGN ELECTRONICS, INC. +00-50-24 (hex) NAVIC SYSTEMS, INC. +00-50-26 (hex) COSYSTEMS, INC. +00-50-27 (hex) GENICOM CORPORATION +00-50-28 (hex) AVAL COMMUNICATIONS +00-50-29 (hex) 1394 PRINTER WORKING GROUP +00-50-2A (hex) CISCO SYSTEMS, INC. +00-50-2B (hex) GENRAD LTD. +00-50-2C (hex) SOYO COMPUTER, INC. +00-50-2D (hex) ACCEL, INC. +00-50-2E (hex) CAMBEX CORPORATION +00-50-2F (hex) TollBridge Technologies, Inc. +00-50-30 (hex) FUTURE PLUS SYSTEMS +00-50-31 (hex) AEROFLEX LABORATORIES, INC. +00-50-32 (hex) PICAZO COMMUNICATIONS, INC. +00-50-33 (hex) MAYAN NETWORKS +00-50-36 (hex) NETCAM, LTD. +00-50-37 (hex) KOGA ELECTRONICS CO. +00-50-38 (hex) DAIN TELECOM CO., LTD. +00-50-39 (hex) MARINER NETWORKS +00-50-3A (hex) DATONG ELECTRONICS LTD. +00-50-3B (hex) MEDIAFIRE CORPORATION +00-50-3C (hex) TSINGHUA NOVEL ELECTRONICS +00-50-3E (hex) CISCO SYSTEMS, INC. +00-50-3F (hex) ANCHOR GAMES +00-50-40 (hex) Panasonic Electric Works Co., Ltd. +00-50-41 (hex) Coretronic Corporation +00-50-42 (hex) SCI MANUFACTURING SINGAPORE PTE, LTD. +00-50-43 (hex) MARVELL SEMICONDUCTOR, INC. +00-50-44 (hex) ASACA CORPORATION +00-50-45 (hex) RIOWORKS SOLUTIONS, INC. +00-50-46 (hex) MENICX INTERNATIONAL CO., LTD. +00-50-47 (hex) PRIVATE +00-50-48 (hex) INFOLIBRIA +00-50-49 (hex) Arbor Networks Inc +00-50-4A (hex) ELTECO A.S. +00-50-4B (hex) BARCONET N.V. +00-50-4C (hex) Galil Motion Control +00-50-4D (hex) Tokyo Electron Device Limited +00-50-4E (hex) SIERRA MONITOR CORP. +00-50-4F (hex) OLENCOM ELECTRONICS +00-50-50 (hex) CISCO SYSTEMS, INC. +00-50-51 (hex) IWATSU ELECTRIC CO., LTD. +00-50-52 (hex) TIARA NETWORKS, INC. +00-50-53 (hex) CISCO SYSTEMS, INC. +00-50-54 (hex) CISCO SYSTEMS, INC. +00-50-55 (hex) DOMS A/S +00-50-56 (hex) VMware, Inc. +00-50-57 (hex) BROADBAND ACCESS SYSTEMS +00-50-58 (hex) VegaStream Group Limted +00-50-59 (hex) iBAHN +00-50-5A (hex) NETWORK ALCHEMY, INC. +00-50-5B (hex) KAWASAKI LSI U.S.A., INC. +00-50-5C (hex) TUNDO CORPORATION +00-50-5E (hex) DIGITEK MICROLOGIC S.A. +00-50-5F (hex) BRAND INNOVATORS +00-50-60 (hex) TANDBERG TELECOM AS +00-50-62 (hex) KOUWELL ELECTRONICS CORP. ** +00-50-63 (hex) OY COMSEL SYSTEM AB +00-50-64 (hex) CAE ELECTRONICS +00-50-65 (hex) TDK-Lambda Corporation +00-50-66 (hex) AtecoM GmbH advanced telecomunication modules +00-50-67 (hex) AEROCOMM, INC. +00-50-68 (hex) ELECTRONIC INDUSTRIES ASSOCIATION +00-50-69 (hex) PixStream Incorporated +00-50-6A (hex) EDEVA, INC. +00-50-6B (hex) SPX-ATEG +00-50-6C (hex) Beijer Electronics Products AB +00-50-6D (hex) VIDEOJET SYSTEMS +00-50-6E (hex) CORDER ENGINEERING CORPORATION +00-50-6F (hex) G-CONNECT +00-50-70 (hex) CHAINTECH COMPUTER CO., LTD. +00-50-71 (hex) AIWA CO., LTD. +00-50-72 (hex) CORVIS CORPORATION +00-50-73 (hex) CISCO SYSTEMS, INC. +00-50-74 (hex) ADVANCED HI-TECH CORP. +00-50-75 (hex) KESTREL SOLUTIONS +00-50-76 (hex) IBM +00-50-77 (hex) PROLIFIC TECHNOLOGY, INC. +00-50-78 (hex) MEGATON HOUSE, LTD. +00-50-79 (hex) PRIVATE +00-50-7A (hex) XPEED, INC. +00-50-7B (hex) MERLOT COMMUNICATIONS +00-50-7C (hex) VIDEOCON AG +00-50-7D (hex) IFP +00-50-7E (hex) NEWER TECHNOLOGY +00-50-7F (hex) DrayTek Corp. +00-50-80 (hex) CISCO SYSTEMS, INC. +00-50-81 (hex) MURATA MACHINERY, LTD. +00-50-82 (hex) FORESSON CORPORATION +00-50-83 (hex) GILBARCO, INC. +00-50-84 (hex) ATL PRODUCTS +00-50-86 (hex) TELKOM SA, LTD. +00-50-87 (hex) TERASAKI ELECTRIC CO., LTD. +00-50-88 (hex) AMANO CORPORATION +00-50-89 (hex) SAFETY MANAGEMENT SYSTEMS +00-50-8B (hex) Hewlett Packard +00-50-8C (hex) RSI SYSTEMS +00-50-8D (hex) ABIT COMPUTER CORPORATION +00-50-8E (hex) OPTIMATION, INC. +00-50-8F (hex) ASITA TECHNOLOGIES INT'L LTD. +00-50-90 (hex) DCTRI +00-50-91 (hex) NETACCESS, INC. +00-50-92 (hex) RIGAKU INDUSTRIAL CORPORATION +00-50-93 (hex) BOEING +00-50-94 (hex) PACE MICRO TECHNOLOGY PLC +00-50-95 (hex) PERACOM NETWORKS +00-50-96 (hex) SALIX TECHNOLOGIES, INC. +00-50-97 (hex) MMC-EMBEDDED COMPUTERTECHNIK GmbH +00-50-98 (hex) GLOBALOOP, LTD. +00-50-99 (hex) 3COM EUROPE, LTD. +00-50-9A (hex) TAG ELECTRONIC SYSTEMS +00-50-9B (hex) SWITCHCORE AB +00-50-9C (hex) BETA RESEARCH +00-50-9D (hex) THE INDUSTREE B.V. +00-50-9E (hex) Les Technologies SoftAcoustik Inc. +00-50-9F (hex) HORIZON COMPUTER +00-50-A0 (hex) DELTA COMPUTER SYSTEMS, INC. +00-50-A1 (hex) CARLO GAVAZZI, INC. +00-50-A2 (hex) CISCO SYSTEMS, INC. +00-50-A3 (hex) TransMedia Communications, Inc. +00-50-A4 (hex) IO TECH, INC. +00-50-A5 (hex) CAPITOL BUSINESS SYSTEMS, LTD. +00-50-A6 (hex) OPTRONICS +00-50-A7 (hex) CISCO SYSTEMS, INC. +00-50-A8 (hex) OpenCon Systems, Inc. +00-50-A9 (hex) MOLDAT WIRELESS TECHNOLGIES +00-50-AA (hex) KONICA MINOLTA HOLDINGS, INC. +00-50-AB (hex) NALTEC, Inc. +00-50-AC (hex) MAPLE COMPUTER CORPORATION +00-50-AD (hex) CommUnique Wireless Corp. +00-50-AE (hex) IWAKI ELECTRONICS CO., LTD. +00-50-AF (hex) INTERGON, INC. +00-50-B0 (hex) TECHNOLOGY ATLANTA CORPORATION +00-50-B1 (hex) GIDDINGS & LEWIS +00-50-B2 (hex) BRODEL AUTOMATION +00-50-B3 (hex) VOICEBOARD CORPORATION +00-50-B4 (hex) SATCHWELL CONTROL SYSTEMS, LTD +00-50-B5 (hex) FICHET-BAUCHE +00-50-B6 (hex) GOOD WAY IND. CO., LTD. +00-50-B7 (hex) BOSER TECHNOLOGY CO., LTD. +00-50-B8 (hex) INOVA COMPUTERS GMBH & CO. KG +00-50-B9 (hex) XITRON TECHNOLOGIES, INC. +00-50-BA (hex) D-LINK +00-50-BB (hex) CMS TECHNOLOGIES +00-50-BC (hex) HAMMER STORAGE SOLUTIONS +00-50-BD (hex) CISCO SYSTEMS, INC. +00-50-BE (hex) FAST MULTIMEDIA AG +00-50-BF (hex) MOTOTECH INC. +00-50-C0 (hex) GATAN, INC. +00-50-C1 (hex) GEMFLEX NETWORKS, LTD. +00-50-C2 (hex) IEEE REGISTRATION AUTHORITY +00-50-C4 (hex) IMD +00-50-C5 (hex) ADS Technologies, Inc +00-50-C6 (hex) LOOP TELECOMMUNICATION INTERNATIONAL, INC. +00-50-C8 (hex) ADDONICS COMMUNICATIONS, INC. +00-50-C9 (hex) MASPRO DENKOH CORP. +00-50-CA (hex) NET TO NET TECHNOLOGIES +00-50-CB (hex) JETTER +00-50-CC (hex) XYRATEX +00-50-CD (hex) DIGIANSWER A/S +00-50-CE (hex) LG INTERNATIONAL CORP. +00-50-CF (hex) VANLINK COMMUNICATION TECHNOLOGY RESEARCH INSTITUTE +00-50-D0 (hex) MINERVA SYSTEMS +00-50-D1 (hex) CISCO SYSTEMS, INC. +00-50-D2 (hex) CMC Electronics Inc +00-50-D3 (hex) DIGITAL AUDIO PROCESSING PTY. LTD. +00-50-D4 (hex) JOOHONG INFORMATION & +00-50-D5 (hex) AD SYSTEMS CORP. +00-50-D6 (hex) ATLAS COPCO TOOLS AB +00-50-D7 (hex) TELSTRAT +00-50-D8 (hex) UNICORN COMPUTER CORP. +00-50-D9 (hex) ENGETRON-ENGENHARIA ELETRONICA IND. e COM. LTDA +00-50-DA (hex) 3COM CORPORATION +00-50-DB (hex) CONTEMPORARY CONTROL +00-50-DC (hex) TAS TELEFONBAU A. SCHWABE GMBH & CO. KG +00-50-DD (hex) SERRA SOLDADURA, S.A. +00-50-DE (hex) SIGNUM SYSTEMS CORP. +00-50-DF (hex) AirFiber, Inc. +00-50-E1 (hex) NS TECH ELECTRONICS SDN BHD +00-50-E2 (hex) CISCO SYSTEMS, INC. +00-50-E3 (hex) Motorola, Inc. +00-50-E4 (hex) APPLE COMPUTER, INC. +00-50-E6 (hex) HAKUSAN CORPORATION +00-50-E7 (hex) PARADISE INNOVATIONS (ASIA) +00-50-E8 (hex) NOMADIX INC. +00-50-EA (hex) XEL COMMUNICATIONS, INC. +00-50-EB (hex) ALPHA-TOP CORPORATION +00-50-EC (hex) OLICOM A/S +00-50-ED (hex) ANDA NETWORKS +00-50-EE (hex) TEK DIGITEL CORPORATION +00-50-EF (hex) SPE Systemhaus GmbH +00-50-F0 (hex) CISCO SYSTEMS, INC. +00-50-F1 (hex) LIBIT SIGNAL PROCESSING, LTD. +00-50-F2 (hex) MICROSOFT CORP. +00-50-F3 (hex) GLOBAL NET INFORMATION CO., Ltd. +00-50-F4 (hex) SIGMATEK GMBH & CO. KG +00-50-F6 (hex) PAN-INTERNATIONAL INDUSTRIAL CORP. +00-50-F7 (hex) VENTURE MANUFACTURING (SINGAPORE) LTD. +00-50-F8 (hex) ENTREGA TECHNOLOGIES, INC. +00-50-F9 (hex) SENSORMATIC ACD +00-50-FA (hex) OXTEL, LTD. +00-50-FB (hex) VSK ELECTRONICS +00-50-FC (hex) EDIMAX TECHNOLOGY CO., LTD. +00-50-FD (hex) VISIONCOMM CO., LTD. +00-50-FE (hex) PCTVnet ASA +00-50-FF (hex) HAKKO ELECTRONICS CO., LTD. +00-52-18 (hex) Wuxi Keboda Electron Co.Ltd +00-60-00 (hex) XYCOM INC. +00-60-01 (hex) InnoSys, Inc. +00-60-02 (hex) SCREEN SUBTITLING SYSTEMS, LTD +00-60-03 (hex) TERAOKA WEIGH SYSTEM PTE, LTD. +00-60-04 (hex) COMPUTADORES MODULARES SA +00-60-05 (hex) FEEDBACK DATA LTD. +00-60-06 (hex) SOTEC CO., LTD +00-60-07 (hex) ACRES GAMING, INC. +00-60-08 (hex) 3COM CORPORATION +00-60-09 (hex) CISCO SYSTEMS, INC. +00-60-0A (hex) SORD COMPUTER CORPORATION +00-60-0B (hex) LOGWARE GmbH +00-60-0C (hex) APPLIED DATA SYSTEMS, INC. +00-60-0D (hex) Digital Logic GmbH +00-60-0E (hex) WAVENET INTERNATIONAL, INC. +00-60-0F (hex) WESTELL, INC. +00-60-10 (hex) NETWORK MACHINES, INC. +00-60-11 (hex) CRYSTAL SEMICONDUCTOR CORP. +00-60-12 (hex) POWER COMPUTING CORPORATION +00-60-13 (hex) NETSTAL MASCHINEN AG +00-60-14 (hex) EDEC CO., LTD. +00-60-15 (hex) NET2NET CORPORATION +00-60-16 (hex) CLARIION +00-60-17 (hex) TOKIMEC INC. +00-60-18 (hex) STELLAR ONE CORPORATION +00-60-19 (hex) Roche Diagnostics +00-60-1A (hex) KEITHLEY INSTRUMENTS +00-60-1B (hex) MESA ELECTRONICS +00-60-1C (hex) TELXON CORPORATION +00-60-1D (hex) LUCENT TECHNOLOGIES +00-60-1E (hex) SOFTLAB, INC. +00-60-1F (hex) STALLION TECHNOLOGIES +00-60-20 (hex) PIVOTAL NETWORKING, INC. +00-60-21 (hex) DSC CORPORATION +00-60-22 (hex) VICOM SYSTEMS, INC. +00-60-23 (hex) PERICOM SEMICONDUCTOR CORP. +00-60-24 (hex) GRADIENT TECHNOLOGIES, INC. +00-60-25 (hex) ACTIVE IMAGING PLC +00-60-26 (hex) VIKING COMPONENTS, INC. +00-60-27 (hex) Superior Modular Products +00-60-28 (hex) MACROVISION CORPORATION +00-60-29 (hex) CARY PERIPHERALS INC. +00-60-2A (hex) SYMICRON COMPUTER COMMUNICATIONS, LTD. +00-60-2B (hex) PEAK AUDIO +00-60-2C (hex) LINX Data Terminals, Inc. +00-60-2D (hex) ALERTON TECHNOLOGIES, INC. +00-60-2E (hex) CYCLADES CORPORATION +00-60-2F (hex) CISCO SYSTEMS, INC. +00-60-30 (hex) VILLAGE TRONIC ENTWICKLUNG +00-60-31 (hex) HRK SYSTEMS +00-60-32 (hex) I-CUBE, INC. +00-60-33 (hex) ACUITY IMAGING, INC. +00-60-34 (hex) ROBERT BOSCH GmbH +00-60-35 (hex) DALLAS SEMICONDUCTOR, INC. +00-60-36 (hex) AIT Austrian Institute of Technology GmbH +00-60-37 (hex) NXP Semiconductors +00-60-38 (hex) Nortel Networks +00-60-39 (hex) SanCom Technology, Inc. +00-60-3A (hex) QUICK CONTROLS LTD. +00-60-3B (hex) AMTEC spa +00-60-3C (hex) HAGIWARA SYS-COM CO., LTD. +00-60-3D (hex) 3CX +00-60-3E (hex) CISCO SYSTEMS, INC. +00-60-3F (hex) PATAPSCO DESIGNS +00-60-40 (hex) NETRO CORP. +00-60-41 (hex) Yokogawa Electric Corporation +00-60-42 (hex) TKS (USA), INC. +00-60-43 (hex) iDirect, INC. +00-60-44 (hex) LITTON/POLY-SCIENTIFIC +00-60-45 (hex) PATHLIGHT TECHNOLOGIES +00-60-46 (hex) VMETRO, INC. +00-60-47 (hex) CISCO SYSTEMS, INC. +00-60-48 (hex) EMC CORPORATION +00-60-49 (hex) VINA TECHNOLOGIES +00-60-4A (hex) SAIC IDEAS GROUP +00-60-4B (hex) Safe-com GmbH & Co. KG +00-60-4C (hex) SAGEM COMMUNICATION +00-60-4D (hex) MMC NETWORKS, INC. +00-60-4E (hex) CYCLE COMPUTER CORPORATION, INC. +00-60-4F (hex) SUZUKI MFG. CO., LTD. +00-60-50 (hex) INTERNIX INC. +00-60-51 (hex) QUALITY SEMICONDUCTOR +00-60-52 (hex) PERIPHERALS ENTERPRISE CO., Ltd. +00-60-53 (hex) TOYODA MACHINE WORKS, LTD. +00-60-54 (hex) CONTROLWARE GMBH +00-60-55 (hex) CORNELL UNIVERSITY +00-60-56 (hex) NETWORK TOOLS, INC. +00-60-57 (hex) MURATA MANUFACTURING CO., LTD. +00-60-58 (hex) COPPER MOUNTAIN COMMUNICATIONS, INC. +00-60-59 (hex) TECHNICAL COMMUNICATIONS CORP. +00-60-5A (hex) CELCORE, INC. +00-60-5B (hex) IntraServer Technology, Inc. +00-60-5C (hex) CISCO SYSTEMS, INC. +00-60-5D (hex) SCANIVALVE CORP. +00-60-5E (hex) LIBERTY TECHNOLOGY NETWORKING +00-60-5F (hex) NIPPON UNISOFT CORPORATION +00-60-60 (hex) DAWNING TECHNOLOGIES, INC. +00-60-61 (hex) WHISTLE COMMUNICATIONS CORP. +00-60-62 (hex) TELESYNC, INC. +00-60-63 (hex) PSION DACOM PLC. +00-60-64 (hex) NETCOMM LIMITED +00-60-65 (hex) BERNECKER & RAINER INDUSTRIE-ELEKTRONIC GmbH +00-60-66 (hex) LACROIX TECHNOLGIE +00-60-67 (hex) ACER NETXUS INC. +00-60-68 (hex) Dialogic Corporation +00-60-69 (hex) Brocade Communications Systems, Inc. +00-60-6A (hex) MITSUBISHI WIRELESS COMMUNICATIONS. INC. +00-60-6B (hex) Synclayer Inc. +00-60-6C (hex) ARESCOM +00-60-6D (hex) DIGITAL EQUIPMENT CORP. +00-60-6E (hex) DAVICOM SEMICONDUCTOR, INC. +00-60-6F (hex) CLARION CORPORATION OF AMERICA +00-60-70 (hex) CISCO SYSTEMS, INC. +00-60-71 (hex) MIDAS LAB, INC. +00-60-72 (hex) VXL INSTRUMENTS, LIMITED +00-60-73 (hex) REDCREEK COMMUNICATIONS, INC. +00-60-74 (hex) QSC AUDIO PRODUCTS +00-60-75 (hex) PENTEK, INC. +00-60-76 (hex) SCHLUMBERGER TECHNOLOGIES RETAIL PETROLEUM SYSTEMS +00-60-77 (hex) PRISA NETWORKS +00-60-78 (hex) POWER MEASUREMENT LTD. +00-60-79 (hex) Mainstream Data, Inc. +00-60-7A (hex) DVS GmbH +00-60-7B (hex) FORE SYSTEMS, INC. +00-60-7C (hex) WaveAccess, Ltd. +00-60-7D (hex) SENTIENT NETWORKS INC. +00-60-7E (hex) GIGALABS, INC. +00-60-7F (hex) AURORA TECHNOLOGIES, INC. +00-60-80 (hex) MICROTRONIX DATACOM LTD. +00-60-81 (hex) TV/COM INTERNATIONAL +00-60-82 (hex) NOVALINK TECHNOLOGIES, INC. +00-60-83 (hex) CISCO SYSTEMS, INC. +00-60-84 (hex) DIGITAL VIDEO +00-60-85 (hex) Storage Concepts +00-60-86 (hex) LOGIC REPLACEMENT TECH. LTD. +00-60-87 (hex) KANSAI ELECTRIC CO., LTD. +00-60-88 (hex) WHITE MOUNTAIN DSP, INC. +00-60-89 (hex) XATA +00-60-8A (hex) CITADEL COMPUTER +00-60-8B (hex) ConferTech International +00-60-8C (hex) 3COM CORPORATION +00-60-8D (hex) UNIPULSE CORP. +00-60-8E (hex) HE ELECTRONICS, TECHNOLOGIE & SYSTEMTECHNIK GmbH +00-60-8F (hex) TEKRAM TECHNOLOGY CO., LTD. +00-60-90 (hex) ABLE COMMUNICATIONS, INC. +00-60-91 (hex) FIRST PACIFIC NETWORKS, INC. +00-60-92 (hex) MICRO/SYS, INC. +00-60-93 (hex) VARIAN +00-60-94 (hex) IBM CORP. +00-60-95 (hex) ACCU-TIME SYSTEMS, INC. +00-60-96 (hex) T.S. MICROTECH INC. +00-60-97 (hex) 3COM CORPORATION +00-60-98 (hex) HT COMMUNICATIONS +00-60-99 (hex) SBE, Inc. +00-60-9A (hex) NJK TECHNO CO. +00-60-9B (hex) ASTRO-MED, INC. +00-60-9C (hex) Perkin-Elmer Incorporated +00-60-9D (hex) PMI FOOD EQUIPMENT GROUP +00-60-9E (hex) ASC X3 - INFORMATION TECHNOLOGY STANDARDS SECRETARIATS +00-60-9F (hex) PHAST CORPORATION +00-60-A0 (hex) SWITCHED NETWORK TECHNOLOGIES, INC. +00-60-A1 (hex) VPNet, Inc. +00-60-A2 (hex) NIHON UNISYS LIMITED CO. +00-60-A3 (hex) CONTINUUM TECHNOLOGY CORP. +00-60-A4 (hex) GRINAKER SYSTEM TECHNOLOGIES +00-60-A5 (hex) PERFORMANCE TELECOM CORP. +00-60-A6 (hex) PARTICLE MEASURING SYSTEMS +00-60-A7 (hex) MICROSENS GmbH & CO. KG +00-60-A8 (hex) TIDOMAT AB +00-60-A9 (hex) GESYTEC MbH +00-60-AA (hex) INTELLIGENT DEVICES INC. (IDI) +00-60-AB (hex) LARSCOM INCORPORATED +00-60-AC (hex) RESILIENCE CORPORATION +00-60-AD (hex) MegaChips Corporation +00-60-AE (hex) TRIO INFORMATION SYSTEMS AB +00-60-AF (hex) PACIFIC MICRO DATA, INC. +00-60-B0 (hex) HEWLETT-PACKARD CO. +00-60-B1 (hex) INPUT/OUTPUT, INC. +00-60-B2 (hex) PROCESS CONTROL CORP. +00-60-B3 (hex) Z-COM, INC. +00-60-B4 (hex) GLENAYRE R&D INC. +00-60-B5 (hex) KEBA GmbH +00-60-B6 (hex) LAND COMPUTER CO., LTD. +00-60-B7 (hex) CHANNELMATIC, INC. +00-60-B8 (hex) CORELIS Inc. +00-60-B9 (hex) NEC Infrontia Corporation +00-60-BA (hex) SAHARA NETWORKS, INC. +00-60-BB (hex) CABLETRON - NETLINK, INC. +00-60-BC (hex) KeunYoung Electronics & Communication Co., Ltd. +00-60-BD (hex) HUBBELL-PULSECOM +00-60-BE (hex) WEBTRONICS +00-60-BF (hex) MACRAIGOR SYSTEMS, INC. +00-60-C0 (hex) Nera Networks AS +00-60-C1 (hex) WaveSpan Corporation +00-60-C2 (hex) MPL AG +00-60-C3 (hex) NETVISION CORPORATION +00-60-C4 (hex) SOLITON SYSTEMS K.K. +00-60-C5 (hex) ANCOT CORP. +00-60-C6 (hex) DCS AG +00-60-C7 (hex) AMATI COMMUNICATIONS CORP. +00-60-C8 (hex) KUKA WELDING SYSTEMS & ROBOTS +00-60-C9 (hex) ControlNet, Inc. +00-60-CA (hex) HARMONIC SYSTEMS INCORPORATED +00-60-CB (hex) HITACHI ZOSEN CORPORATION +00-60-CC (hex) EMTRAK, INCORPORATED +00-60-CD (hex) VideoServer, Inc. +00-60-CE (hex) ACCLAIM COMMUNICATIONS +00-60-CF (hex) ALTEON NETWORKS, INC. +00-60-D0 (hex) SNMP RESEARCH INCORPORATED +00-60-D1 (hex) CASCADE COMMUNICATIONS +00-60-D2 (hex) LUCENT TECHNOLOGIES TAIWAN TELECOMMUNICATIONS CO., LTD. +00-60-D3 (hex) AT&T +00-60-D4 (hex) ELDAT COMMUNICATION LTD. +00-60-D5 (hex) MIYACHI TECHNOS CORP. +00-60-D6 (hex) NovAtel Wireless Technologies Ltd. +00-60-D7 (hex) ECOLE POLYTECHNIQUE FEDERALE DE LAUSANNE (EPFL) +00-60-D8 (hex) ELMIC SYSTEMS, INC. +00-60-D9 (hex) TRANSYS NETWORKS INC. +00-60-DA (hex) JBM ELECTRONICS CO. +00-60-DB (hex) NTP ELEKTRONIK A/S +00-60-DC (hex) Toyo Network Systems & System Integration Co. LTD +00-60-DD (hex) MYRICOM, INC. +00-60-DE (hex) Kayser-Threde GmbH +00-60-DF (hex) Brocade Communications Systems, Inc. +00-60-E0 (hex) AXIOM TECHNOLOGY CO., LTD. +00-60-E1 (hex) ORCKIT COMMUNICATIONS LTD. +00-60-E2 (hex) QUEST ENGINEERING & DEVELOPMENT +00-60-E3 (hex) ARBIN INSTRUMENTS +00-60-E4 (hex) COMPUSERVE, INC. +00-60-E5 (hex) FUJI AUTOMATION CO., LTD. +00-60-E6 (hex) SHOMITI SYSTEMS INCORPORATED +00-60-E7 (hex) RANDATA +00-60-E8 (hex) HITACHI COMPUTER PRODUCTS (AMERICA), INC. +00-60-E9 (hex) ATOP TECHNOLOGIES, INC. +00-60-EA (hex) StreamLogic +00-60-EB (hex) FOURTHTRACK SYSTEMS +00-60-EC (hex) HERMARY OPTO ELECTRONICS INC. +00-60-ED (hex) RICARDO TEST AUTOMATION LTD. +00-60-EE (hex) APOLLO +00-60-EF (hex) FLYTECH TECHNOLOGY CO., LTD. +00-60-F0 (hex) JOHNSON & JOHNSON MEDICAL, INC +00-60-F1 (hex) EXP COMPUTER, INC. +00-60-F2 (hex) LASERGRAPHICS, INC. +00-60-F3 (hex) Performance Analysis Broadband, Spirent plc +00-60-F4 (hex) ADVANCED COMPUTER SOLUTIONS, Inc. +00-60-F5 (hex) ICON WEST, INC. +00-60-F6 (hex) NEXTEST COMMUNICATIONS PRODUCTS, INC. +00-60-F7 (hex) DATAFUSION SYSTEMS +00-60-F8 (hex) Loran International Technologies Inc. +00-60-F9 (hex) DIAMOND LANE COMMUNICATIONS +00-60-FA (hex) EDUCATIONAL TECHNOLOGY RESOURCES, INC. +00-60-FB (hex) PACKETEER, INC. +00-60-FC (hex) CONSERVATION THROUGH INNOVATION LTD. +00-60-FD (hex) NetICs, Inc. +00-60-FE (hex) LYNX SYSTEM DEVELOPERS, INC. +00-60-FF (hex) QuVis, Inc. +00-64-40 (hex) Cisco Systems +00-70-B0 (hex) M/A-COM INC. COMPANIES +00-70-B3 (hex) DATA RECALL LTD. +00-80-00 (hex) MULTITECH SYSTEMS, INC. +00-80-01 (hex) PERIPHONICS CORPORATION +00-80-02 (hex) SATELCOM (UK) LTD +00-80-03 (hex) HYTEC ELECTRONICS LTD. +00-80-04 (hex) ANTLOW COMMUNICATIONS, LTD. +00-80-05 (hex) CACTUS COMPUTER INC. +00-80-06 (hex) COMPUADD CORPORATION +00-80-07 (hex) DLOG NC-SYSTEME +00-80-08 (hex) DYNATECH COMPUTER SYSTEMS +00-80-09 (hex) JUPITER SYSTEMS, INC. +00-80-0A (hex) JAPAN COMPUTER CORP. +00-80-0B (hex) CSK CORPORATION +00-80-0C (hex) VIDECOM LIMITED +00-80-0D (hex) VOSSWINKEL F.U. +00-80-0E (hex) ATLANTIX CORPORATION +00-80-0F (hex) STANDARD MICROSYSTEMS +00-80-10 (hex) COMMODORE INTERNATIONAL +00-80-11 (hex) DIGITAL SYSTEMS INT'L. INC. +00-80-12 (hex) INTEGRATED MEASUREMENT SYSTEMS +00-80-13 (hex) THOMAS-CONRAD CORPORATION +00-80-14 (hex) ESPRIT SYSTEMS +00-80-15 (hex) SEIKO SYSTEMS, INC. +00-80-16 (hex) WANDEL AND GOLTERMANN +00-80-17 (hex) PFU LIMITED +00-80-18 (hex) KOBE STEEL, LTD. +00-80-19 (hex) DAYNA COMMUNICATIONS, INC. +00-80-1A (hex) BELL ATLANTIC +00-80-1B (hex) KODIAK TECHNOLOGY +00-80-1C (hex) NEWPORT SYSTEMS SOLUTIONS +00-80-1D (hex) INTEGRATED INFERENCE MACHINES +00-80-1E (hex) XINETRON, INC. +00-80-1F (hex) KRUPP ATLAS ELECTRONIK GMBH +00-80-20 (hex) NETWORK PRODUCTS +00-80-21 (hex) Alcatel Canada Inc. +00-80-22 (hex) SCAN-OPTICS +00-80-23 (hex) INTEGRATED BUSINESS NETWORKS +00-80-24 (hex) KALPANA, INC. +00-80-25 (hex) STOLLMANN GMBH +00-80-26 (hex) NETWORK PRODUCTS CORPORATION +00-80-27 (hex) ADAPTIVE SYSTEMS, INC. +00-80-28 (hex) TRADPOST (HK) LTD +00-80-29 (hex) EAGLE TECHNOLOGY, INC. +00-80-2A (hex) TEST SYSTEMS & SIMULATIONS INC +00-80-2B (hex) INTEGRATED MARKETING CO +00-80-2C (hex) THE SAGE GROUP PLC +00-80-2D (hex) XYLOGICS INC +00-80-2E (hex) CASTLE ROCK COMPUTING +00-80-2F (hex) NATIONAL INSTRUMENTS CORP. +00-80-30 (hex) NEXUS ELECTRONICS +00-80-31 (hex) BASYS, CORP. +00-80-32 (hex) ACCESS CO., LTD. +00-80-33 (hex) FORMATION, INC. +00-80-34 (hex) SMT GOUPIL +00-80-35 (hex) TECHNOLOGY WORKS, INC. +00-80-36 (hex) REFLEX MANUFACTURING SYSTEMS +00-80-37 (hex) Ericsson Group +00-80-38 (hex) DATA RESEARCH & APPLICATIONS +00-80-39 (hex) ALCATEL STC AUSTRALIA +00-80-3A (hex) VARITYPER, INC. +00-80-3B (hex) APT COMMUNICATIONS, INC. +00-80-3C (hex) TVS ELECTRONICS LTD +00-80-3D (hex) SURIGIKEN CO., LTD. +00-80-3E (hex) SYNERNETICS +00-80-3F (hex) TATUNG COMPANY +00-80-40 (hex) JOHN FLUKE MANUFACTURING CO. +00-80-41 (hex) VEB KOMBINAT ROBOTRON +00-80-42 (hex) Emerson Network Power +00-80-43 (hex) NETWORLD, INC. +00-80-44 (hex) SYSTECH COMPUTER CORP. +00-80-45 (hex) MATSUSHITA ELECTRIC IND. CO +00-80-46 (hex) UNIVERSITY OF TORONTO +00-80-47 (hex) IN-NET CORP. +00-80-48 (hex) COMPEX INCORPORATED +00-80-49 (hex) NISSIN ELECTRIC CO., LTD. +00-80-4A (hex) PRO-LOG +00-80-4B (hex) EAGLE TECHNOLOGIES PTY.LTD. +00-80-4C (hex) CONTEC CO., LTD. +00-80-4D (hex) CYCLONE MICROSYSTEMS, INC. +00-80-4E (hex) APEX COMPUTER COMPANY +00-80-4F (hex) DAIKIN INDUSTRIES, LTD. +00-80-50 (hex) ZIATECH CORPORATION +00-80-51 (hex) FIBERMUX +00-80-52 (hex) TECHNICALLY ELITE CONCEPTS +00-80-53 (hex) INTELLICOM, INC. +00-80-54 (hex) FRONTIER TECHNOLOGIES CORP. +00-80-55 (hex) FERMILAB +00-80-56 (hex) SPHINX ELEKTRONIK GMBH +00-80-57 (hex) ADSOFT, LTD. +00-80-58 (hex) PRINTER SYSTEMS CORPORATION +00-80-59 (hex) STANLEY ELECTRIC CO., LTD +00-80-5A (hex) TULIP COMPUTERS INTERNAT'L B.V +00-80-5B (hex) CONDOR SYSTEMS, INC. +00-80-5C (hex) AGILIS CORPORATION +00-80-5D (hex) CANSTAR +00-80-5E (hex) LSI LOGIC CORPORATION +00-80-5F (hex) Hewlett Packard +00-80-60 (hex) NETWORK INTERFACE CORPORATION +00-80-61 (hex) LITTON SYSTEMS, INC. +00-80-62 (hex) INTERFACE CO. +00-80-63 (hex) RICHARD HIRSCHMANN GMBH & CO. +00-80-64 (hex) WYSE TECHNOLOGY +00-80-65 (hex) CYBERGRAPHIC SYSTEMS PTY LTD. +00-80-66 (hex) ARCOM CONTROL SYSTEMS, LTD. +00-80-67 (hex) SQUARE D COMPANY +00-80-68 (hex) YAMATECH SCIENTIFIC LTD. +00-80-69 (hex) COMPUTONE SYSTEMS +00-80-6A (hex) ERI (EMPAC RESEARCH INC.) +00-80-6B (hex) SCHMID TELECOMMUNICATION +00-80-6C (hex) CEGELEC PROJECTS LTD +00-80-6D (hex) CENTURY SYSTEMS CORP. +00-80-6E (hex) NIPPON STEEL CORPORATION +00-80-6F (hex) ONELAN LTD. +00-80-70 (hex) COMPUTADORAS MICRON +00-80-71 (hex) SAI TECHNOLOGY +00-80-72 (hex) MICROPLEX SYSTEMS LTD. +00-80-73 (hex) DWB ASSOCIATES +00-80-74 (hex) FISHER CONTROLS +00-80-75 (hex) PARSYTEC GMBH +00-80-76 (hex) MCNC +00-80-77 (hex) BROTHER INDUSTRIES, LTD. +00-80-78 (hex) PRACTICAL PERIPHERALS, INC. +00-80-79 (hex) MICROBUS DESIGNS LTD. +00-80-7A (hex) AITECH SYSTEMS LTD. +00-80-7B (hex) ARTEL COMMUNICATIONS CORP. +00-80-7C (hex) FIBERCOM, INC. +00-80-7D (hex) EQUINOX SYSTEMS INC. +00-80-7E (hex) SOUTHERN PACIFIC LTD. +00-80-7F (hex) DY-4 INCORPORATED +00-80-80 (hex) DATAMEDIA CORPORATION +00-80-81 (hex) KENDALL SQUARE RESEARCH CORP. +00-80-82 (hex) PEP MODULAR COMPUTERS GMBH +00-80-83 (hex) AMDAHL +00-80-84 (hex) THE CLOUD INC. +00-80-85 (hex) H-THREE SYSTEMS CORPORATION +00-80-86 (hex) COMPUTER GENERATION INC. +00-80-87 (hex) OKI ELECTRIC INDUSTRY CO., LTD +00-80-88 (hex) VICTOR COMPANY OF JAPAN, LTD. +00-80-89 (hex) TECNETICS (PTY) LTD. +00-80-8A (hex) SUMMIT MICROSYSTEMS CORP. +00-80-8B (hex) DACOLL LIMITED +00-80-8C (hex) NetScout Systems, Inc. +00-80-8D (hex) WESTCOAST TECHNOLOGY B.V. +00-80-8E (hex) RADSTONE TECHNOLOGY +00-80-8F (hex) C. ITOH ELECTRONICS, INC. +00-80-90 (hex) MICROTEK INTERNATIONAL, INC. +00-80-91 (hex) TOKYO ELECTRIC CO.,LTD +00-80-92 (hex) Silex Technology, Inc. +00-80-93 (hex) XYRON CORPORATION +00-80-94 (hex) ALFA LAVAL AUTOMATION AB +00-80-95 (hex) BASIC MERTON HANDELSGES.M.B.H. +00-80-96 (hex) HUMAN DESIGNED SYSTEMS, INC. +00-80-97 (hex) CENTRALP AUTOMATISMES +00-80-98 (hex) TDK CORPORATION +00-80-99 (hex) KLOCKNER MOELLER IPC +00-80-9A (hex) NOVUS NETWORKS LTD +00-80-9B (hex) JUSTSYSTEM CORPORATION +00-80-9C (hex) LUXCOM, INC. +00-80-9D (hex) Commscraft Ltd. +00-80-9E (hex) DATUS GMBH +00-80-9F (hex) ALCATEL BUSINESS SYSTEMS +00-80-A0 (hex) EDISA HEWLETT PACKARD S/A +00-80-A1 (hex) MICROTEST, INC. +00-80-A2 (hex) CREATIVE ELECTRONIC SYSTEMS +00-80-A3 (hex) Lantronix +00-80-A4 (hex) LIBERTY ELECTRONICS +00-80-A5 (hex) SPEED INTERNATIONAL +00-80-A6 (hex) REPUBLIC TECHNOLOGY, INC. +00-80-A7 (hex) MEASUREX CORP. +00-80-A8 (hex) VITACOM CORPORATION +00-80-A9 (hex) CLEARPOINT RESEARCH +00-80-AA (hex) MAXPEED +00-80-AB (hex) DUKANE NETWORK INTEGRATION +00-80-AC (hex) IMLOGIX, DIVISION OF GENESYS +00-80-AD (hex) CNET TECHNOLOGY, INC. +00-80-AE (hex) HUGHES NETWORK SYSTEMS +00-80-AF (hex) ALLUMER CO., LTD. +00-80-B0 (hex) ADVANCED INFORMATION +00-80-B1 (hex) SOFTCOM A/S +00-80-B2 (hex) NETWORK EQUIPMENT TECHNOLOGIES +00-80-B3 (hex) AVAL DATA CORPORATION +00-80-B4 (hex) SOPHIA SYSTEMS +00-80-B5 (hex) UNITED NETWORKS INC. +00-80-B6 (hex) THEMIS COMPUTER +00-80-B7 (hex) STELLAR COMPUTER +00-80-B8 (hex) BUG, INCORPORATED +00-80-B9 (hex) ARCHE TECHNOLIGIES INC. +00-80-BA (hex) SPECIALIX (ASIA) PTE, LTD +00-80-BB (hex) HUGHES LAN SYSTEMS +00-80-BC (hex) HITACHI ENGINEERING CO., LTD +00-80-BD (hex) THE FURUKAWA ELECTRIC CO., LTD +00-80-BE (hex) ARIES RESEARCH +00-80-BF (hex) TAKAOKA ELECTRIC MFG. CO. LTD. +00-80-C0 (hex) PENRIL DATACOMM +00-80-C1 (hex) LANEX CORPORATION +00-80-C2 (hex) IEEE 802.1 COMMITTEE +00-80-C3 (hex) BICC INFORMATION SYSTEMS & SVC +00-80-C4 (hex) DOCUMENT TECHNOLOGIES, INC. +00-80-C5 (hex) NOVELLCO DE MEXICO +00-80-C6 (hex) NATIONAL DATACOMM CORPORATION +00-80-C7 (hex) XIRCOM +00-80-C8 (hex) D-LINK SYSTEMS, INC. +00-80-C9 (hex) ALBERTA MICROELECTRONIC CENTRE +00-80-CA (hex) NETCOM RESEARCH INCORPORATED +00-80-CB (hex) FALCO DATA PRODUCTS +00-80-CC (hex) MICROWAVE BYPASS SYSTEMS +00-80-CD (hex) MICRONICS COMPUTER, INC. +00-80-CE (hex) BROADCAST TELEVISION SYSTEMS +00-80-CF (hex) EMBEDDED PERFORMANCE INC. +00-80-D0 (hex) COMPUTER PERIPHERALS, INC. +00-80-D1 (hex) KIMTRON CORPORATION +00-80-D2 (hex) SHINNIHONDENKO CO., LTD. +00-80-D3 (hex) SHIVA CORP. +00-80-D4 (hex) CHASE RESEARCH LTD. +00-80-D5 (hex) CADRE TECHNOLOGIES +00-80-D6 (hex) NUVOTECH, INC. +00-80-D7 (hex) Fantum Engineering +00-80-D8 (hex) NETWORK PERIPHERALS INC. +00-80-D9 (hex) EMK Elektronik GmbH & Co. KG +00-80-DA (hex) BRUEL & KJAER +00-80-DB (hex) GRAPHON CORPORATION +00-80-DC (hex) PICKER INTERNATIONAL +00-80-DD (hex) GMX INC/GIMIX +00-80-DE (hex) GIPSI S.A. +00-80-DF (hex) ADC CODENOLL TECHNOLOGY CORP. +00-80-E0 (hex) XTP SYSTEMS, INC. +00-80-E1 (hex) STMICROELECTRONICS +00-80-E2 (hex) T.D.I. CO., LTD. +00-80-E3 (hex) CORAL NETWORK CORPORATION +00-80-E4 (hex) NORTHWEST DIGITAL SYSTEMS, INC +00-80-E5 (hex) LSI Logic Corporation +00-80-E6 (hex) PEER NETWORKS, INC. +00-80-E7 (hex) LYNWOOD SCIENTIFIC DEV. LTD. +00-80-E8 (hex) CUMULUS CORPORATIION +00-80-E9 (hex) Madge Ltd. +00-80-EA (hex) ADVA Optical Networking Ltd. +00-80-EB (hex) COMPCONTROL B.V. +00-80-EC (hex) SUPERCOMPUTING SOLUTIONS, INC. +00-80-ED (hex) IQ TECHNOLOGIES, INC. +00-80-EE (hex) THOMSON CSF +00-80-EF (hex) RATIONAL +00-80-F0 (hex) Panasonic Communications Co., Ltd. +00-80-F1 (hex) OPUS SYSTEMS +00-80-F2 (hex) RAYCOM SYSTEMS INC +00-80-F3 (hex) SUN ELECTRONICS CORP. +00-80-F4 (hex) TELEMECANIQUE ELECTRIQUE +00-80-F5 (hex) Quantel Ltd +00-80-F6 (hex) SYNERGY MICROSYSTEMS +00-80-F7 (hex) ZENITH ELECTRONICS +00-80-F8 (hex) MIZAR, INC. +00-80-F9 (hex) HEURIKON CORPORATION +00-80-FA (hex) RWT GMBH +00-80-FB (hex) BVM LIMITED +00-80-FC (hex) AVATAR CORPORATION +00-80-FD (hex) EXSCEED CORPRATION +00-80-FE (hex) AZURE TECHNOLOGIES, INC. +00-80-FF (hex) SOC. DE TELEINFORMATIQUE RTC +00-8C-FA (hex) Inventec Corporation +00-90-00 (hex) DIAMOND MULTIMEDIA +00-90-01 (hex) NISHIMU ELECTRONICS INDUSTRIES CO., LTD. +00-90-02 (hex) ALLGON AB +00-90-03 (hex) APLIO +00-90-04 (hex) 3COM EUROPE LTD. +00-90-05 (hex) PROTECH SYSTEMS CO., LTD. +00-90-06 (hex) HAMAMATSU PHOTONICS K.K. +00-90-07 (hex) DOMEX TECHNOLOGY CORP. +00-90-08 (hex) HanA Systems Inc. +00-90-09 (hex) i Controls, Inc. +00-90-0A (hex) PROTON ELECTRONIC INDUSTRIAL CO., LTD. +00-90-0B (hex) LANNER ELECTRONICS, INC. +00-90-0C (hex) CISCO SYSTEMS, INC. +00-90-0D (hex) Overland Storage Inc. +00-90-0E (hex) HANDLINK TECHNOLOGIES, INC. +00-90-0F (hex) KAWASAKI HEAVY INDUSTRIES, LTD +00-90-10 (hex) SIMULATION LABORATORIES, INC. +00-90-11 (hex) WAVTrace, Inc. +00-90-12 (hex) GLOBESPAN SEMICONDUCTOR, INC. +00-90-13 (hex) SAMSAN CORP. +00-90-14 (hex) ROTORK INSTRUMENTS, LTD. +00-90-15 (hex) CENTIGRAM COMMUNICATIONS CORP. +00-90-16 (hex) ZAC +00-90-17 (hex) Zypcom, Inc +00-90-18 (hex) ITO ELECTRIC INDUSTRY CO, LTD. +00-90-19 (hex) HERMES ELECTRONICS CO., LTD. +00-90-1A (hex) UNISPHERE SOLUTIONS +00-90-1B (hex) DIGITAL CONTROLS +00-90-1C (hex) mps Software Gmbh +00-90-1D (hex) PEC (NZ) LTD. +00-90-1E (hex) Selesta Ingegneria S.p.A. +00-90-1F (hex) ADTEC PRODUCTIONS, INC. +00-90-20 (hex) PHILIPS ANALYTICAL X-RAY B.V. +00-90-21 (hex) CISCO SYSTEMS, INC. +00-90-22 (hex) IVEX +00-90-23 (hex) ZILOG INC. +00-90-24 (hex) PIPELINKS, INC. +00-90-25 (hex) BAE Systems Australia (Electronic Systems) Pty Ltd +00-90-26 (hex) ADVANCED SWITCHING COMMUNICATIONS, INC. +00-90-27 (hex) INTEL CORPORATION +00-90-28 (hex) NIPPON SIGNAL CO., LTD. +00-90-29 (hex) CRYPTO AG +00-90-2A (hex) COMMUNICATION DEVICES, INC. +00-90-2B (hex) CISCO SYSTEMS, INC. +00-90-2C (hex) DATA & CONTROL EQUIPMENT LTD. +00-90-2D (hex) DATA ELECTRONICS (AUST.) PTY, LTD. +00-90-2E (hex) NAMCO LIMITED +00-90-2F (hex) NETCORE SYSTEMS, INC. +00-90-30 (hex) HONEYWELL-DATING +00-90-31 (hex) MYSTICOM, LTD. +00-90-32 (hex) PELCOMBE GROUP LTD. +00-90-33 (hex) INNOVAPHONE AG +00-90-34 (hex) IMAGIC, INC. +00-90-35 (hex) ALPHA TELECOM, INC. +00-90-36 (hex) ens, inc. +00-90-37 (hex) ACUCOMM, INC. +00-90-38 (hex) FOUNTAIN TECHNOLOGIES, INC. +00-90-39 (hex) SHASTA NETWORKS +00-90-3A (hex) NIHON MEDIA TOOL INC. +00-90-3B (hex) TriEMS Research Lab, Inc. +00-90-3C (hex) ATLANTIC NETWORK SYSTEMS +00-90-3D (hex) BIOPAC SYSTEMS, INC. +00-90-3E (hex) N.V. PHILIPS INDUSTRIAL ACTIVITIES +00-90-3F (hex) AZTEC RADIOMEDIA +00-90-40 (hex) Siemens Network Convergence LLC +00-90-41 (hex) APPLIED DIGITAL ACCESS +00-90-42 (hex) ECCS, Inc. +00-90-43 (hex) NICHIBEI DENSHI CO., LTD. +00-90-44 (hex) ASSURED DIGITAL, INC. +00-90-45 (hex) Marconi Communications +00-90-46 (hex) DEXDYNE, LTD. +00-90-47 (hex) GIGA FAST E. LTD. +00-90-48 (hex) ZEAL CORPORATION +00-90-49 (hex) ENTRIDIA CORPORATION +00-90-4A (hex) CONCUR SYSTEM TECHNOLOGIES +00-90-4B (hex) GemTek Technology Co., Ltd. +00-90-4C (hex) EPIGRAM, INC. +00-90-4D (hex) SPEC S.A. +00-90-4E (hex) DELEM BV +00-90-4F (hex) ABB POWER T&D COMPANY, INC. +00-90-50 (hex) TELESTE OY +00-90-51 (hex) ULTIMATE TECHNOLOGY CORP. +00-90-52 (hex) SELCOM ELETTRONICA S.R.L. +00-90-53 (hex) DAEWOO ELECTRONICS CO., LTD. +00-90-54 (hex) INNOVATIVE SEMICONDUCTORS, INC +00-90-55 (hex) PARKER HANNIFIN CORPORATION COMPUMOTOR DIVISION +00-90-56 (hex) TELESTREAM, INC. +00-90-57 (hex) AANetcom, Inc. +00-90-58 (hex) Ultra Electronics Ltd., Command and Control Systems +00-90-59 (hex) TELECOM DEVICE K.K. +00-90-5A (hex) DEARBORN GROUP, INC. +00-90-5B (hex) RAYMOND AND LAE ENGINEERING +00-90-5C (hex) EDMI +00-90-5D (hex) NETCOM SICHERHEITSTECHNIK GmbH +00-90-5E (hex) RAULAND-BORG CORPORATION +00-90-5F (hex) CISCO SYSTEMS, INC. +00-90-60 (hex) SYSTEM CREATE CORP. +00-90-61 (hex) PACIFIC RESEARCH & ENGINEERING CORPORATION +00-90-62 (hex) ICP VORTEX COMPUTERSYSTEME GmbH +00-90-63 (hex) COHERENT COMMUNICATIONS SYSTEMS CORPORATION +00-90-64 (hex) Thomson Inc. +00-90-65 (hex) FINISAR CORPORATION +00-90-66 (hex) Troika Networks, Inc. +00-90-67 (hex) WalkAbout Computers, Inc. +00-90-68 (hex) DVT CORP. +00-90-69 (hex) JUNIPER NETWORKS, INC. +00-90-6A (hex) TURNSTONE SYSTEMS, INC. +00-90-6B (hex) APPLIED RESOURCES, INC. +00-90-6C (hex) Sartorius Hamburg GmbH +00-90-6D (hex) CISCO SYSTEMS, INC. +00-90-6E (hex) PRAXON, INC. +00-90-6F (hex) CISCO SYSTEMS, INC. +00-90-70 (hex) NEO NETWORKS, INC. +00-90-71 (hex) Applied Innovation Inc. +00-90-72 (hex) SIMRAD AS +00-90-73 (hex) GAIO TECHNOLOGY +00-90-74 (hex) ARGON NETWORKS, INC. +00-90-75 (hex) NEC DO BRASIL S.A. +00-90-76 (hex) FMT AIRCRAFT GATE SUPPORT SYSTEMS AB +00-90-77 (hex) ADVANCED FIBRE COMMUNICATIONS +00-90-78 (hex) MER TELEMANAGEMENT SOLUTIONS, LTD. +00-90-79 (hex) ClearOne, Inc. +00-90-7A (hex) Polycom, Inc. +00-90-7B (hex) E-TECH, INC. +00-90-7C (hex) DIGITALCAST, INC. +00-90-7D (hex) Lake Communications +00-90-7E (hex) VETRONIX CORP. +00-90-7F (hex) WatchGuard Technologies, Inc. +00-90-80 (hex) NOT LIMITED, INC. +00-90-81 (hex) ALOHA NETWORKS, INC. +00-90-82 (hex) FORCE INSTITUTE +00-90-83 (hex) TURBO COMMUNICATION, INC. +00-90-84 (hex) ATECH SYSTEM +00-90-85 (hex) GOLDEN ENTERPRISES, INC. +00-90-86 (hex) CISCO SYSTEMS, INC. +00-90-87 (hex) ITIS +00-90-88 (hex) BAXALL SECURITY LTD. +00-90-89 (hex) SOFTCOM MICROSYSTEMS, INC. +00-90-8A (hex) BAYLY COMMUNICATIONS, INC. +00-90-8B (hex) PFU Systems, Inc. +00-90-8C (hex) ETREND ELECTRONICS, INC. +00-90-8D (hex) VICKERS ELECTRONICS SYSTEMS +00-90-8E (hex) Nortel Networks Broadband Access +00-90-8F (hex) AUDIO CODES LTD. +00-90-90 (hex) I-BUS +00-90-91 (hex) DigitalScape, Inc. +00-90-92 (hex) CISCO SYSTEMS, INC. +00-90-93 (hex) NANAO CORPORATION +00-90-94 (hex) OSPREY TECHNOLOGIES, INC. +00-90-95 (hex) UNIVERSAL AVIONICS +00-90-96 (hex) ASKEY COMPUTER CORP. +00-90-97 (hex) Sycamore Networks +00-90-98 (hex) SBC DESIGNS, INC. +00-90-99 (hex) ALLIED TELESIS, K.K. +00-90-9A (hex) ONE WORLD SYSTEMS, INC. +00-90-9B (hex) IMAJE +00-90-9C (hex) Motorola, Inc. +00-90-9D (hex) NovaTech Process Solutions, LLC +00-90-9E (hex) Critical IO, LLC +00-90-9F (hex) DIGI-DATA CORPORATION +00-90-A0 (hex) 8X8 INC. +00-90-A1 (hex) Flying Pig Systems/High End Systems Inc. +00-90-A2 (hex) CYBERTAN TECHNOLOGY, INC. +00-90-A3 (hex) Corecess Inc. +00-90-A4 (hex) ALTIGA NETWORKS +00-90-A5 (hex) SPECTRA LOGIC +00-90-A6 (hex) CISCO SYSTEMS, INC. +00-90-A7 (hex) CLIENTEC CORPORATION +00-90-A8 (hex) NineTiles Networks, Ltd. +00-90-A9 (hex) WESTERN DIGITAL +00-90-AA (hex) INDIGO ACTIVE VISION SYSTEMS LIMITED +00-90-AB (hex) CISCO SYSTEMS, INC. +00-90-AC (hex) OPTIVISION, INC. +00-90-AD (hex) ASPECT ELECTRONICS, INC. +00-90-AE (hex) ITALTEL S.p.A. +00-90-AF (hex) J. MORITA MFG. CORP. +00-90-B0 (hex) VADEM +00-90-B1 (hex) CISCO SYSTEMS, INC. +00-90-B2 (hex) AVICI SYSTEMS INC. +00-90-B3 (hex) AGRANAT SYSTEMS +00-90-B4 (hex) WILLOWBROOK TECHNOLOGIES +00-90-B5 (hex) NIKON CORPORATION +00-90-B6 (hex) FIBEX SYSTEMS +00-90-B7 (hex) DIGITAL LIGHTWAVE, INC. +00-90-B8 (hex) ROHDE & SCHWARZ GMBH & CO. KG +00-90-B9 (hex) BERAN INSTRUMENTS LTD. +00-90-BA (hex) VALID NETWORKS, INC. +00-90-BB (hex) TAINET COMMUNICATION SYSTEM Corp. +00-90-BC (hex) TELEMANN CO., LTD. +00-90-BD (hex) OMNIA COMMUNICATIONS, INC. +00-90-BE (hex) IBC/INTEGRATED BUSINESS COMPUTERS +00-90-BF (hex) CISCO SYSTEMS, INC. +00-90-C0 (hex) K.J. LAW ENGINEERS, INC. +00-90-C1 (hex) Peco II, Inc. +00-90-C2 (hex) JK microsystems, Inc. +00-90-C3 (hex) TOPIC SEMICONDUCTOR CORP. +00-90-C4 (hex) JAVELIN SYSTEMS, INC. +00-90-C5 (hex) INTERNET MAGIC, INC. +00-90-C6 (hex) OPTIM SYSTEMS, INC. +00-90-C7 (hex) ICOM INC. +00-90-C8 (hex) WAVERIDER COMMUNICATIONS (CANADA) INC. +00-90-C9 (hex) DPAC Technologies +00-90-CA (hex) ACCORD VIDEO TELECOMMUNICATIONS, LTD. +00-90-CB (hex) Wireless OnLine, Inc. +00-90-CC (hex) Planex Communications +00-90-CD (hex) ENT-EMPRESA NACIONAL DE TELECOMMUNICACOES, S.A. +00-90-CE (hex) TETRA GmbH +00-90-CF (hex) NORTEL +00-90-D0 (hex) Thomson Telecom Belgium +00-90-D1 (hex) LEICHU ENTERPRISE CO., LTD. +00-90-D2 (hex) ARTEL VIDEO SYSTEMS +00-90-D3 (hex) GIESECKE & DEVRIENT GmbH +00-90-D4 (hex) BindView Development Corp. +00-90-D5 (hex) EUPHONIX, INC. +00-90-D6 (hex) CRYSTAL GROUP +00-90-D7 (hex) NetBoost Corp. +00-90-D8 (hex) WHITECROSS SYSTEMS +00-90-D9 (hex) CISCO SYSTEMS, INC. +00-90-DA (hex) DYNARC, INC. +00-90-DB (hex) NEXT LEVEL COMMUNICATIONS +00-90-DC (hex) TECO INFORMATION SYSTEMS +00-90-DD (hex) THE MIHARU COMMUNICATIONS CO., LTD. +00-90-DE (hex) CARDKEY SYSTEMS, INC. +00-90-DF (hex) MITSUBISHI CHEMICAL AMERICA, INC. +00-90-E0 (hex) SYSTRAN CORP. +00-90-E1 (hex) TELENA S.P.A. +00-90-E2 (hex) DISTRIBUTED PROCESSING TECHNOLOGY +00-90-E3 (hex) AVEX ELECTRONICS INC. +00-90-E4 (hex) NEC AMERICA, INC. +00-90-E5 (hex) TEKNEMA, INC. +00-90-E6 (hex) ALi Corporation +00-90-E7 (hex) HORSCH ELEKTRONIK AG +00-90-E8 (hex) MOXA TECHNOLOGIES CORP., LTD. +00-90-E9 (hex) JANZ COMPUTER AG +00-90-EA (hex) ALPHA TECHNOLOGIES, INC. +00-90-EB (hex) SENTRY TELECOM SYSTEMS +00-90-EC (hex) PYRESCOM +00-90-ED (hex) CENTRAL SYSTEM RESEARCH CO., LTD. +00-90-EE (hex) PERSONAL COMMUNICATIONS TECHNOLOGIES +00-90-EF (hex) INTEGRIX, INC. +00-90-F0 (hex) Harmonic Video Systems Ltd. +00-90-F1 (hex) DOT HILL SYSTEMS CORPORATION +00-90-F2 (hex) CISCO SYSTEMS, INC. +00-90-F3 (hex) ASPECT COMMUNICATIONS +00-90-F4 (hex) LIGHTNING INSTRUMENTATION +00-90-F5 (hex) CLEVO CO. +00-90-F6 (hex) ESCALATE NETWORKS, INC. +00-90-F7 (hex) NBASE COMMUNICATIONS LTD. +00-90-F8 (hex) MEDIATRIX TELECOM +00-90-F9 (hex) LEITCH +00-90-FA (hex) EMULEX Corp +00-90-FB (hex) PORTWELL, INC. +00-90-FC (hex) NETWORK COMPUTING DEVICES +00-90-FD (hex) CopperCom, Inc. +00-90-FE (hex) ELECOM CO., LTD. (LANEED DIV.) +00-90-FF (hex) TELLUS TECHNOLOGY INC. +00-91-D6 (hex) Crystal Group, Inc. +00-93-63 (hex) Uni-Link Technology Co., Ltd. +00-9D-8E (hex) CARDIAC RECORDERS, INC. +00-A0-00 (hex) CENTILLION NETWORKS, INC. +00-A0-01 (hex) DRS Signal Solutions +00-A0-02 (hex) LEEDS & NORTHRUP AUSTRALIA PTY LTD +00-A0-03 (hex) Siemens Switzerland Ltd., I B T HVP +00-A0-04 (hex) NETPOWER, INC. +00-A0-05 (hex) DANIEL INSTRUMENTS, LTD. +00-A0-06 (hex) IMAGE DATA PROCESSING SYSTEM GROUP +00-A0-07 (hex) APEXX TECHNOLOGY, INC. +00-A0-08 (hex) NETCORP +00-A0-09 (hex) WHITETREE NETWORK +00-A0-0A (hex) Airspan +00-A0-0B (hex) COMPUTEX CO., LTD. +00-A0-0C (hex) KINGMAX TECHNOLOGY, INC. +00-A0-0D (hex) THE PANDA PROJECT +00-A0-0E (hex) VISUAL NETWORKS, INC. +00-A0-0F (hex) Broadband Technologies +00-A0-10 (hex) SYSLOGIC DATENTECHNIK AG +00-A0-11 (hex) MUTOH INDUSTRIES LTD. +00-A0-12 (hex) B.A.T.M. ADVANCED TECHNOLOGIES +00-A0-13 (hex) TELTREND LTD. +00-A0-14 (hex) CSIR +00-A0-15 (hex) WYLE +00-A0-16 (hex) MICROPOLIS CORP. +00-A0-17 (hex) J B M CORPORATION +00-A0-18 (hex) CREATIVE CONTROLLERS, INC. +00-A0-19 (hex) NEBULA CONSULTANTS, INC. +00-A0-1A (hex) BINAR ELEKTRONIK AB +00-A0-1B (hex) PREMISYS COMMUNICATIONS, INC. +00-A0-1C (hex) NASCENT NETWORKS CORPORATION +00-A0-1D (hex) SIXNET +00-A0-1E (hex) EST CORPORATION +00-A0-1F (hex) TRICORD SYSTEMS, INC. +00-A0-20 (hex) CITICORP/TTI +00-A0-21 (hex) General Dynamics +00-A0-22 (hex) CENTRE FOR DEVELOPMENT OF ADVANCED COMPUTING +00-A0-23 (hex) APPLIED CREATIVE TECHNOLOGY, INC. +00-A0-24 (hex) 3COM CORPORATION +00-A0-25 (hex) REDCOM LABS INC. +00-A0-26 (hex) TELDAT, S.A. +00-A0-27 (hex) FIREPOWER SYSTEMS, INC. +00-A0-28 (hex) CONNER PERIPHERALS +00-A0-29 (hex) COULTER CORPORATION +00-A0-2A (hex) TRANCELL SYSTEMS +00-A0-2B (hex) TRANSITIONS RESEARCH CORP. +00-A0-2C (hex) interWAVE Communications +00-A0-2D (hex) 1394 Trade Association +00-A0-2E (hex) BRAND COMMUNICATIONS, LTD. +00-A0-2F (hex) PIRELLI CAVI +00-A0-30 (hex) CAPTOR NV/SA +00-A0-31 (hex) HAZELTINE CORPORATION, MS 1-17 +00-A0-32 (hex) GES SINGAPORE PTE. LTD. +00-A0-33 (hex) imc MeBsysteme GmbH +00-A0-34 (hex) AXEL +00-A0-35 (hex) CYLINK CORPORATION +00-A0-36 (hex) APPLIED NETWORK TECHNOLOGY +00-A0-37 (hex) Mindray DS USA, Inc. +00-A0-38 (hex) EMAIL ELECTRONICS +00-A0-39 (hex) ROSS TECHNOLOGY, INC. +00-A0-3A (hex) KUBOTEK CORPORATION +00-A0-3B (hex) TOSHIN ELECTRIC CO., LTD. +00-A0-3C (hex) EG&G NUCLEAR INSTRUMENTS +00-A0-3D (hex) OPTO-22 +00-A0-3E (hex) ATM FORUM +00-A0-3F (hex) COMPUTER SOCIETY MICROPROCESSOR & MICROPROCESSOR STANDARDS C +00-A0-40 (hex) APPLE COMPUTER +00-A0-41 (hex) INFICON +00-A0-42 (hex) SPUR PRODUCTS CORP. +00-A0-43 (hex) AMERICAN TECHNOLOGY LABS, INC. +00-A0-44 (hex) NTT IT CO., LTD. +00-A0-45 (hex) PHOENIX CONTACT GMBH & CO. +00-A0-46 (hex) SCITEX CORP. LTD. +00-A0-47 (hex) INTEGRATED FITNESS CORP. +00-A0-48 (hex) QUESTECH, LTD. +00-A0-49 (hex) DIGITECH INDUSTRIES, INC. +00-A0-4A (hex) NISSHIN ELECTRIC CO., LTD. +00-A0-4B (hex) TFL LAN INC. +00-A0-4C (hex) INNOVATIVE SYSTEMS & TECHNOLOGIES, INC. +00-A0-4D (hex) EDA INSTRUMENTS, INC. +00-A0-4E (hex) VOELKER TECHNOLOGIES, INC. +00-A0-4F (hex) AMERITEC CORP. +00-A0-50 (hex) CYPRESS SEMICONDUCTOR +00-A0-51 (hex) ANGIA COMMUNICATIONS. INC. +00-A0-52 (hex) STANILITE ELECTRONICS PTY. LTD +00-A0-53 (hex) COMPACT DEVICES, INC. +00-A0-54 (hex) PRIVATE +00-A0-55 (hex) Data Device Corporation +00-A0-56 (hex) MICROPROSS +00-A0-57 (hex) LANCOM Systems GmbH +00-A0-58 (hex) GLORY, LTD. +00-A0-59 (hex) HAMILTON HALLMARK +00-A0-5A (hex) KOFAX IMAGE PRODUCTS +00-A0-5B (hex) MARQUIP, INC. +00-A0-5C (hex) INVENTORY CONVERSION, INC./ +00-A0-5D (hex) CS COMPUTER SYSTEME GmbH +00-A0-5E (hex) MYRIAD LOGIC INC. +00-A0-5F (hex) BTG Electronics Design BV +00-A0-60 (hex) ACER PERIPHERALS, INC. +00-A0-61 (hex) PURITAN BENNETT +00-A0-62 (hex) AES PRODATA +00-A0-63 (hex) JRL SYSTEMS, INC. +00-A0-64 (hex) KVB/ANALECT +00-A0-65 (hex) Symantec Corporation +00-A0-66 (hex) ISA CO., LTD. +00-A0-67 (hex) NETWORK SERVICES GROUP +00-A0-68 (hex) BHP LIMITED +00-A0-69 (hex) Symmetricom, Inc. +00-A0-6A (hex) Verilink Corporation +00-A0-6B (hex) DMS DORSCH MIKROSYSTEM GMBH +00-A0-6C (hex) SHINDENGEN ELECTRIC MFG. CO., LTD. +00-A0-6D (hex) MANNESMANN TALLY CORPORATION +00-A0-6E (hex) AUSTRON, INC. +00-A0-6F (hex) THE APPCON GROUP, INC. +00-A0-70 (hex) COASTCOM +00-A0-71 (hex) VIDEO LOTTERY TECHNOLOGIES,INC +00-A0-72 (hex) OVATION SYSTEMS LTD. +00-A0-73 (hex) COM21, INC. +00-A0-74 (hex) PERCEPTION TECHNOLOGY +00-A0-75 (hex) MICRON TECHNOLOGY, INC. +00-A0-76 (hex) CARDWARE LAB, INC. +00-A0-77 (hex) FUJITSU NEXION, INC. +00-A0-78 (hex) Marconi Communications +00-A0-79 (hex) ALPS ELECTRIC (USA), INC. +00-A0-7A (hex) ADVANCED PERIPHERALS TECHNOLOGIES, INC. +00-A0-7B (hex) DAWN COMPUTER INCORPORATION +00-A0-7C (hex) TONYANG NYLON CO., LTD. +00-A0-7D (hex) SEEQ TECHNOLOGY, INC. +00-A0-7E (hex) AVID TECHNOLOGY, INC. +00-A0-7F (hex) GSM-SYNTEL, LTD. +00-A0-80 (hex) SBE, Inc. +00-A0-81 (hex) ALCATEL DATA NETWORKS +00-A0-82 (hex) NKT ELEKTRONIK A/S +00-A0-83 (hex) ASIMMPHONY TURKEY +00-A0-84 (hex) Dataplex Pty Ltd +00-A0-85 (hex) PRIVATE +00-A0-86 (hex) AMBER WAVE SYSTEMS, INC. +00-A0-87 (hex) Zarlink Semiconductor Ltd. +00-A0-88 (hex) ESSENTIAL COMMUNICATIONS +00-A0-89 (hex) XPOINT TECHNOLOGIES, INC. +00-A0-8A (hex) BROOKTROUT TECHNOLOGY, INC. +00-A0-8B (hex) ASTON ELECTRONIC DESIGNS LTD. +00-A0-8C (hex) MultiMedia LANs, Inc. +00-A0-8D (hex) JACOMO CORPORATION +00-A0-8E (hex) Nokia Internet Communications +00-A0-8F (hex) DESKNET SYSTEMS, INC. +00-A0-90 (hex) TimeStep Corporation +00-A0-91 (hex) APPLICOM INTERNATIONAL +00-A0-92 (hex) H. BOLLMANN MANUFACTURERS, LTD +00-A0-93 (hex) B/E AEROSPACE, Inc. +00-A0-94 (hex) COMSAT CORPORATION +00-A0-95 (hex) ACACIA NETWORKS, INC. +00-A0-96 (hex) MITUMI ELECTRIC CO., LTD. +00-A0-97 (hex) JC INFORMATION SYSTEMS +00-A0-98 (hex) NetApp +00-A0-99 (hex) K-NET LTD. +00-A0-9A (hex) NIHON KOHDEN AMERICA +00-A0-9B (hex) QPSX COMMUNICATIONS, LTD. +00-A0-9C (hex) Xyplex, Inc. +00-A0-9D (hex) JOHNATHON FREEMAN TECHNOLOGIES +00-A0-9E (hex) ICTV +00-A0-9F (hex) COMMVISION CORP. +00-A0-A0 (hex) COMPACT DATA, LTD. +00-A0-A1 (hex) EPIC DATA INC. +00-A0-A2 (hex) DIGICOM S.P.A. +00-A0-A3 (hex) RELIABLE POWER METERS +00-A0-A4 (hex) MICROS SYSTEMS, INC. +00-A0-A5 (hex) TEKNOR MICROSYSTEME, INC. +00-A0-A6 (hex) M.I. SYSTEMS, K.K. +00-A0-A7 (hex) VORAX CORPORATION +00-A0-A8 (hex) RENEX CORPORATION +00-A0-A9 (hex) NAVTEL COMMUNICATIONS INC. +00-A0-AA (hex) SPACELABS MEDICAL +00-A0-AB (hex) NETCS INFORMATIONSTECHNIK GMBH +00-A0-AC (hex) GILAT SATELLITE NETWORKS, LTD. +00-A0-AD (hex) MARCONI SPA +00-A0-AE (hex) NUCOM SYSTEMS, INC. +00-A0-AF (hex) WMS INDUSTRIES +00-A0-B0 (hex) I-O DATA DEVICE, INC. +00-A0-B1 (hex) FIRST VIRTUAL CORPORATION +00-A0-B2 (hex) SHIMA SEIKI +00-A0-B3 (hex) ZYKRONIX +00-A0-B4 (hex) TEXAS MICROSYSTEMS, INC. +00-A0-B5 (hex) 3H TECHNOLOGY +00-A0-B6 (hex) SANRITZ AUTOMATION CO., LTD. +00-A0-B7 (hex) CORDANT, INC. +00-A0-B8 (hex) SYMBIOS LOGIC INC. +00-A0-B9 (hex) EAGLE TECHNOLOGY, INC. +00-A0-BA (hex) PATTON ELECTRONICS CO. +00-A0-BB (hex) HILAN GMBH +00-A0-BC (hex) VIASAT, INCORPORATED +00-A0-BD (hex) I-TECH CORP. +00-A0-BE (hex) INTEGRATED CIRCUIT SYSTEMS, INC. COMMUNICATIONS GROUP +00-A0-BF (hex) WIRELESS DATA GROUP MOTOROLA +00-A0-C0 (hex) DIGITAL LINK CORP. +00-A0-C1 (hex) ORTIVUS MEDICAL AB +00-A0-C2 (hex) R.A. SYSTEMS CO., LTD. +00-A0-C3 (hex) UNICOMPUTER GMBH +00-A0-C4 (hex) CRISTIE ELECTRONICS LTD. +00-A0-C5 (hex) ZYXEL COMMUNICATION +00-A0-C6 (hex) QUALCOMM INCORPORATED +00-A0-C7 (hex) TADIRAN TELECOMMUNICATIONS +00-A0-C8 (hex) ADTRAN INC. +00-A0-C9 (hex) INTEL CORPORATION - HF1-06 +00-A0-CA (hex) FUJITSU DENSO LTD. +00-A0-CB (hex) ARK TELECOMMUNICATIONS, INC. +00-A0-CC (hex) LITE-ON COMMUNICATIONS, INC. +00-A0-CD (hex) DR. JOHANNES HEIDENHAIN GmbH +00-A0-CE (hex) ASTROCOM CORPORATION +00-A0-CF (hex) SOTAS, INC. +00-A0-D0 (hex) TEN X TECHNOLOGY, INC. +00-A0-D1 (hex) INVENTEC CORPORATION +00-A0-D2 (hex) ALLIED TELESIS INTERNATIONAL CORPORATION +00-A0-D3 (hex) INSTEM COMPUTER SYSTEMS, LTD. +00-A0-D4 (hex) RADIOLAN, INC. +00-A0-D5 (hex) SIERRA WIRELESS INC. +00-A0-D6 (hex) SBE, INC. +00-A0-D7 (hex) KASTEN CHASE APPLIED RESEARCH +00-A0-D8 (hex) SPECTRA - TEK +00-A0-D9 (hex) CONVEX COMPUTER CORPORATION +00-A0-DA (hex) INTEGRATED SYSTEMS Technology, Inc. +00-A0-DB (hex) FISHER & PAYKEL PRODUCTION +00-A0-DC (hex) O.N. ELECTRONIC CO., LTD. +00-A0-DD (hex) AZONIX CORPORATION +00-A0-DE (hex) YAMAHA CORPORATION +00-A0-DF (hex) STS TECHNOLOGIES, INC. +00-A0-E0 (hex) TENNYSON TECHNOLOGIES PTY LTD +00-A0-E1 (hex) WESTPORT RESEARCH ASSOCIATES, INC. +00-A0-E2 (hex) Keisokugiken Corporation +00-A0-E3 (hex) XKL SYSTEMS CORP. +00-A0-E4 (hex) OPTIQUEST +00-A0-E5 (hex) NHC COMMUNICATIONS +00-A0-E6 (hex) DIALOGIC CORPORATION +00-A0-E7 (hex) CENTRAL DATA CORPORATION +00-A0-E8 (hex) REUTERS HOLDINGS PLC +00-A0-E9 (hex) ELECTRONIC RETAILING SYSTEMS INTERNATIONAL +00-A0-EA (hex) ETHERCOM CORP. +00-A0-EB (hex) Encore Networks, Inc. +00-A0-EC (hex) TRANSMITTON LTD. +00-A0-ED (hex) Brooks Automation, Inc. +00-A0-EE (hex) NASHOBA NETWORKS +00-A0-EF (hex) LUCIDATA LTD. +00-A0-F0 (hex) TORONTO MICROELECTRONICS INC. +00-A0-F1 (hex) MTI +00-A0-F2 (hex) INFOTEK COMMUNICATIONS, INC. +00-A0-F3 (hex) STAUBLI +00-A0-F4 (hex) GE +00-A0-F5 (hex) RADGUARD LTD. +00-A0-F6 (hex) AutoGas Systems Inc. +00-A0-F7 (hex) V.I COMPUTER CORP. +00-A0-F8 (hex) SYMBOL TECHNOLOGIES, INC. +00-A0-F9 (hex) BINTEC COMMUNICATIONS GMBH +00-A0-FA (hex) Marconi Communication GmbH +00-A0-FB (hex) TORAY ENGINEERING CO., LTD. +00-A0-FC (hex) IMAGE SCIENCES, INC. +00-A0-FD (hex) SCITEX DIGITAL PRINTING, INC. +00-A0-FE (hex) BOSTON TECHNOLOGY, INC. +00-A0-FF (hex) TELLABS OPERATIONS, INC. +00-AA-00 (hex) INTEL CORPORATION +00-AA-01 (hex) INTEL CORPORATION +00-AA-02 (hex) INTEL CORPORATION +00-AA-3C (hex) OLIVETTI TELECOM SPA (OLTECO) +00-B0-09 (hex) Grass Valley Group +00-B0-17 (hex) InfoGear Technology Corp. +00-B0-19 (hex) Casi-Rusco +00-B0-1C (hex) Westport Technologies +00-B0-1E (hex) Rantic Labs, Inc. +00-B0-2A (hex) ORSYS GmbH +00-B0-2D (hex) ViaGate Technologies, Inc. +00-B0-3B (hex) HiQ Networks +00-B0-48 (hex) Marconi Communications Inc. +00-B0-4A (hex) Cisco Systems, Inc. +00-B0-52 (hex) Intellon Corporation +00-B0-64 (hex) Cisco Systems, Inc. +00-B0-69 (hex) Honewell Oy +00-B0-6D (hex) Jones Futurex Inc. +00-B0-80 (hex) Mannesmann Ipulsys B.V. +00-B0-86 (hex) LocSoft Limited +00-B0-8E (hex) Cisco Systems, Inc. +00-B0-91 (hex) Transmeta Corp. +00-B0-94 (hex) Alaris, Inc. +00-B0-9A (hex) Morrow Technologies Corp. +00-B0-9D (hex) Point Grey Research Inc. +00-B0-AC (hex) SIAE-Microelettronica S.p.A. +00-B0-AE (hex) Symmetricom +00-B0-B3 (hex) Xstreamis PLC +00-B0-C2 (hex) Cisco Systems, Inc. +00-B0-C7 (hex) Tellabs Operations, Inc. +00-B0-CE (hex) TECHNOLOGY RESCUE +00-B0-D0 (hex) Dell Computer Corp. +00-B0-DB (hex) Nextcell, Inc. +00-B0-DF (hex) RELDATA Inc +00-B0-E7 (hex) British Federal Ltd. +00-B0-EC (hex) EACEM +00-B0-EE (hex) Ajile Systems, Inc. +00-B0-F0 (hex) CALY NETWORKS +00-B0-F5 (hex) NetWorth Technologies, Inc. +00-BA-C0 (hex) Biometric Access Company +00-BB-01 (hex) OCTOTHORPE CORP. +00-BB-F0 (hex) UNGERMANN-BASS INC. +00-BD-3A (hex) Nokia Corporation +00-C0-00 (hex) LANOPTICS, LTD. +00-C0-01 (hex) DIATEK PATIENT MANAGMENT +00-C0-02 (hex) SERCOMM CORPORATION +00-C0-03 (hex) GLOBALNET COMMUNICATIONS +00-C0-04 (hex) JAPAN BUSINESS COMPUTER CO.LTD +00-C0-05 (hex) LIVINGSTON ENTERPRISES, INC. +00-C0-06 (hex) NIPPON AVIONICS CO., LTD. +00-C0-07 (hex) PINNACLE DATA SYSTEMS, INC. +00-C0-08 (hex) SECO SRL +00-C0-09 (hex) KT TECHNOLOGY (S) PTE LTD +00-C0-0A (hex) MICRO CRAFT +00-C0-0B (hex) NORCONTROL A.S. +00-C0-0C (hex) RELIA TECHNOLGIES +00-C0-0D (hex) ADVANCED LOGIC RESEARCH, INC. +00-C0-0E (hex) PSITECH, INC. +00-C0-0F (hex) QUANTUM SOFTWARE SYSTEMS LTD. +00-C0-10 (hex) HIRAKAWA HEWTECH CORP. +00-C0-11 (hex) INTERACTIVE COMPUTING DEVICES +00-C0-12 (hex) NETSPAN CORPORATION +00-C0-13 (hex) NETRIX +00-C0-14 (hex) TELEMATICS CALABASAS INT'L,INC +00-C0-15 (hex) NEW MEDIA CORPORATION +00-C0-16 (hex) ELECTRONIC THEATRE CONTROLS +00-C0-17 (hex) Fluke Corporation +00-C0-18 (hex) LANART CORPORATION +00-C0-19 (hex) LEAP TECHNOLOGY, INC. +00-C0-1A (hex) COROMETRICS MEDICAL SYSTEMS +00-C0-1B (hex) SOCKET COMMUNICATIONS, INC. +00-C0-1C (hex) INTERLINK COMMUNICATIONS LTD. +00-C0-1D (hex) GRAND JUNCTION NETWORKS, INC. +00-C0-1E (hex) LA FRANCAISE DES JEUX +00-C0-1F (hex) S.E.R.C.E.L. +00-C0-20 (hex) ARCO ELECTRONIC, CONTROL LTD. +00-C0-21 (hex) NETEXPRESS +00-C0-22 (hex) LASERMASTER TECHNOLOGIES, INC. +00-C0-23 (hex) TUTANKHAMON ELECTRONICS +00-C0-24 (hex) EDEN SISTEMAS DE COMPUTACAO SA +00-C0-25 (hex) DATAPRODUCTS CORPORATION +00-C0-26 (hex) LANS TECHNOLOGY CO., LTD. +00-C0-27 (hex) CIPHER SYSTEMS, INC. +00-C0-28 (hex) JASCO CORPORATION +00-C0-29 (hex) Nexans Deutschland GmbH - ANS +00-C0-2A (hex) OHKURA ELECTRIC CO., LTD. +00-C0-2B (hex) GERLOFF GESELLSCHAFT FUR +00-C0-2C (hex) CENTRUM COMMUNICATIONS, INC. +00-C0-2D (hex) FUJI PHOTO FILM CO., LTD. +00-C0-2E (hex) NETWIZ +00-C0-2F (hex) OKUMA CORPORATION +00-C0-30 (hex) INTEGRATED ENGINEERING B. V. +00-C0-31 (hex) DESIGN RESEARCH SYSTEMS, INC. +00-C0-32 (hex) I-CUBED LIMITED +00-C0-33 (hex) TELEBIT COMMUNICATIONS APS +00-C0-34 (hex) TRANSACTION NETWORK +00-C0-35 (hex) QUINTAR COMPANY +00-C0-36 (hex) RAYTECH ELECTRONIC CORP. +00-C0-37 (hex) DYNATEM +00-C0-38 (hex) RASTER IMAGE PROCESSING SYSTEM +00-C0-39 (hex) Teridian Semiconductor Corporation +00-C0-3A (hex) MEN-MIKRO ELEKTRONIK GMBH +00-C0-3B (hex) MULTIACCESS COMPUTING CORP. +00-C0-3C (hex) TOWER TECH S.R.L. +00-C0-3D (hex) WIESEMANN & THEIS GMBH +00-C0-3E (hex) FA. GEBR. HELLER GMBH +00-C0-3F (hex) STORES AUTOMATED SYSTEMS, INC. +00-C0-40 (hex) ECCI +00-C0-41 (hex) DIGITAL TRANSMISSION SYSTEMS +00-C0-42 (hex) DATALUX CORP. +00-C0-43 (hex) STRATACOM +00-C0-44 (hex) EMCOM CORPORATION +00-C0-45 (hex) ISOLATION SYSTEMS, LTD. +00-C0-46 (hex) Blue Chip Technology Ltd +00-C0-47 (hex) UNIMICRO SYSTEMS, INC. +00-C0-48 (hex) BAY TECHNICAL ASSOCIATES +00-C0-49 (hex) U.S. ROBOTICS, INC. +00-C0-4A (hex) GROUP 2000 AG +00-C0-4B (hex) CREATIVE MICROSYSTEMS +00-C0-4C (hex) DEPARTMENT OF FOREIGN AFFAIRS +00-C0-4D (hex) MITEC, INC. +00-C0-4E (hex) COMTROL CORPORATION +00-C0-4F (hex) DELL COMPUTER CORPORATION +00-C0-50 (hex) TOYO DENKI SEIZO K.K. +00-C0-51 (hex) ADVANCED INTEGRATION RESEARCH +00-C0-52 (hex) BURR-BROWN +00-C0-53 (hex) Aspect Software Inc. +00-C0-54 (hex) NETWORK PERIPHERALS, LTD. +00-C0-55 (hex) MODULAR COMPUTING TECHNOLOGIES +00-C0-56 (hex) SOMELEC +00-C0-57 (hex) MYCO ELECTRONICS +00-C0-58 (hex) DATAEXPERT CORP. +00-C0-59 (hex) DENSO CORPORATION +00-C0-5A (hex) SEMAPHORE COMMUNICATIONS CORP. +00-C0-5B (hex) NETWORKS NORTHWEST, INC. +00-C0-5C (hex) ELONEX PLC +00-C0-5D (hex) L&N TECHNOLOGIES +00-C0-5E (hex) VARI-LITE, INC. +00-C0-5F (hex) FINE-PAL COMPANY LIMITED +00-C0-60 (hex) ID SCANDINAVIA AS +00-C0-61 (hex) SOLECTEK CORPORATION +00-C0-62 (hex) IMPULSE TECHNOLOGY +00-C0-63 (hex) MORNING STAR TECHNOLOGIES, INC +00-C0-64 (hex) GENERAL DATACOMM IND. INC. +00-C0-65 (hex) SCOPE COMMUNICATIONS, INC. +00-C0-66 (hex) DOCUPOINT, INC. +00-C0-67 (hex) UNITED BARCODE INDUSTRIES +00-C0-68 (hex) PHILIP DRAKE ELECTRONICS LTD. +00-C0-69 (hex) Axxcelera Broadband Wireless +00-C0-6A (hex) ZAHNER-ELEKTRIK GMBH & CO. KG +00-C0-6B (hex) OSI PLUS CORPORATION +00-C0-6C (hex) SVEC COMPUTER CORP. +00-C0-6D (hex) BOCA RESEARCH, INC. +00-C0-6E (hex) HAFT TECHNOLOGY, INC. +00-C0-6F (hex) KOMATSU LTD. +00-C0-70 (hex) SECTRA SECURE-TRANSMISSION AB +00-C0-71 (hex) AREANEX COMMUNICATIONS, INC. +00-C0-72 (hex) KNX LTD. +00-C0-73 (hex) XEDIA CORPORATION +00-C0-74 (hex) TOYODA AUTOMATIC LOOM +00-C0-75 (hex) XANTE CORPORATION +00-C0-76 (hex) I-DATA INTERNATIONAL A-S +00-C0-77 (hex) DAEWOO TELECOM LTD. +00-C0-78 (hex) COMPUTER SYSTEMS ENGINEERING +00-C0-79 (hex) FONSYS CO.,LTD. +00-C0-7A (hex) PRIVA B.V. +00-C0-7B (hex) ASCEND COMMUNICATIONS, INC. +00-C0-7C (hex) HIGHTECH INFORMATION +00-C0-7D (hex) RISC DEVELOPMENTS LTD. +00-C0-7E (hex) KUBOTA CORPORATION ELECTRONIC +00-C0-7F (hex) NUPON COMPUTING CORP. +00-C0-80 (hex) NETSTAR, INC. +00-C0-81 (hex) METRODATA LTD. +00-C0-82 (hex) MOORE PRODUCTS CO. +00-C0-83 (hex) TRACE MOUNTAIN PRODUCTS, INC. +00-C0-84 (hex) DATA LINK CORP. LTD. +00-C0-85 (hex) ELECTRONICS FOR IMAGING, INC. +00-C0-86 (hex) THE LYNK CORPORATION +00-C0-87 (hex) UUNET TECHNOLOGIES, INC. +00-C0-88 (hex) EKF ELEKTRONIK GMBH +00-C0-89 (hex) TELINDUS DISTRIBUTION +00-C0-8A (hex) Lauterbach GmbH +00-C0-8B (hex) RISQ MODULAR SYSTEMS, INC. +00-C0-8C (hex) PERFORMANCE TECHNOLOGIES, INC. +00-C0-8D (hex) TRONIX PRODUCT DEVELOPMENT +00-C0-8E (hex) NETWORK INFORMATION TECHNOLOGY +00-C0-8F (hex) Panasonic Electric Works Co., Ltd. +00-C0-90 (hex) PRAIM S.R.L. +00-C0-91 (hex) JABIL CIRCUIT, INC. +00-C0-92 (hex) MENNEN MEDICAL INC. +00-C0-93 (hex) ALTA RESEARCH CORP. +00-C0-94 (hex) VMX INC. +00-C0-95 (hex) ZNYX +00-C0-96 (hex) TAMURA CORPORATION +00-C0-97 (hex) ARCHIPEL SA +00-C0-98 (hex) CHUNTEX ELECTRONIC CO., LTD. +00-C0-99 (hex) YOSHIKI INDUSTRIAL CO.,LTD. +00-C0-9A (hex) PHOTONICS CORPORATION +00-C0-9B (hex) RELIANCE COMM/TEC, R-TEC +00-C0-9C (hex) HIOKI E.E. CORPORATION +00-C0-9D (hex) DISTRIBUTED SYSTEMS INT'L, INC +00-C0-9E (hex) CACHE COMPUTERS, INC. +00-C0-9F (hex) QUANTA COMPUTER, INC. +00-C0-A0 (hex) ADVANCE MICRO RESEARCH, INC. +00-C0-A1 (hex) TOKYO DENSHI SEKEI CO. +00-C0-A2 (hex) INTERMEDIUM A/S +00-C0-A3 (hex) DUAL ENTERPRISES CORPORATION +00-C0-A4 (hex) UNIGRAF OY +00-C0-A5 (hex) DICKENS DATA SYSTEMS +00-C0-A6 (hex) EXICOM AUSTRALIA PTY. LTD +00-C0-A7 (hex) SEEL LTD. +00-C0-A8 (hex) GVC CORPORATION +00-C0-A9 (hex) BARRON MCCANN LTD. +00-C0-AA (hex) SILICON VALLEY COMPUTER +00-C0-AB (hex) Telco Systems, Inc. +00-C0-AC (hex) GAMBIT COMPUTER COMMUNICATIONS +00-C0-AD (hex) MARBEN COMMUNICATION SYSTEMS +00-C0-AE (hex) TOWERCOM CO. INC. DBA PC HOUSE +00-C0-AF (hex) TEKLOGIX INC. +00-C0-B0 (hex) GCC TECHNOLOGIES,INC. +00-C0-B1 (hex) GENIUS NET CO. +00-C0-B2 (hex) NORAND CORPORATION +00-C0-B3 (hex) COMSTAT DATACOMM CORPORATION +00-C0-B4 (hex) MYSON TECHNOLOGY, INC. +00-C0-B5 (hex) CORPORATE NETWORK SYSTEMS,INC. +00-C0-B6 (hex) Overland Storage, Inc. +00-C0-B7 (hex) AMERICAN POWER CONVERSION CORP +00-C0-B8 (hex) FRASER'S HILL LTD. +00-C0-B9 (hex) FUNK SOFTWARE, INC. +00-C0-BA (hex) NETVANTAGE +00-C0-BB (hex) FORVAL CREATIVE, INC. +00-C0-BC (hex) TELECOM AUSTRALIA/CSSC +00-C0-BD (hex) INEX TECHNOLOGIES, INC. +00-C0-BE (hex) ALCATEL - SEL +00-C0-BF (hex) TECHNOLOGY CONCEPTS, LTD. +00-C0-C0 (hex) SHORE MICROSYSTEMS, INC. +00-C0-C1 (hex) QUAD/GRAPHICS, INC. +00-C0-C2 (hex) INFINITE NETWORKS LTD. +00-C0-C3 (hex) ACUSON COMPUTED SONOGRAPHY +00-C0-C4 (hex) COMPUTER OPERATIONAL +00-C0-C5 (hex) SID INFORMATICA +00-C0-C6 (hex) PERSONAL MEDIA CORP. +00-C0-C7 (hex) SPARKTRUM MICROSYSTEMS, INC. +00-C0-C8 (hex) MICRO BYTE PTY. LTD. +00-C0-C9 (hex) ELSAG BAILEY PROCESS +00-C0-CA (hex) ALFA, INC. +00-C0-CB (hex) CONTROL TECHNOLOGY CORPORATION +00-C0-CC (hex) TELESCIENCES CO SYSTEMS, INC. +00-C0-CD (hex) COMELTA, S.A. +00-C0-CE (hex) CEI SYSTEMS & ENGINEERING PTE +00-C0-CF (hex) IMATRAN VOIMA OY +00-C0-D0 (hex) RATOC SYSTEM INC. +00-C0-D1 (hex) COMTREE TECHNOLOGY CORPORATION +00-C0-D2 (hex) SYNTELLECT, INC. +00-C0-D3 (hex) OLYMPUS IMAGE SYSTEMS, INC. +00-C0-D4 (hex) AXON NETWORKS, INC. +00-C0-D5 (hex) Werbeagentur Jürgen Siebert +00-C0-D6 (hex) J1 SYSTEMS, INC. +00-C0-D7 (hex) TAIWAN TRADING CENTER DBA +00-C0-D8 (hex) UNIVERSAL DATA SYSTEMS +00-C0-D9 (hex) QUINTE NETWORK CONFIDENTIALITY +00-C0-DA (hex) NICE SYSTEMS LTD. +00-C0-DB (hex) IPC CORPORATION (PTE) LTD. +00-C0-DC (hex) EOS TECHNOLOGIES, INC. +00-C0-DD (hex) QLogic Corporation +00-C0-DE (hex) ZCOMM, INC. +00-C0-DF (hex) KYE Systems Corp. +00-C0-E0 (hex) DSC COMMUNICATION CORP. +00-C0-E1 (hex) SONIC SOLUTIONS +00-C0-E2 (hex) CALCOMP, INC. +00-C0-E3 (hex) OSITECH COMMUNICATIONS, INC. +00-C0-E4 (hex) SIEMENS BUILDING +00-C0-E5 (hex) GESPAC, S.A. +00-C0-E6 (hex) Verilink Corporation +00-C0-E7 (hex) FIBERDATA AB +00-C0-E8 (hex) PLEXCOM, INC. +00-C0-E9 (hex) OAK SOLUTIONS, LTD. +00-C0-EA (hex) ARRAY TECHNOLOGY LTD. +00-C0-EB (hex) SEH COMPUTERTECHNIK GMBH +00-C0-EC (hex) DAUPHIN TECHNOLOGY +00-C0-ED (hex) US ARMY ELECTRONIC +00-C0-EE (hex) KYOCERA CORPORATION +00-C0-EF (hex) ABIT CORPORATION +00-C0-F0 (hex) KINGSTON TECHNOLOGY CORP. +00-C0-F1 (hex) SHINKO ELECTRIC CO., LTD. +00-C0-F2 (hex) TRANSITION NETWORKS +00-C0-F3 (hex) NETWORK COMMUNICATIONS CORP. +00-C0-F4 (hex) INTERLINK SYSTEM CO., LTD. +00-C0-F5 (hex) METACOMP, INC. +00-C0-F6 (hex) CELAN TECHNOLOGY INC. +00-C0-F7 (hex) ENGAGE COMMUNICATION, INC. +00-C0-F8 (hex) ABOUT COMPUTING INC. +00-C0-F9 (hex) Motorola Embedded Computing Group +00-C0-FA (hex) CANARY COMMUNICATIONS, INC. +00-C0-FB (hex) ADVANCED TECHNOLOGY LABS +00-C0-FC (hex) ELASTIC REALITY, INC. +00-C0-FD (hex) PROSUM +00-C0-FE (hex) APTEC COMPUTER SYSTEMS, INC. +00-C0-FF (hex) DOT HILL SYSTEMS CORPORATION +00-CB-BD (hex) Cambridge Broadband Networks Ltd. +00-CF-1C (hex) COMMUNICATION MACHINERY CORP. +00-D0-00 (hex) FERRAN SCIENTIFIC, INC. +00-D0-01 (hex) VST TECHNOLOGIES, INC. +00-D0-02 (hex) DITECH CORPORATION +00-D0-03 (hex) COMDA ENTERPRISES CORP. +00-D0-04 (hex) PENTACOM LTD. +00-D0-05 (hex) ZHS ZEITMANAGEMENTSYSTEME +00-D0-06 (hex) CISCO SYSTEMS, INC. +00-D0-07 (hex) MIC ASSOCIATES, INC. +00-D0-08 (hex) MACTELL CORPORATION +00-D0-09 (hex) HSING TECH. ENTERPRISE CO. LTD +00-D0-0A (hex) LANACCESS TELECOM S.A. +00-D0-0B (hex) RHK TECHNOLOGY, INC. +00-D0-0C (hex) SNIJDER MICRO SYSTEMS +00-D0-0D (hex) MICROMERITICS INSTRUMENT +00-D0-0E (hex) PLURIS, INC. +00-D0-0F (hex) SPEECH DESIGN GMBH +00-D0-10 (hex) CONVERGENT NETWORKS, INC. +00-D0-11 (hex) PRISM VIDEO, INC. +00-D0-12 (hex) GATEWORKS CORP. +00-D0-13 (hex) PRIMEX AEROSPACE COMPANY +00-D0-14 (hex) ROOT, INC. +00-D0-15 (hex) UNIVEX MICROTECHNOLOGY CORP. +00-D0-16 (hex) SCM MICROSYSTEMS, INC. +00-D0-17 (hex) SYNTECH INFORMATION CO., LTD. +00-D0-18 (hex) QWES. COM, INC. +00-D0-19 (hex) DAINIPPON SCREEN CORPORATE +00-D0-1A (hex) URMET TLC S.P.A. +00-D0-1B (hex) MIMAKI ENGINEERING CO., LTD. +00-D0-1C (hex) SBS TECHNOLOGIES, +00-D0-1D (hex) FURUNO ELECTRIC CO., LTD. +00-D0-1E (hex) PINGTEL CORP. +00-D0-1F (hex) CTAM PTY. LTD. +00-D0-20 (hex) AIM SYSTEM, INC. +00-D0-21 (hex) REGENT ELECTRONICS CORP. +00-D0-22 (hex) INCREDIBLE TECHNOLOGIES, INC. +00-D0-23 (hex) INFORTREND TECHNOLOGY, INC. +00-D0-24 (hex) Cognex Corporation +00-D0-25 (hex) XROSSTECH, INC. +00-D0-26 (hex) HIRSCHMANN AUSTRIA GMBH +00-D0-27 (hex) APPLIED AUTOMATION, INC. +00-D0-28 (hex) OMNEON VIDEO NETWORKS +00-D0-29 (hex) WAKEFERN FOOD CORPORATION +00-D0-2A (hex) Voxent Systems Ltd. +00-D0-2B (hex) JETCELL, INC. +00-D0-2C (hex) CAMPBELL SCIENTIFIC, INC. +00-D0-2D (hex) ADEMCO +00-D0-2E (hex) COMMUNICATION AUTOMATION CORP. +00-D0-2F (hex) VLSI TECHNOLOGY INC. +00-D0-30 (hex) Safetran Systems Corp +00-D0-31 (hex) INDUSTRIAL LOGIC CORPORATION +00-D0-32 (hex) YANO ELECTRIC CO., LTD. +00-D0-33 (hex) DALIAN DAXIAN NETWORK +00-D0-34 (hex) ORMEC SYSTEMS CORP. +00-D0-35 (hex) BEHAVIOR TECH. COMPUTER CORP. +00-D0-36 (hex) TECHNOLOGY ATLANTA CORP. +00-D0-37 (hex) Pace France +00-D0-38 (hex) FIVEMERE, LTD. +00-D0-39 (hex) UTILICOM, INC. +00-D0-3A (hex) ZONEWORX, INC. +00-D0-3B (hex) VISION PRODUCTS PTY. LTD. +00-D0-3C (hex) Vieo, Inc. +00-D0-3D (hex) GALILEO TECHNOLOGY, LTD. +00-D0-3E (hex) ROCKETCHIPS, INC. +00-D0-3F (hex) AMERICAN COMMUNICATION +00-D0-40 (hex) SYSMATE CO., LTD. +00-D0-41 (hex) AMIGO TECHNOLOGY CO., LTD. +00-D0-42 (hex) MAHLO GMBH & CO. UG +00-D0-43 (hex) ZONAL RETAIL DATA SYSTEMS +00-D0-44 (hex) ALIDIAN NETWORKS, INC. +00-D0-45 (hex) KVASER AB +00-D0-46 (hex) DOLBY LABORATORIES, INC. +00-D0-47 (hex) XN TECHNOLOGIES +00-D0-48 (hex) ECTON, INC. +00-D0-49 (hex) IMPRESSTEK CO., LTD. +00-D0-4A (hex) PRESENCE TECHNOLOGY GMBH +00-D0-4B (hex) LA CIE GROUP S.A. +00-D0-4C (hex) EUROTEL TELECOM LTD. +00-D0-4D (hex) DIV OF RESEARCH & STATISTICS +00-D0-4E (hex) LOGIBAG +00-D0-4F (hex) BITRONICS, INC. +00-D0-50 (hex) ISKRATEL +00-D0-51 (hex) O2 MICRO, INC. +00-D0-52 (hex) ASCEND COMMUNICATIONS, INC. +00-D0-53 (hex) CONNECTED SYSTEMS +00-D0-54 (hex) SAS INSTITUTE INC. +00-D0-55 (hex) KATHREIN-WERKE KG +00-D0-56 (hex) SOMAT CORPORATION +00-D0-57 (hex) ULTRAK, INC. +00-D0-58 (hex) CISCO SYSTEMS, INC. +00-D0-59 (hex) AMBIT MICROSYSTEMS CORP. +00-D0-5A (hex) SYMBIONICS, LTD. +00-D0-5B (hex) ACROLOOP MOTION CONTROL +00-D0-5C (hex) TECHNOTREND SYSTEMTECHNIK GMBH +00-D0-5D (hex) INTELLIWORXX, INC. +00-D0-5E (hex) STRATABEAM TECHNOLOGY, INC. +00-D0-5F (hex) VALCOM, INC. +00-D0-60 (hex) Panasonic Europe Ltd. +00-D0-61 (hex) TREMON ENTERPRISES CO., LTD. +00-D0-62 (hex) DIGIGRAM +00-D0-63 (hex) CISCO SYSTEMS, INC. +00-D0-64 (hex) MULTITEL +00-D0-65 (hex) TOKO ELECTRIC +00-D0-66 (hex) WINTRISS ENGINEERING CORP. +00-D0-67 (hex) CAMPIO COMMUNICATIONS +00-D0-68 (hex) IWILL CORPORATION +00-D0-69 (hex) TECHNOLOGIC SYSTEMS +00-D0-6A (hex) LINKUP SYSTEMS CORPORATION +00-D0-6B (hex) SR TELECOM INC. +00-D0-6C (hex) SHAREWAVE, INC. +00-D0-6D (hex) ACRISON, INC. +00-D0-6E (hex) TRENDVIEW RECORDERS LTD. +00-D0-6F (hex) KMC CONTROLS +00-D0-70 (hex) LONG WELL ELECTRONICS CORP. +00-D0-71 (hex) ECHELON CORP. +00-D0-72 (hex) BROADLOGIC +00-D0-73 (hex) ACN ADVANCED COMMUNICATIONS +00-D0-74 (hex) TAQUA SYSTEMS, INC. +00-D0-75 (hex) ALARIS MEDICAL SYSTEMS, INC. +00-D0-76 (hex) Merrill Lynch & Co., Inc. +00-D0-77 (hex) LUCENT TECHNOLOGIES +00-D0-78 (hex) Eltex of Sweden AB +00-D0-79 (hex) CISCO SYSTEMS, INC. +00-D0-7A (hex) AMAQUEST COMPUTER CORP. +00-D0-7B (hex) COMCAM INTERNATIONAL INC +00-D0-7C (hex) KOYO ELECTRONICS INC. CO.,LTD. +00-D0-7D (hex) COSINE COMMUNICATIONS +00-D0-7E (hex) KEYCORP LTD. +00-D0-7F (hex) STRATEGY & TECHNOLOGY, LIMITED +00-D0-80 (hex) EXABYTE CORPORATION +00-D0-81 (hex) RTD Embedded Technologies, Inc. +00-D0-82 (hex) IOWAVE INC. +00-D0-83 (hex) INVERTEX, INC. +00-D0-84 (hex) NEXCOMM SYSTEMS, INC. +00-D0-85 (hex) OTIS ELEVATOR COMPANY +00-D0-86 (hex) FOVEON, INC. +00-D0-87 (hex) MICROFIRST INC. +00-D0-88 (hex) Motorola, Inc. +00-D0-89 (hex) DYNACOLOR, INC. +00-D0-8A (hex) PHOTRON USA +00-D0-8B (hex) ADVA Optical Networking Ltd +00-D0-8C (hex) GENOA TECHNOLOGY, INC. +00-D0-8D (hex) PHOENIX GROUP, INC. +00-D0-8E (hex) NVISION INC. +00-D0-8F (hex) ARDENT TECHNOLOGIES, INC. +00-D0-90 (hex) CISCO SYSTEMS, INC. +00-D0-91 (hex) SMARTSAN SYSTEMS, INC. +00-D0-92 (hex) GLENAYRE WESTERN MULTIPLEX +00-D0-93 (hex) TQ - COMPONENTS GMBH +00-D0-94 (hex) TIMELINE VISTA, INC. +00-D0-95 (hex) Alcatel-Lucent, Enterprise Business Group +00-D0-96 (hex) 3COM EUROPE LTD. +00-D0-97 (hex) CISCO SYSTEMS, INC. +00-D0-98 (hex) Photon Dynamics Canada Inc. +00-D0-99 (hex) ELCARD OY +00-D0-9A (hex) FILANET CORPORATION +00-D0-9B (hex) SPECTEL LTD. +00-D0-9C (hex) KAPADIA COMMUNICATIONS +00-D0-9D (hex) VERIS INDUSTRIES +00-D0-9E (hex) 2WIRE, INC. +00-D0-9F (hex) NOVTEK TEST SYSTEMS +00-D0-A0 (hex) MIPS DENMARK +00-D0-A1 (hex) OSKAR VIERLING GMBH + CO. KG +00-D0-A2 (hex) INTEGRATED DEVICE +00-D0-A3 (hex) VOCAL DATA, INC. +00-D0-A4 (hex) ALANTRO COMMUNICATIONS +00-D0-A5 (hex) AMERICAN ARIUM +00-D0-A6 (hex) LANBIRD TECHNOLOGY CO., LTD. +00-D0-A7 (hex) TOKYO SOKKI KENKYUJO CO., LTD. +00-D0-A8 (hex) NETWORK ENGINES, INC. +00-D0-A9 (hex) SHINANO KENSHI CO., LTD. +00-D0-AA (hex) CHASE COMMUNICATIONS +00-D0-AB (hex) DELTAKABEL TELECOM CV +00-D0-AC (hex) GRAYSON WIRELESS +00-D0-AD (hex) TL INDUSTRIES +00-D0-AE (hex) ORESIS COMMUNICATIONS, INC. +00-D0-AF (hex) CUTLER-HAMMER, INC. +00-D0-B0 (hex) BITSWITCH LTD. +00-D0-B1 (hex) OMEGA ELECTRONICS SA +00-D0-B2 (hex) XIOTECH CORPORATION +00-D0-B3 (hex) DRS FLIGHT SAFETY AND +00-D0-B4 (hex) KATSUJIMA CO., LTD. +00-D0-B5 (hex) IPricot formerly DotCom +00-D0-B6 (hex) CRESCENT NETWORKS, INC. +00-D0-B7 (hex) INTEL CORPORATION +00-D0-B8 (hex) Iomega Corporation +00-D0-B9 (hex) MICROTEK INTERNATIONAL, INC. +00-D0-BA (hex) CISCO SYSTEMS, INC. +00-D0-BB (hex) CISCO SYSTEMS, INC. +00-D0-BC (hex) CISCO SYSTEMS, INC. +00-D0-BD (hex) Silicon Image GmbH +00-D0-BE (hex) EMUTEC INC. +00-D0-BF (hex) PIVOTAL TECHNOLOGIES +00-D0-C0 (hex) CISCO SYSTEMS, INC. +00-D0-C1 (hex) HARMONIC DATA SYSTEMS, LTD. +00-D0-C2 (hex) BALTHAZAR TECHNOLOGY AB +00-D0-C3 (hex) VIVID TECHNOLOGY PTE, LTD. +00-D0-C4 (hex) TERATECH CORPORATION +00-D0-C5 (hex) COMPUTATIONAL SYSTEMS, INC. +00-D0-C6 (hex) THOMAS & BETTS CORP. +00-D0-C7 (hex) PATHWAY, INC. +00-D0-C8 (hex) Prevas A/S +00-D0-C9 (hex) ADVANTECH CO., LTD. +00-D0-CA (hex) Intrinsyc Software International Inc. +00-D0-CB (hex) DASAN CO., LTD. +00-D0-CC (hex) TECHNOLOGIES LYRE INC. +00-D0-CD (hex) ATAN TECHNOLOGY INC. +00-D0-CE (hex) ASYST ELECTRONIC +00-D0-CF (hex) MORETON BAY +00-D0-D0 (hex) ZHONGXING TELECOM LTD. +00-D0-D1 (hex) Sycamore Networks +00-D0-D2 (hex) EPILOG CORPORATION +00-D0-D3 (hex) CISCO SYSTEMS, INC. +00-D0-D4 (hex) V-BITS, INC. +00-D0-D5 (hex) GRUNDIG AG +00-D0-D6 (hex) AETHRA TELECOMUNICAZIONI +00-D0-D7 (hex) B2C2, INC. +00-D0-D8 (hex) 3Com Corporation +00-D0-D9 (hex) DEDICATED MICROCOMPUTERS +00-D0-DA (hex) TAICOM DATA SYSTEMS CO., LTD. +00-D0-DB (hex) MCQUAY INTERNATIONAL +00-D0-DC (hex) MODULAR MINING SYSTEMS, INC. +00-D0-DD (hex) SUNRISE TELECOM, INC. +00-D0-DE (hex) PHILIPS MULTIMEDIA NETWORK +00-D0-DF (hex) KUZUMI ELECTRONICS, INC. +00-D0-E0 (hex) DOOIN ELECTRONICS CO. +00-D0-E1 (hex) AVIONITEK ISRAEL INC. +00-D0-E2 (hex) MRT MICRO, INC. +00-D0-E3 (hex) ELE-CHEM ENGINEERING CO., LTD. +00-D0-E4 (hex) CISCO SYSTEMS, INC. +00-D0-E5 (hex) SOLIDUM SYSTEMS CORP. +00-D0-E6 (hex) IBOND INC. +00-D0-E7 (hex) VCON TELECOMMUNICATION LTD. +00-D0-E8 (hex) MAC SYSTEM CO., LTD. +00-D0-E9 (hex) Advantage Century Telecommunication Corp. +00-D0-EA (hex) NEXTONE COMMUNICATIONS, INC. +00-D0-EB (hex) LIGHTERA NETWORKS, INC. +00-D0-EC (hex) NAKAYO TELECOMMUNICATIONS, INC +00-D0-ED (hex) XIOX +00-D0-EE (hex) DICTAPHONE CORPORATION +00-D0-EF (hex) IGT +00-D0-F0 (hex) CONVISION TECHNOLOGY GMBH +00-D0-F1 (hex) SEGA ENTERPRISES, LTD. +00-D0-F2 (hex) MONTEREY NETWORKS +00-D0-F3 (hex) SOLARI DI UDINE SPA +00-D0-F4 (hex) CARINTHIAN TECH INSTITUTE +00-D0-F5 (hex) ORANGE MICRO, INC. +00-D0-F6 (hex) Alcatel Canada +00-D0-F7 (hex) NEXT NETS CORPORATION +00-D0-F8 (hex) FUJIAN STAR TERMINAL +00-D0-F9 (hex) ACUTE COMMUNICATIONS CORP. +00-D0-FA (hex) Thales e-Security Ltd. +00-D0-FB (hex) TEK MICROSYSTEMS, INCORPORATED +00-D0-FC (hex) GRANITE MICROSYSTEMS +00-D0-FD (hex) OPTIMA TELE.COM, INC. +00-D0-FE (hex) ASTRAL POINT +00-D0-FF (hex) CISCO SYSTEMS, INC. +00-D1-1C (hex) ACETEL +00-DB-45 (hex) THAMWAY CO.,LTD. +00-DD-00 (hex) UNGERMANN-BASS INC. +00-DD-01 (hex) UNGERMANN-BASS INC. +00-DD-02 (hex) UNGERMANN-BASS INC. +00-DD-03 (hex) UNGERMANN-BASS INC. +00-DD-04 (hex) UNGERMANN-BASS INC. +00-DD-05 (hex) UNGERMANN-BASS INC. +00-DD-06 (hex) UNGERMANN-BASS INC. +00-DD-07 (hex) UNGERMANN-BASS INC. +00-DD-08 (hex) UNGERMANN-BASS INC. +00-DD-09 (hex) UNGERMANN-BASS INC. +00-DD-0A (hex) UNGERMANN-BASS INC. +00-DD-0B (hex) UNGERMANN-BASS INC. +00-DD-0C (hex) UNGERMANN-BASS INC. +00-DD-0D (hex) UNGERMANN-BASS INC. +00-DD-0E (hex) UNGERMANN-BASS INC. +00-DD-0F (hex) UNGERMANN-BASS INC. +00-E0-00 (hex) Fujitsu Limited +00-E0-01 (hex) STRAND LIGHTING LIMITED +00-E0-02 (hex) CROSSROADS SYSTEMS, INC. +00-E0-03 (hex) NOKIA WIRELESS BUSINESS COMMUN +00-E0-04 (hex) PMC-SIERRA, INC. +00-E0-05 (hex) TECHNICAL CORP. +00-E0-06 (hex) SILICON INTEGRATED SYS. CORP. +00-E0-07 (hex) Avaya ECS Ltd +00-E0-08 (hex) AMAZING CONTROLS! INC. +00-E0-09 (hex) MARATHON TECHNOLOGIES CORP. +00-E0-0A (hex) DIBA, INC. +00-E0-0B (hex) ROOFTOP COMMUNICATIONS CORP. +00-E0-0C (hex) MOTOROLA +00-E0-0D (hex) RADIANT SYSTEMS +00-E0-0E (hex) AVALON IMAGING SYSTEMS, INC. +00-E0-0F (hex) SHANGHAI BAUD DATA +00-E0-10 (hex) HESS SB-AUTOMATENBAU GmbH +00-E0-11 (hex) Uniden Corporation +00-E0-12 (hex) PLUTO TECHNOLOGIES INTERNATIONAL INC. +00-E0-13 (hex) EASTERN ELECTRONIC CO., LTD. +00-E0-14 (hex) CISCO SYSTEMS, INC. +00-E0-15 (hex) HEIWA CORPORATION +00-E0-16 (hex) RAPID CITY COMMUNICATIONS +00-E0-17 (hex) EXXACT GmbH +00-E0-18 (hex) ASUSTEK COMPUTER INC. +00-E0-19 (hex) ING. GIORDANO ELETTRONICA +00-E0-1A (hex) COMTEC SYSTEMS. CO., LTD. +00-E0-1B (hex) SPHERE COMMUNICATIONS, INC. +00-E0-1C (hex) Cradlepoint, Inc +00-E0-1D (hex) WebTV NETWORKS, INC. +00-E0-1E (hex) CISCO SYSTEMS, INC. +00-E0-1F (hex) AVIDIA Systems, Inc. +00-E0-20 (hex) TECNOMEN OY +00-E0-21 (hex) FREEGATE CORP. +00-E0-22 (hex) Analog Devices Inc. +00-E0-23 (hex) TELRAD +00-E0-24 (hex) GADZOOX NETWORKS +00-E0-25 (hex) dit Co., Ltd. +00-E0-26 (hex) Redlake MASD LLC +00-E0-27 (hex) DUX, INC. +00-E0-28 (hex) APTIX CORPORATION +00-E0-29 (hex) STANDARD MICROSYSTEMS CORP. +00-E0-2A (hex) TANDBERG TELEVISION AS +00-E0-2B (hex) EXTREME NETWORKS +00-E0-2C (hex) AST COMPUTER +00-E0-2D (hex) InnoMediaLogic, Inc. +00-E0-2E (hex) SPC ELECTRONICS CORPORATION +00-E0-2F (hex) MCNS HOLDINGS, L.P. +00-E0-30 (hex) MELITA INTERNATIONAL CORP. +00-E0-31 (hex) HAGIWARA ELECTRIC CO., LTD. +00-E0-32 (hex) MISYS FINANCIAL SYSTEMS, LTD. +00-E0-33 (hex) E.E.P.D. GmbH +00-E0-34 (hex) CISCO SYSTEMS, INC. +00-E0-35 (hex) Emerson Network Power +00-E0-36 (hex) PIONEER CORPORATION +00-E0-37 (hex) CENTURY CORPORATION +00-E0-38 (hex) PROXIMA CORPORATION +00-E0-39 (hex) PARADYNE CORP. +00-E0-3A (hex) CABLETRON SYSTEMS, INC. +00-E0-3B (hex) PROMINET CORPORATION +00-E0-3C (hex) AdvanSys +00-E0-3D (hex) FOCON ELECTRONIC SYSTEMS A/S +00-E0-3E (hex) ALFATECH, INC. +00-E0-3F (hex) JATON CORPORATION +00-E0-40 (hex) DeskStation Technology, Inc. +00-E0-41 (hex) CSPI +00-E0-42 (hex) Pacom Systems Ltd. +00-E0-43 (hex) VitalCom +00-E0-44 (hex) LSICS CORPORATION +00-E0-45 (hex) TOUCHWAVE, INC. +00-E0-46 (hex) BENTLY NEVADA CORP. +00-E0-47 (hex) InFocus Corporation +00-E0-48 (hex) SDL COMMUNICATIONS, INC. +00-E0-49 (hex) MICROWI ELECTRONIC GmbH +00-E0-4A (hex) ENHANCED MESSAGING SYSTEMS, INC +00-E0-4B (hex) JUMP INDUSTRIELLE COMPUTERTECHNIK GmbH +00-E0-4C (hex) REALTEK SEMICONDUCTOR CORP. +00-E0-4D (hex) INTERNET INITIATIVE JAPAN, INC +00-E0-4E (hex) SANYO DENKI CO., LTD. +00-E0-4F (hex) CISCO SYSTEMS, INC. +00-E0-50 (hex) EXECUTONE INFORMATION SYSTEMS, INC. +00-E0-51 (hex) TALX CORPORATION +00-E0-52 (hex) Brocade Communications Systems, Inc +00-E0-53 (hex) CELLPORT LABS, INC. +00-E0-54 (hex) KODAI HITEC CO., LTD. +00-E0-55 (hex) INGENIERIA ELECTRONICA COMERCIAL INELCOM S.A. +00-E0-56 (hex) HOLONTECH CORPORATION +00-E0-57 (hex) HAN MICROTELECOM. CO., LTD. +00-E0-58 (hex) PHASE ONE DENMARK A/S +00-E0-59 (hex) CONTROLLED ENVIRONMENTS, LTD. +00-E0-5A (hex) GALEA NETWORK SECURITY +00-E0-5B (hex) WEST END SYSTEMS CORP. +00-E0-5C (hex) MATSUSHITA KOTOBUKI ELECTRONICS INDUSTRIES, LTD. +00-E0-5D (hex) UNITEC CO., LTD. +00-E0-5E (hex) JAPAN AVIATION ELECTRONICS INDUSTRY, LTD. +00-E0-5F (hex) e-Net, Inc. +00-E0-60 (hex) SHERWOOD +00-E0-61 (hex) EdgePoint Networks, Inc. +00-E0-62 (hex) HOST ENGINEERING +00-E0-63 (hex) CABLETRON - YAGO SYSTEMS, INC. +00-E0-64 (hex) SAMSUNG ELECTRONICS +00-E0-65 (hex) OPTICAL ACCESS INTERNATIONAL +00-E0-66 (hex) ProMax Systems, Inc. +00-E0-67 (hex) eac AUTOMATION-CONSULTING GmbH +00-E0-68 (hex) MERRIMAC SYSTEMS INC. +00-E0-69 (hex) JAYCOR +00-E0-6A (hex) KAPSCH AG +00-E0-6B (hex) W&G SPECIAL PRODUCTS +00-E0-6C (hex) AEP Systems International Ltd +00-E0-6D (hex) COMPUWARE CORPORATION +00-E0-6E (hex) FAR SYSTEMS S.p.A. +00-E0-6F (hex) Motorola, Inc. +00-E0-70 (hex) DH TECHNOLOGY +00-E0-71 (hex) EPIS MICROCOMPUTER +00-E0-72 (hex) LYNK +00-E0-73 (hex) NATIONAL AMUSEMENT NETWORK, INC. +00-E0-74 (hex) TIERNAN COMMUNICATIONS, INC. +00-E0-75 (hex) Verilink Corporation +00-E0-76 (hex) DEVELOPMENT CONCEPTS, INC. +00-E0-77 (hex) WEBGEAR, INC. +00-E0-78 (hex) BERKELEY NETWORKS +00-E0-79 (hex) A.T.N.R. +00-E0-7A (hex) MIKRODIDAKT AB +00-E0-7B (hex) BAY NETWORKS +00-E0-7C (hex) METTLER-TOLEDO, INC. +00-E0-7D (hex) NETRONIX, INC. +00-E0-7E (hex) WALT DISNEY IMAGINEERING +00-E0-7F (hex) LOGISTISTEM s.r.l. +00-E0-80 (hex) CONTROL RESOURCES CORPORATION +00-E0-81 (hex) TYAN COMPUTER CORP. +00-E0-82 (hex) ANERMA +00-E0-83 (hex) JATO TECHNOLOGIES, INC. +00-E0-84 (hex) COMPULITE R&D +00-E0-85 (hex) GLOBAL MAINTECH, INC. +00-E0-86 (hex) CYBEX COMPUTER PRODUCTS +00-E0-87 (hex) LeCroy - Networking Productions Division +00-E0-88 (hex) LTX CORPORATION +00-E0-89 (hex) ION Networks, Inc. +00-E0-8A (hex) GEC AVERY, LTD. +00-E0-8B (hex) QLogic Corp. +00-E0-8C (hex) NEOPARADIGM LABS, INC. +00-E0-8D (hex) PRESSURE SYSTEMS, INC. +00-E0-8E (hex) UTSTARCOM +00-E0-8F (hex) CISCO SYSTEMS, INC. +00-E0-90 (hex) BECKMAN LAB. AUTOMATION DIV. +00-E0-91 (hex) LG ELECTRONICS, INC. +00-E0-92 (hex) ADMTEK INCORPORATED +00-E0-93 (hex) ACKFIN NETWORKS +00-E0-94 (hex) OSAI SRL +00-E0-95 (hex) ADVANCED-VISION TECHNOLGIES CORP. +00-E0-96 (hex) SHIMADZU CORPORATION +00-E0-97 (hex) CARRIER ACCESS CORPORATION +00-E0-98 (hex) AboCom Systems, Inc. +00-E0-99 (hex) SAMSON AG +00-E0-9A (hex) Positron Inc. +00-E0-9B (hex) ENGAGE NETWORKS, INC. +00-E0-9C (hex) MII +00-E0-9D (hex) SARNOFF CORPORATION +00-E0-9E (hex) QUANTUM CORPORATION +00-E0-9F (hex) PIXEL VISION +00-E0-A0 (hex) WILTRON CO. +00-E0-A1 (hex) HIMA PAUL HILDEBRANDT GmbH Co. KG +00-E0-A2 (hex) MICROSLATE INC. +00-E0-A3 (hex) CISCO SYSTEMS, INC. +00-E0-A4 (hex) ESAOTE S.p.A. +00-E0-A5 (hex) ComCore Semiconductor, Inc. +00-E0-A6 (hex) TELOGY NETWORKS, INC. +00-E0-A7 (hex) IPC INFORMATION SYSTEMS, INC. +00-E0-A8 (hex) SAT GmbH & Co. +00-E0-A9 (hex) FUNAI ELECTRIC CO., LTD. +00-E0-AA (hex) ELECTROSONIC LTD. +00-E0-AB (hex) DIMAT S.A. +00-E0-AC (hex) MIDSCO, INC. +00-E0-AD (hex) EES TECHNOLOGY, LTD. +00-E0-AE (hex) XAQTI CORPORATION +00-E0-AF (hex) GENERAL DYNAMICS INFORMATION SYSTEMS +00-E0-B0 (hex) CISCO SYSTEMS, INC. +00-E0-B1 (hex) Alcatel-Lucent, Enterprise Business Group +00-E0-B2 (hex) TELMAX COMMUNICATIONS CORP. +00-E0-B3 (hex) EtherWAN Systems, Inc. +00-E0-B4 (hex) TECHNO SCOPE CO., LTD. +00-E0-B5 (hex) ARDENT COMMUNICATIONS CORP. +00-E0-B6 (hex) Entrada Networks +00-E0-B7 (hex) PI GROUP, LTD. +00-E0-B8 (hex) GATEWAY 2000 +00-E0-B9 (hex) BYAS SYSTEMS +00-E0-BA (hex) BERGHOF AUTOMATIONSTECHNIK GmbH +00-E0-BB (hex) NBX CORPORATION +00-E0-BC (hex) SYMON COMMUNICATIONS, INC. +00-E0-BD (hex) INTERFACE SYSTEMS, INC. +00-E0-BE (hex) GENROCO INTERNATIONAL, INC. +00-E0-BF (hex) TORRENT NETWORKING TECHNOLOGIES CORP. +00-E0-C0 (hex) SEIWA ELECTRIC MFG. CO., LTD. +00-E0-C1 (hex) MEMOREX TELEX JAPAN, LTD. +00-E0-C2 (hex) NECSY S.p.A. +00-E0-C3 (hex) SAKAI SYSTEM DEVELOPMENT CORP. +00-E0-C4 (hex) HORNER ELECTRIC, INC. +00-E0-C5 (hex) BCOM ELECTRONICS INC. +00-E0-C6 (hex) LINK2IT, L.L.C. +00-E0-C7 (hex) EUROTECH SRL +00-E0-C8 (hex) VIRTUAL ACCESS, LTD. +00-E0-C9 (hex) AutomatedLogic Corporation +00-E0-CA (hex) BEST DATA PRODUCTS +00-E0-CB (hex) RESON, INC. +00-E0-CC (hex) HERO SYSTEMS, LTD. +00-E0-CD (hex) SENSIS CORPORATION +00-E0-CE (hex) ARN +00-E0-CF (hex) INTEGRATED DEVICE TECHNOLOGY, INC. +00-E0-D0 (hex) NETSPEED, INC. +00-E0-D1 (hex) TELSIS LIMITED +00-E0-D2 (hex) VERSANET COMMUNICATIONS, INC. +00-E0-D3 (hex) DATENTECHNIK GmbH +00-E0-D4 (hex) EXCELLENT COMPUTER +00-E0-D5 (hex) Emulex Corporation +00-E0-D6 (hex) COMPUTER & COMMUNICATION RESEARCH LAB. +00-E0-D7 (hex) SUNSHINE ELECTRONICS, INC. +00-E0-D8 (hex) LANBit Computer, Inc. +00-E0-D9 (hex) TAZMO CO., LTD. +00-E0-DA (hex) Alcatel North America ESD +00-E0-DB (hex) ViaVideo Communications, Inc. +00-E0-DC (hex) NEXWARE CORP. +00-E0-DD (hex) ZENITH ELECTRONICS CORPORATION +00-E0-DE (hex) DATAX NV +00-E0-DF (hex) KEYMILE GmbH +00-E0-E0 (hex) SI ELECTRONICS, LTD. +00-E0-E1 (hex) G2 NETWORKS, INC. +00-E0-E2 (hex) INNOVA CORP. +00-E0-E3 (hex) SK-ELEKTRONIK GmbH +00-E0-E4 (hex) FANUC ROBOTICS NORTH AMERICA, Inc. +00-E0-E5 (hex) CINCO NETWORKS, INC. +00-E0-E6 (hex) INCAA DATACOM B.V. +00-E0-E7 (hex) RAYTHEON E-SYSTEMS, INC. +00-E0-E8 (hex) GRETACODER Data Systems AG +00-E0-E9 (hex) DATA LABS, INC. +00-E0-EA (hex) INNOVAT COMMUNICATIONS, INC. +00-E0-EB (hex) DIGICOM SYSTEMS, INCORPORATED +00-E0-EC (hex) CELESTICA INC. +00-E0-ED (hex) SILICOM, LTD. +00-E0-EE (hex) MAREL HF +00-E0-EF (hex) DIONEX +00-E0-F0 (hex) ABLER TECHNOLOGY, INC. +00-E0-F1 (hex) THAT CORPORATION +00-E0-F2 (hex) ARLOTTO COMNET, INC. +00-E0-F3 (hex) WebSprint Communications, Inc. +00-E0-F4 (hex) INSIDE Technology A/S +00-E0-F5 (hex) TELES AG +00-E0-F6 (hex) DECISION EUROPE +00-E0-F7 (hex) CISCO SYSTEMS, INC. +00-E0-F8 (hex) DICNA CONTROL AB +00-E0-F9 (hex) CISCO SYSTEMS, INC. +00-E0-FA (hex) TRL TECHNOLOGY, LTD. +00-E0-FB (hex) LEIGHTRONIX, INC. +00-E0-FC (hex) HUAWEI TECHNOLOGIES CO., LTD. +00-E0-FD (hex) A-TREND TECHNOLOGY CO., LTD. +00-E0-FE (hex) CISCO SYSTEMS, INC. +00-E0-FF (hex) SECURITY DYNAMICS TECHNOLOGIES, Inc. +00-E6-D3 (hex) NIXDORF COMPUTER CORP. +02-07-01 (hex) RACAL-DATACOM +02-1C-7C (hex) PERQ SYSTEMS CORPORATION +02-60-86 (hex) LOGIC REPLACEMENT TECH. LTD. +02-60-8C (hex) 3COM CORPORATION +02-70-01 (hex) RACAL-DATACOM +02-70-B0 (hex) M/A-COM INC. COMPANIES +02-70-B3 (hex) DATA RECALL LTD +02-9D-8E (hex) CARDIAC RECORDERS INC. +02-AA-3C (hex) OLIVETTI TELECOMM SPA (OLTECO) +02-BB-01 (hex) OCTOTHORPE CORP. +02-C0-8C (hex) 3COM CORPORATION +02-CF-1C (hex) COMMUNICATION MACHINERY CORP. +02-E6-D3 (hex) NIXDORF COMPUTER CORPORATION +04-0A-E0 (hex) XMIT AG COMPUTER NETWORKS +04-0E-C2 (hex) ViewSonic Mobile China Limited +04-1E-64 (hex) Apple, Inc +04-22-34 (hex) Wireless Standard Extensions +04-2B-BB (hex) PicoCELA, Inc. +04-2F-56 (hex) ATOCS (Shenzhen) LTD +04-4F-AA (hex) Ruckus Wireless +04-76-6E (hex) ALPS Co,. Ltd. +04-94-A1 (hex) CATCH THE WIND INC +04-9F-81 (hex) Simena, LLC +04-B3-B6 (hex) Seamap (UK) Ltd +04-B4-66 (hex) BSP Co., Ltd. +04-C0-5B (hex) Tigo Energy +04-C8-80 (hex) Samtec Inc +04-E0-C4 (hex) TRIUMPH-ADLER AG +04-FE-7F (hex) Cisco Systems +08-00-01 (hex) COMPUTERVISION CORPORATION +08-00-02 (hex) BRIDGE COMMUNICATIONS INC. +08-00-03 (hex) ADVANCED COMPUTER COMM. +08-00-04 (hex) CROMEMCO INCORPORATED +08-00-05 (hex) SYMBOLICS INC. +08-00-06 (hex) SIEMENS AG +08-00-07 (hex) APPLE COMPUTER INC. +08-00-08 (hex) BOLT BERANEK AND NEWMAN INC. +08-00-09 (hex) HEWLETT PACKARD +08-00-0A (hex) NESTAR SYSTEMS INCORPORATED +08-00-0B (hex) UNISYS CORPORATION +08-00-0C (hex) MIKLYN DEVELOPMENT CO. +08-00-0D (hex) INTERNATIONAL COMPUTERS LTD. +08-00-0E (hex) NCR CORPORATION +08-00-0F (hex) MITEL CORPORATION +08-00-11 (hex) TEKTRONIX INC. +08-00-12 (hex) BELL ATLANTIC INTEGRATED SYST. +08-00-13 (hex) EXXON +08-00-14 (hex) EXCELAN +08-00-15 (hex) STC BUSINESS SYSTEMS +08-00-16 (hex) BARRISTER INFO SYS CORP +08-00-17 (hex) NATIONAL SEMICONDUCTOR +08-00-18 (hex) PIRELLI FOCOM NETWORKS +08-00-19 (hex) GENERAL ELECTRIC CORPORATION +08-00-1A (hex) TIARA/ 10NET +08-00-1B (hex) EMC Corporation +08-00-1C (hex) KDD-KOKUSAI DEBNSIN DENWA CO. +08-00-1D (hex) ABLE COMMUNICATIONS INC. +08-00-1E (hex) APOLLO COMPUTER INC. +08-00-1F (hex) SHARP CORPORATION +08-00-20 (hex) SUN MICROSYSTEMS INC. +08-00-21 (hex) 3M COMPANY +08-00-22 (hex) NBI INC. +08-00-23 (hex) Panasonic Communications Co., Ltd. +08-00-24 (hex) 10NET COMMUNICATIONS/DCA +08-00-25 (hex) CONTROL DATA +08-00-26 (hex) NORSK DATA A.S. +08-00-27 (hex) CADMUS COMPUTER SYSTEMS +08-00-28 (hex) Texas Instruments +08-00-29 (hex) MEGATEK CORPORATION +08-00-2A (hex) MOSAIC TECHNOLOGIES INC. +08-00-2B (hex) DIGITAL EQUIPMENT CORPORATION +08-00-2C (hex) BRITTON LEE INC. +08-00-2D (hex) LAN-TEC INC. +08-00-2E (hex) METAPHOR COMPUTER SYSTEMS +08-00-2F (hex) PRIME COMPUTER INC. +08-00-30 (hex) NETWORK RESEARCH CORPORATION +08-00-30 (hex) CERN +08-00-30 (hex) ROYAL MELBOURNE INST OF TECH +08-00-31 (hex) LITTLE MACHINES INC. +08-00-32 (hex) TIGAN INCORPORATED +08-00-33 (hex) BAUSCH & LOMB +08-00-34 (hex) FILENET CORPORATION +08-00-35 (hex) MICROFIVE CORPORATION +08-00-36 (hex) INTERGRAPH CORPORATION +08-00-37 (hex) FUJI-XEROX CO. LTD. +08-00-38 (hex) CII HONEYWELL BULL +08-00-39 (hex) SPIDER SYSTEMS LIMITED +08-00-3A (hex) ORCATECH INC. +08-00-3B (hex) TORUS SYSTEMS LIMITED +08-00-3C (hex) SCHLUMBERGER WELL SERVICES +08-00-3D (hex) CADNETIX CORPORATIONS +08-00-3E (hex) CODEX CORPORATION +08-00-3F (hex) FRED KOSCHARA ENTERPRISES +08-00-40 (hex) FERRANTI COMPUTER SYS. LIMITED +08-00-41 (hex) RACAL-MILGO INFORMATION SYS.. +08-00-42 (hex) JAPAN MACNICS CORP. +08-00-43 (hex) PIXEL COMPUTER INC. +08-00-44 (hex) DAVID SYSTEMS INC. +08-00-45 (hex) CONCURRENT COMPUTER CORP. +08-00-46 (hex) Sony Corporation +08-00-47 (hex) SEQUENT COMPUTER SYSTEMS INC. +08-00-48 (hex) EUROTHERM GAUGING SYSTEMS +08-00-49 (hex) UNIVATION +08-00-4A (hex) BANYAN SYSTEMS INC. +08-00-4B (hex) PLANNING RESEARCH CORP. +08-00-4C (hex) HYDRA COMPUTER SYSTEMS INC. +08-00-4D (hex) CORVUS SYSTEMS INC. +08-00-4E (hex) 3COM EUROPE LTD. +08-00-4F (hex) CYGNET SYSTEMS +08-00-50 (hex) DAISY SYSTEMS CORP. +08-00-51 (hex) EXPERDATA +08-00-52 (hex) INSYSTEC +08-00-53 (hex) MIDDLE EAST TECH. UNIVERSITY +08-00-55 (hex) STANFORD TELECOMM. INC. +08-00-56 (hex) STANFORD LINEAR ACCEL. CENTER +08-00-57 (hex) EVANS & SUTHERLAND +08-00-58 (hex) SYSTEMS CONCEPTS +08-00-59 (hex) A/S MYCRON +08-00-5A (hex) IBM CORPORATION +08-00-5B (hex) VTA TECHNOLOGIES INC. +08-00-5C (hex) FOUR PHASE SYSTEMS +08-00-5D (hex) GOULD INC. +08-00-5E (hex) COUNTERPOINT COMPUTER INC. +08-00-5F (hex) SABER TECHNOLOGY CORP. +08-00-60 (hex) INDUSTRIAL NETWORKING INC. +08-00-61 (hex) JAROGATE LTD. +08-00-62 (hex) GENERAL DYNAMICS +08-00-63 (hex) PLESSEY +08-00-64 (hex) AUTOPHON AG +08-00-65 (hex) GENRAD INC. +08-00-66 (hex) AGFA CORPORATION +08-00-67 (hex) COMDESIGN +08-00-68 (hex) RIDGE COMPUTERS +08-00-69 (hex) SILICON GRAPHICS INC. +08-00-6A (hex) ATT BELL LABORATORIES +08-00-6B (hex) ACCEL TECHNOLOGIES INC. +08-00-6C (hex) SUNTEK TECHNOLOGY INT'L +08-00-6D (hex) WHITECHAPEL COMPUTER WORKS +08-00-6E (hex) MASSCOMP +08-00-6F (hex) PHILIPS APELDOORN B.V. +08-00-70 (hex) MITSUBISHI ELECTRIC CORP. +08-00-71 (hex) MATRA (DSIE) +08-00-72 (hex) XEROX CORP UNIV GRANT PROGRAM +08-00-73 (hex) TECMAR INC. +08-00-74 (hex) CASIO COMPUTER CO. LTD. +08-00-75 (hex) DANSK DATA ELECTRONIK +08-00-76 (hex) PC LAN TECHNOLOGIES +08-00-77 (hex) TSL COMMUNICATIONS LTD. +08-00-78 (hex) ACCELL CORPORATION +08-00-79 (hex) THE DROID WORKS +08-00-7A (hex) INDATA +08-00-7B (hex) SANYO ELECTRIC CO. LTD. +08-00-7C (hex) VITALINK COMMUNICATIONS CORP. +08-00-7E (hex) AMALGAMATED WIRELESS(AUS) LTD +08-00-7F (hex) CARNEGIE-MELLON UNIVERSITY +08-00-80 (hex) AES DATA INC. +08-00-81 (hex) ,ASTECH INC. +08-00-82 (hex) VERITAS SOFTWARE +08-00-83 (hex) Seiko Instruments Inc. +08-00-84 (hex) TOMEN ELECTRONICS CORP. +08-00-85 (hex) ELXSI +08-00-86 (hex) KONICA MINOLTA HOLDINGS, INC. +08-00-87 (hex) XYPLEX +08-00-88 (hex) Brocade Communications Systems, Inc. +08-00-89 (hex) KINETICS +08-00-8A (hex) PERFORMANCE TECHNOLOGY +08-00-8B (hex) PYRAMID TECHNOLOGY CORP. +08-00-8C (hex) NETWORK RESEARCH CORPORATION +08-00-8D (hex) XYVISION INC. +08-00-8E (hex) TANDEM COMPUTERS +08-00-8F (hex) CHIPCOM CORPORATION +08-00-90 (hex) SONOMA SYSTEMS +08-14-43 (hex) UNIBRAIN S.A. +08-16-51 (hex) Shenzhen Sea Star Technology Co.,Ltd +08-18-4C (hex) A. S. Thomas, Inc. +08-1F-F3 (hex) Cisco Systems +08-2A-D0 (hex) SRD Innovations Inc. +08-4E-1C (hex) H2A Systems, LLC +08-76-18 (hex) ViE Technologies Sdn. Bhd. +08-76-95 (hex) Auto Industrial Co., Ltd. +08-BB-CC (hex) AK-NORD EDV VERTRIEBSGES. mbH +08-F2-F4 (hex) Net One Partners Co.,Ltd. +0C-17-F1 (hex) TELECSYS +0C-27-55 (hex) Valuable Techologies Limited +0C-60-76 (hex) Hon Hai Precision Ind. Co.,Ltd. +0C-7D-7C (hex) Kexiang Information Technology Co, Ltd. +0C-82-30 (hex) SHENZHEN MAGNUS TECHNOLOGIES CO.,LTD +0C-84-11 (hex) A.O. Smith Water Products +0C-A4-2A (hex) OB Telecom Electronic Technology Co., Ltd +0C-C3-A7 (hex) Meritec +0C-C9-C6 (hex) Samwin Hong Kong Limited +0C-D5-02 (hex) Westell +0C-D7-C2 (hex) Axium Technologies, Inc. +0C-E7-09 (hex) Fox Crypto B.V. +0C-E9-36 (hex) ELIMOS srl +0C-EE-E6 (hex) Hon Hai Precision Ind. Co.,Ltd. +0C-EF-7C (hex) AnaCom Inc +10-00-00 (hex) PRIVATE +10-00-5A (hex) IBM CORPORATION +10-00-E8 (hex) NATIONAL SEMICONDUCTOR +10-10-B6 (hex) McCain Inc +10-18-9E (hex) Elmo Motion Control +10-2D-96 (hex) Looxcie Inc. +10-43-69 (hex) Soundmax Electronic Limited +10-44-5A (hex) Shaanxi Hitech Electronic Co., LTD +10-45-F8 (hex) LNT-Automation GmbH +10-56-CA (hex) Peplink International Ltd. +10-62-C9 (hex) Adatis GmbH & Co. KG +10-65-A3 (hex) Panamax Inc. +10-88-0F (hex) DARUMA TELECOMUNICAÇÕES E INFORMÁTICA S/A +10-B7-F6 (hex) Plastoform Industries Ltd. +10-BA-A5 (hex) GANA I&C CO., LTD +10-C7-3F (hex) Midas Klark Teknik Ltd +10-CA-81 (hex) PRECIA +10-E6-AE (hex) Source Technologies, LLC +11-00-AA (hex) PRIVATE +14-6E-0A (hex) PRIVATE +14-A6-2C (hex) S.M. Dezac S.A. +14-A8-6B (hex) ShenZhen Telacom Science&Technology Co., Ltd +18-01-E3 (hex) Elektrobit Wireless Communications Ltd +18-17-14 (hex) DAEWOOIS +18-3B-D2 (hex) BYD Precision Manufacture Company Ltd. +18-86-AC (hex) Nokia Danmark A/S +18-A9-05 (hex) Hewlett Packard +18-C0-86 (hex) Broadcom Corporation +18-FC-9F (hex) Changhe Electronics Co., Ltd. +1C-0F-CF (hex) Sypro Optics GmbH +1C-12-9D (hex) IEEE PES PSRC/SUB +1C-4B-D6 (hex) AzureWave +1C-8F-8A (hex) Phase Motion Control SpA +1C-AF-F7 (hex) D-LINK INTERNATIONAL PTE LIMITED +1C-BD-B9 (hex) D-LINK INTERNATIONAL PTE LIMITED +1C-F0-61 (hex) SCAPS GmbH +20-12-57 (hex) Most Lucky Trading Ltd +20-21-A5 (hex) LG Electronics Inc +20-2C-B7 (hex) Kong Yue Electronics & Information Industry (Xinhui) Ltd. +20-41-5A (hex) Smarteh d.o.o. +20-46-F9 (hex) Advanced Network Devices (dba:AND) +20-4E-6B (hex) Axxana(israel) ltd +20-59-A0 (hex) Paragon Technologies Inc. +20-7C-8F (hex) Quanta Microsystems,Inc. +20-BF-DB (hex) DVL +24-21-AB (hex) Sony Ericsson Mobile Communications +24-82-8A (hex) Prowave Technologies Ltd. +24-BF-74 (hex) PRIVATE +24-CF-21 (hex) Shenzhen State Micro Technology Co., Ltd +24-D2-CC (hex) SmartDrive Systems Inc. +24-DB-AD (hex) ShopperTrak RCT Corporation +28-6E-D4 (hex) HUAWEI TECHNOLOGIES CO.,LTD +28-72-C5 (hex) Smartmatic Corp +28-E7-94 (hex) Microtime Computer Inc. +28-EF-01 (hex) PRIVATE +28-FB-D3 (hex) Shanghai RagenTek Communication Technology Co.,Ltd. +2C-06-23 (hex) Win Leader Inc. +2C-19-84 (hex) IDN Telecom, Inc. +2C-34-27 (hex) ERCO & GENER +2C-3A-28 (hex) Fagor Electr�nica +2C-6B-F5 (hex) Juniper networks +2C-81-58 (hex) Hon Hai Precision Ind. Co.,Ltd +2C-91-27 (hex) Eintechno Corporation +2C-A7-80 (hex) True Technologies Inc. +2C-A8-35 (hex) RIM +2C-CD-27 (hex) Precor Inc +30-32-D4 (hex) Hanilstm Co., Ltd. +30-37-A6 (hex) Cisco Systems +30-41-74 (hex) ALTEC LANSING LLC +30-46-9A (hex) NETGEAR +30-52-5A (hex) NST Co., LTD +30-7C-30 (hex) RIM +30-EF-D1 (hex) Alstom Strongwish (Shenzhen) Co., Ltd. +34-15-9E (hex) Apple, Inc +34-7E-39 (hex) Nokia Danmark A/S +34-86-2A (hex) Heinz Lackmann GmbH & Co KG +34-C3-AC (hex) Samsung Electronics +34-C6-9A (hex) Enecsys Ltd +34-CE-94 (hex) Parsec (Pty) Ltd +34-EF-44 (hex) 2Wire +34-EF-8B (hex) NTT Communications Corporation +38-22-9D (hex) PIRELLI BROADBAND SOLUTIONS +38-63-F6 (hex) 3NOD MULTIMEDIA(SHENZHEN)CO.,LTD +38-BB-23 (hex) OzVision America LLC +38-E7-D8 (hex) HTC Corporation +38-E8-DF (hex) b gmbh medien + datenbanken +38-E9-8C (hex) Reco S.p.A. +3C-05-AB (hex) Product Creation Studio +3C-1C-BE (hex) JADAK LLC +3C-2D-B7 (hex) Texas Instruments +3C-39-C3 (hex) JW Electronics Co., Ltd. +3C-4C-69 (hex) Infinity System S.L. +3C-B1-7F (hex) Wattwatchers Pty Ld +3C-DF-1E (hex) Cisco Systems +3C-E5-A6 (hex) Hangzhou H3C Technologies Co., Ltd. +3C-F5-2C (hex) DSPECIALISTS GmbH +3C-F7-2A (hex) Nokia Corporation +40-01-C6 (hex) 3COM EUROPE LTD +40-12-E4 (hex) Compass-EOS +40-15-97 (hex) Protect America, Inc. +40-25-C2 (hex) Intel Corporate +40-2B-A1 (hex) Sony Ericsson Mobile Communications AB +40-4A-03 (hex) ZyXEL Communications Corporation +40-61-86 (hex) MICRO-STAR INT'L CO.,LTD +40-8A-9A (hex) TITENG CO., Ltd. +40-95-58 (hex) Aisino Corporation +40-97-D1 (hex) BK Electronics cc +40-A6-A4 (hex) PassivSystems Ltd +40-D3-2D (hex) Apple, Inc +40-EC-F8 (hex) Siemens AG +40-EF-4C (hex) Fihonest communication co.,Ltd +40-F5-2E (hex) Leica Microsystems (Schweiz) AG +44-37-6F (hex) Young Electric Sign Co +44-4E-1A (hex) Samsung Electronics Co.,Ltd +44-56-8D (hex) PNC Technologies Co., Ltd. +44-56-B7 (hex) Spawn Labs, Inc +44-6C-24 (hex) Reallin Electronic Co.,Ltd +44-83-12 (hex) Star-Net +44-87-FC (hex) ELITEGROUP COMPUTER SYSTEM CO., LTD. +44-8E-81 (hex) VIG +44-A4-2D (hex) TCT Mobile Limited +44-C2-33 (hex) Guangzhou Comet Technology Development Co.Ltd +44-C9-A2 (hex) Greenwald Industries +44-E4-9A (hex) OMNITRONICS PTY LTD +44-F4-59 (hex) Samsung Electronics +48-34-3D (hex) IEP GmbH +48-44-87 (hex) Cisco SPVTG +48-5B-39 (hex) ASUSTek COMPUTER INC. +48-6F-D2 (hex) StorSimple Inc +48-71-19 (hex) SGB GROUP LTD. +48-AA-5D (hex) Store Electronic Systems +48-EB-30 (hex) ETERNA TECHNOLOGY, INC. +4C-32-2D (hex) TELEDATA NETWORKS +4C-4B-68 (hex) Mobile Device, Inc. +4C-63-EB (hex) Application Solutions (Electronics and Vision) Ltd +4C-9E-E4 (hex) Hanyang Navicom Co.,Ltd. +4C-C4-52 (hex) Shang Hai Tyd. Electon Technology Ltd. +4C-C6-02 (hex) Radios, Inc. +50-25-2B (hex) Nethra Imaging Incorporated +50-2A-7E (hex) Smart electronic GmbH +50-2A-8B (hex) Telekom Research and Development Sdn Bhd +50-2D-A2 (hex) Intel Corporate +50-2D-F4 (hex) Phytec Messtechnik GmbH +50-63-13 (hex) Hon Hai Precision Ind. Co.,Ltd. +50-93-4F (hex) Gradual Tecnologia Ltda. +50-A6-E3 (hex) David Clark Company +50-F0-03 (hex) Open Stack, Inc. +54-03-F5 (hex) EBN Technology Corp. +54-42-49 (hex) Sony Corporation +54-5F-A9 (hex) Teracom Limited +54-7F-EE (hex) Cisco Systems +54-92-BE (hex) Samsung Electronics Co.,Ltd +54-9A-16 (hex) Uzushio Electric Co.,Ltd. +54-B6-20 (hex) SUHDOL E&C Co.Ltd. +54-D4-6F (hex) Cisco SPVTG +58-05-56 (hex) Elettronica GF S.r.L. +58-3C-C6 (hex) Omneality Ltd. +58-49-BA (hex) Chitai Electronic Corp. +58-4C-EE (hex) Digital One Technologies, Limited +58-50-E6 (hex) Best Buy Corporation +58-6E-D6 (hex) PRIVATE +58-B0-35 (hex) Apple, Inc +58-F6-7B (hex) Xia Men UnionCore Technology LTD. +5C-14-37 (hex) Thyssenkrupp Aufzugswerke GmbH +5C-33-8E (hex) Alpha Networkc Inc. +5C-35-DA (hex) There Corporation Oy +5C-57-C8 (hex) Nokia Corporation +5C-87-78 (hex) Cybertelbridge co.,ltd +5C-E2-23 (hex) Delphin Technology AG +5C-E2-86 (hex) Nortel Networks +5C-FF-35 (hex) Wistron Corporation +60-1D-0F (hex) Midnite Solar +60-38-0E (hex) Alps Electric Co., +60-39-1F (hex) ABB Ltd +60-89-B7 (hex) KAEL M�HENDISLIK ELEKTRONIK TICARET SANAYI Limited �irketi +60-8D-17 (hex) Sentrus Government Systems Division, Inc +60-9F-9D (hex) CloudSwitch +60-B3-C4 (hex) Elber Srl +60-D0-A9 (hex) Samsung Electronics Co.,Ltd +60-D3-0A (hex) Quatius Limited +60-F1-3D (hex) JABLOCOM s.r.o. +60-FB-42 (hex) Apple, Inc +64-16-8D (hex) Cisco Systems +64-16-F0 (hex) Shehzhen Huawei Communication Technologies Co., Ltd. +64-4B-C3 (hex) Shanghai WOASiS Telecommunications Ltd., Co. +64-4F-74 (hex) LENUS Co., Ltd. +64-65-C0 (hex) Nuvon, Inc +64-68-0C (hex) COMTREND +64-6E-6C (hex) Radio Datacom LLC +64-7D-81 (hex) YOKOTA INDUSTRIAL CO,.LTD +64-A8-37 (hex) Juni Korea Co., Ltd +64-B9-E8 (hex) Apple, Inc +64-BC-11 (hex) CombiQ AB +64-C6-AF (hex) AXERRA Networks Ltd +64-D4-DA (hex) Intel Corporate +64-DB-18 (hex) OpenPattern +64-ED-57 (hex) Motorola MDb/Broadband +64-F9-70 (hex) Kenade Electronics Technology Co.,LTD. +68-1F-D8 (hex) Advanced Telemetry +68-79-24 (hex) ELS-GmbH & Co. KG +68-7F-74 (hex) Cisco-Linksys, LLC +68-85-40 (hex) IGI Mobile, Inc. +68-A1-B7 (hex) Honghao Mingchuan Technology (Beijing) CO.,Ltd. +68-AA-D2 (hex) DATECS LTD., +68-CC-9C (hex) Mine Site Technologies +68-EF-BD (hex) Cisco Systems +6C-0E-0D (hex) Sony Ericsson Mobile Communications AB +6C-0F-6A (hex) JDC Tech Co., Ltd. +6C-18-11 (hex) Decatur Electronics +6C-32-DE (hex) Indieon Technologies Pvt. Ltd. +6C-5E-7A (hex) Ubiquitous Internet Telecom Co., Ltd +6C-6F-18 (hex) Stereotaxis, Inc. +6C-8C-DB (hex) Otus Technologies Ltd +6C-AC-60 (hex) Venetex Corp +6C-BE-E9 (hex) Alcatel-Lucent-IPD +6C-D6-8A (hex) LG Electronics Inc +6C-F0-49 (hex) GIGA-BYTE TECHNOLOGY CO.,LTD. +6C-FD-B9 (hex) Proware Technologies Co Ltd. +6C-FF-BE (hex) MPB Communications Inc. +70-1A-04 (hex) Liteon Tech Corp. +70-1A-ED (hex) ADVAS CO., LTD. +70-2B-1D (hex) E-Domus International Limited +70-2F-97 (hex) Aava Mobile Oy +70-3C-39 (hex) SEAWING Kft +70-58-12 (hex) Panasonic AVC Networks Company +70-5A-B6 (hex) COMPAL INFORMATION (KUNSHAN) CO., LTD. +70-72-CF (hex) EdgeCore Networks +70-82-8E (hex) OleumTech Corporation +70-D5-E7 (hex) Wellcore Corporation +70-D8-80 (hex) Upos System sp. z o.o. +70-F1-A1 (hex) Liteon Technology Corporation +74-32-56 (hex) NT-ware Systemprg GmbH +74-6B-82 (hex) MOVEK +74-7E-1A (hex) Red Embedded Design Limited +74-D8-50 (hex) Evrisko Systems +74-E5-37 (hex) RADSPIN +74-F0-7D (hex) BnCOM Co.,Ltd +74-F7-26 (hex) Neuron Robotics +78-12-B8 (hex) ORANTEK LIMITED +78-19-2E (hex) NASCENT Technology +78-1D-BA (hex) HUAWEI TECHNOLOGIES CO.,LTD +78-25-AD (hex) SAMSUNG ELECTRONICS CO., LTD. +78-30-E1 (hex) UltraClenz, LLC +78-44-76 (hex) Zioncom technology co.,ltd +78-5C-72 (hex) Hioso Technology Co., Ltd. +78-7F-62 (hex) GiK mbH +78-92-9C (hex) Intel Corporate +78-99-8F (hex) MEDILINE ITALIA SRL +78-B8-1A (hex) INTER SALES A/S +78-C4-0E (hex) H&D Wireless +78-DD-08 (hex) Hon Hai Precision Ind. Co.,Ltd. +78-E7-D1 (hex) Hewlett Packard +7C-08-D9 (hex) Shanghai Engineering Research Center for Broadband Technologies and Applications +7C-14-76 (hex) AE Partners S.a.s +7C-1E-B3 (hex) 2N TELEKOMUNIKACE a.s. +7C-20-64 (hex) Alcatel Lucent IPD +7C-2C-F3 (hex) Secure Electrans Ltd +7C-2F-80 (hex) Gigaset Communications GmbH +7C-3B-D5 (hex) Imago Group +7C-6C-8F (hex) AMS NEVE LTD +7C-6D-62 (hex) Apple, Inc +7C-6F-06 (hex) Caterpillar Trimble Control Technologies +7C-76-73 (hex) ENMAS GmbH +7C-7B-E4 (hex) Z'SEDAI KENKYUSHO CORPORATION +7C-CB-0D (hex) Aaxeon Technologies Inc. +7C-CF-CF (hex) Shanghai SEARI Intelligent System Co., Ltd +80-00-10 (hex) ATT BELL LABORATORIES +80-17-7D (hex) Nortel Networks +80-38-FD (hex) LeapFrog Enterprises, Inc. +80-3B-9A (hex) ghe-ces electronic ag +80-71-1F (hex) Juniper Networks +80-81-A5 (hex) TONGQING COMMUNICATION EQUIPMENT (SHENZHEN) Co.,Ltd +80-91-2A (hex) Lih Rong electronic Enterprise Co., Ltd. +80-B2-89 (hex) Forworld Electronics Ltd. +80-BA-AC (hex) TeleAdapt Ltd +80-C8-62 (hex) Openpeak, Inc +80-F5-93 (hex) IRCO Sistemas de Telecomunicaci�n S.A. +84-21-41 (hex) Shenzhen Ginwave Technologies Ltd. +84-48-23 (hex) WOXTER TECHNOLOGY Co. Ltd +84-90-00 (hex) Arnold & Richter Cine Technik +88-43-E1 (hex) Cisco Systems +88-4B-39 (hex) Siemens AG, Healthcare Sector +88-91-DD (hex) Racktivity +88-94-F9 (hex) Gemicom Technology, Inc. +88-98-21 (hex) TERAON +88-A5-BD (hex) QPCOM INC. +88-B6-27 (hex) Gembird Europe BV +88-BA-7F (hex) Qfiednet Co., Ltd. +88-ED-1C (hex) Cudo Communication Co., Ltd. +88-FD-15 (hex) LINEEYE CO., LTD +8C-56-C5 (hex) Nintendo Co., Ltd. +8C-59-8B (hex) C Technologies AB +8C-64-0B (hex) BS Storitve d.o.o. +8C-73-6E (hex) Fujitsu Limited +8C-92-36 (hex) Aus.Linx Technology Co., Ltd. +8C-A9-82 (hex) Intel Corporate +90-18-AE (hex) Shanghai Meridian Technologies, Co. Ltd. +90-3D-6B (hex) Zicon Technology Corp. +90-47-16 (hex) RORZE CORPORATION +90-4C-E5 (hex) Hon Hai Precision Ind. Co.,Ltd. +90-6D-C8 (hex) DLG Automação Industrial Ltda +90-7F-61 (hex) Chicony Electronics Co., Ltd. +90-84-0D (hex) Apple, Inc +90-A2-DA (hex) GHEO SA +90-A7-C1 (hex) Pakedge Device and Software Inc. +90-E6-BA (hex) ASUSTek COMPUTER INC. +90-FB-A6 (hex) Hon Hai Precision Ind.Co.Ltd +94-0C-6D (hex) TP-LINK Technologies Co.,Ltd. +94-23-6E (hex) Shenzhen Junlan Electronic Ltd +94-2E-63 (hex) Finsécur +94-44-52 (hex) Belkin International, Inc. +94-59-2D (hex) EKE Building Technology Systems Ltd +94-BA-31 (hex) Visiontec da Amazônia Ltda. +94-C4-E9 (hex) PowerLayer Microsystems HongKong Limited +94-F6-92 (hex) Geminico co.,Ltd. +98-6D-C8 (hex) TOSHIBA MITSUBISHI-ELECTRIC INDUSTRIAL SYSTEMS CORPORATION +98-89-ED (hex) Anadem Information Inc. +98-8B-5D (hex) SAGEM COMMUNICATION +98-BC-99 (hex) Edeltech Co.,Ltd. +98-D8-8C (hex) Nortel Networks +9C-18-74 (hex) Nokia Danmark A/S +9C-4E-8E (hex) ALT Systems Ltd +9C-55-B4 (hex) I.S.E. S.r.l. +9C-5B-96 (hex) NMR Corporation +9C-5E-73 (hex) Calibre UK Ltd +9C-AF-CA (hex) Cisco Systems +9C-B2-06 (hex) PROCENTEC +9C-C0-77 (hex) PrintCounts, LLC +9C-CD-82 (hex) CHENG UEI PRECISION INDUSTRY CO.,LTD +9C-EB-E8 (hex) BizLink (Kunshan) Co.,Ltd +A0-07-98 (hex) Samsung Electronics +A0-18-59 (hex) Shenzhen Yidashi Electronics Co Ltd +A0-23-1B (hex) TeleComp R&D Corp. +A0-2E-F3 (hex) United Integrated Services Co., Led. +A0-3A-75 (hex) PSS Belgium N.V. +A0-40-25 (hex) Actioncable, Inc. +A0-59-3A (hex) V.D.S. Video Display Systems srl +A0-5D-C1 (hex) TMCT Co., LTD. +A0-5D-E7 (hex) DIRECTV, Inc. +A0-69-86 (hex) Wellav Technologies Ltd +A0-6A-00 (hex) Verilink Corporation +A0-73-32 (hex) Cashmaster International Limited +A0-98-05 (hex) OpenVox Communication Co Ltd +A0-98-ED (hex) Shandong Intelligent Optical Communication Development Co., Ltd. +A0-9A-5A (hex) Time Domain +A0-B9-ED (hex) Skytap +A0-BF-A5 (hex) CORESYS +A4-38-FC (hex) Plastic Logic +A4-79-E4 (hex) KLINFO Corp +A4-AD-00 (hex) Ragsdale Technology +A4-AD-B8 (hex) Vitec Group, Camera Dynamics Ltd +A4-B1-21 (hex) Arantia 2010 S.L. +A4-B1-EE (hex) H. ZANDER GmbH & Co. KG +A4-BA-DB (hex) Dell Inc. +A4-C2-AB (hex) Hangzhou LEAD-IT Information & Technology Co.,Ltd +A4-DA-3F (hex) Bionics Corp. +A4-DE-50 (hex) Total Walther GmbH +A4-E7-E4 (hex) Connex GmbH +A4-ED-4E (hex) Motorola Mobile Devices +A8-63-DF (hex) DISPL�AIRE CORPORATION +A8-70-A5 (hex) UniComm Inc. +A8-7B-39 (hex) Nokia Corporation +A8-7E-33 (hex) Nokia Danmark A/S +A8-93-E6 (hex) JIANGXI JINGGANGSHAN CKING COMMUNICATION TECHNOLOGY CO.,LTD +A8-99-5C (hex) aizo ag +A8-C2-22 (hex) TM-Research Inc. +A8-CB-95 (hex) EAST BEST CO., LTD. +A8-CE-90 (hex) CVC +A8-E3-EE (hex) Sony Computer Entertainment Inc. +A8-F2-74 (hex) Samsung Electronics +A8-F4-70 (hex) Fujian Newland Communication Science Technologies Co.,Ltd. +A8-F9-4B (hex) Eltex Enterprise Ltd. +AA-00-00 (hex) DIGITAL EQUIPMENT CORPORATION +AA-00-01 (hex) DIGITAL EQUIPMENT CORPORATION +AA-00-02 (hex) DIGITAL EQUIPMENT CORPORATION +AA-00-03 (hex) DIGITAL EQUIPMENT CORPORATION +AA-00-04 (hex) DIGITAL EQUIPMENT CORPORATION +AC-44-F2 (hex) Revolabs Inc +AC-58-3B (hex) Human Assembler, Inc. +AC-67-06 (hex) Ruckus Wireless +AC-83-17 (hex) Shenzhen Furtunetel Communication Co., Ltd +AC-86-7E (hex) Create New Technology (HK) Limited Company +AC-BE-B6 (hex) Visualedge Technology Co., Ltd. +AC-CE-8F (hex) HWA YAO TECHNOLOGIES CO., LTD +AC-D1-80 (hex) Crexendo Business Solutions, Inc. +AC-DE-48 (hex) PRIVATE +AC-E3-48 (hex) MadgeTech, Inc +AC-E9-AA (hex) Hay Systems Ltd +AC-EA-6A (hex) GENIX INFOCOMM CO., LTD. +B0-5B-1F (hex) THERMO FISHER SCIENTIFIC S.P.A. +B0-90-74 (hex) Fulan Electronics Limited +B0-91-34 (hex) Taleo +B0-97-3A (hex) E-Fuel Corporation +B0-AA-36 (hex) GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD. +B0-C6-9A (hex) Juniper Networks +B0-C8-AD (hex) People Power Company +B0-E7-54 (hex) 2Wire +B0-E9-7E (hex) Advanced Micro Peripherals +B4-08-32 (hex) TC Communications +B4-2C-BE (hex) Direct Payment Solutions Limited +B4-41-7A (hex) ShenZhen Gongjin Electronics Co.,Ltd +B4-58-61 (hex) CRemote, LLC +B4-82-FE (hex) Askey Computer Corp +B4-B5-AF (hex) Minsung Electronics +B4-ED-54 (hex) Wohler Technologies +B8-64-91 (hex) CK Telecom Ltd +B8-65-3B (hex) Bolymin, Inc. +B8-94-D2 (hex) Retail Innovation HTT AB +B8-A3-E0 (hex) BenRui Technology Co.,Ltd +B8-AC-6F (hex) Dell Inc +B8-B1-C7 (hex) BT&COM CO.,LTD +B8-F7-32 (hex) Aryaka Networks Inc +BC-05-43 (hex) AVM GmbH +BC-4E-3C (hex) CORE STAFF CO., LTD. +BC-9D-A5 (hex) DASCOM Europe GmbH +BC-B1-81 (hex) SHARP CORPORATION +BC-D5-B6 (hex) d2d technologies +C0-1E-9B (hex) Pixavi AS +C0-22-50 (hex) PRIVATE +C0-38-F9 (hex) Nokia Danmark A/S +C0-3F-0E (hex) NETGEAR +C0-6C-0F (hex) Dobbs Stanford +C0-91-34 (hex) ProCurve Networking by HP +C0-9C-92 (hex) COBY +C0-BA-E6 (hex) Application Solutions (Safety and Security) Ltd +C0-E4-22 (hex) Texas Instruments +C4-17-FE (hex) Hon Hai Precision Ind. Co.,Ltd. +C4-19-8B (hex) Dominion Voting Systems Corporation +C4-1E-CE (hex) HMI Sources Ltd. +C4-59-76 (hex) Fugoo +C4-7D-4F (hex) Cisco Systems +C4-AA-A1 (hex) SUMMIT DEVELOPMENT, spol.s r.o. +C4-E1-7C (hex) U2S co. +C4-FC-E4 (hex) DishTV NZ Ltd +C8-0A-A9 (hex) Quanta Computer Inc. +C8-2E-94 (hex) Halfa Enterprise Co., Ltd. +C8-3A-35 (hex) Tenda Technology Co., Ltd. +C8-6C-1E (hex) Display Systems Ltd +C8-6C-B6 (hex) Optcom Co., Ltd. +C8-72-48 (hex) Aplicom Oy +C8-7E-75 (hex) Samsung Electronics Co.,Ltd +C8-87-3B (hex) Net Optics +C8-97-9F (hex) Nokia Corporation +C8-AA-CC (hex) PRIVATE +C8-C1-3C (hex) RuggedTek Hangzhou Co., Ltd +C8-D1-D1 (hex) AGAiT Technology Corporation +C8-D2-C1 (hex) Jetlun (Shenzhen) Corporation +CC-00-80 (hex) TRUST SYSTEM Co., +CC-22-18 (hex) InnoDigital Co., Ltd. +CC-50-76 (hex) Ocom Communications, Inc. +CC-54-59 (hex) OnTime Networks AS +CC-69-B0 (hex) Global Traffic Technologies, LLC +CC-B8-88 (hex) AnB Securite s.a. +CC-CC-4E (hex) Sun Fountainhead USA. Corp +CC-EA-1C (hex) DCONWORKS Co., Ltd +D0-37-61 (hex) Texas Instruments +D0-58-75 (hex) Active Control Technology Inc. +D0-B3-3F (hex) SHENZHEN TINNO MOBILE TECHNOLOGY CO.,LTD. +D0-D2-86 (hex) Beckman Coulter Biomedical K.K. +D0-E4-0B (hex) Wearable Inc. +D0-F0-DB (hex) Ericsson +D4-11-D6 (hex) ShotSpotter, Inc. +D4-1F-0C (hex) TVI Vision Oy +D4-4C-A7 (hex) Informtekhnika & Communication, LLC +D4-6C-BF (hex) Goodrich ISR +D4-82-3E (hex) Argosy Technologies, Ltd. +D4-9A-20 (hex) Apple, Inc +D4-9C-28 (hex) JayBird Gear LLC +D4-AA-FF (hex) MICRO WORLD +D4-C7-66 (hex) Acentic GmbH +D4-F1-43 (hex) IPROAD.,Inc +D8-1B-FE (hex) TWINLINX CORPORATION +D8-28-C9 (hex) General Electric Consumer and Industrial +D8-42-AC (hex) FreeComm Data Communication Co.,Ltd. +D8-54-3A (hex) Texas Instruments +D8-AE-90 (hex) Itibia Technologies +D8-C3-FB (hex) DETRACOM +D8-D3-85 (hex) Hewlett Packard +D8-D6-7E (hex) GSK CNC EQUIPMENT CO.,LTD +D8-E7-2B (hex) OnPATH Technologies +DC-02-65 (hex) Meditech Kft +DC-1D-9F (hex) U & B tech +DC-2C-26 (hex) Iton Technology Limited +DC-33-50 (hex) TechSAT GmbH +DC-49-C9 (hex) CASCO SIGNAL LTD +DC-A9-71 (hex) Intel Corporate +DC-E2-AC (hex) Lumens Digital Optics Inc. +DC-E7-1C (hex) AUG Elektronik GmbH +E0-26-30 (hex) Intrigue Technologies, Inc. +E0-26-36 (hex) Nortel Networks +E0-64-BB (hex) DigiView S.r.l. +E0-8F-EC (hex) REPOTEC CO., LTD. +E0-91-53 (hex) XAVi Technologies Corp. +E0-AB-FE (hex) Orb Networks, Inc. +E0-BC-43 (hex) C2 Microsystems, Inc. +E0-CA-4D (hex) Shenzhen Unistar Communication Co.,LTD +E0-CB-4E (hex) ASUSTek COMPUTER INC. +E0-E7-51 (hex) Nintendo Co., Ltd. +E4-1F-13 (hex) IBM +E4-35-93 (hex) Hangzhou GoTo technology Co.Ltd +E4-75-1E (hex) Getinge Sterilization AB +E4-97-F0 (hex) Shanghai VLC Technologies Ltd. Co. +E4-FF-DD (hex) ELECTRON INDIA +E8-05-6D (hex) Nortel Networks +E8-0B-13 (hex) Akib Systems Taiwan, INC +E8-3A-97 (hex) OCZ Technology Group +E8-4E-CE (hex) Nintendo Co., Ltd. +E8-5E-53 (hex) Infratec Datentechnik GmbH +E8-9D-87 (hex) Toshiba +E8-A4-C1 (hex) Deep Sea Electronics PLC +E8-DA-AA (hex) VideoHome Technology Corp. +E8-DF-F2 (hex) PRF Co., Ltd. +E8-E1-E2 (hex) Energotest +E8-E7-76 (hex) Shenzhen Kootion Technology Co., Ltd +E8-F2-01 (hex) NEC AccessTechnica, Ltd. +EC-30-91 (hex) Cisco Systems +EC-43-E6 (hex) AWCER Ltd. +EC-44-76 (hex) Cisco Systems +EC-6C-9F (hex) Chengdu Volans Technology CO.,LTD +EC-8E-AD (hex) DLX +EC-9B-5B (hex) Nokia Corporation +EC-C8-82 (hex) Cisco Systems +EC-CD-6D (hex) Allied Telesis, Inc. +EC-D0-0E (hex) MiraeRecognition Co., Ltd. +EC-DE-3D (hex) Lamprey Networks, Inc. +EC-E9-F8 (hex) Guang Zhou TRI-SUN Electronics Technology Co., Ltd +F0-24-08 (hex) Talaris (Sweden) AB +F0-26-4C (hex) Dr. Sigrist AG +F0-2F-D8 (hex) Bi2-Vision +F0-43-35 (hex) DVN(Shanghai)Ltd. +F0-4B-F2 (hex) JTECH Communications, Inc. +F0-62-81 (hex) ProCurve Networking by HP +F0-68-53 (hex) Integrated Corporation +F0-77-D0 (hex) Xcellen +F0-7B-CB (hex) Hon Hai Precision Ind. Co.,Ltd. +F0-B6-EB (hex) Poslab Technology Co., Ltd. +F0-BC-C8 (hex) MaxID (Pty) Ltd +F0-C2-4C (hex) Zhejiang FeiYue Digital Technology Co., Ltd +F0-DE-71 (hex) Shanghai EDO Technologies Co.,Ltd. +F0-EC-39 (hex) Essec +F4-0B-93 (hex) Research In Motion +F4-45-ED (hex) Portable Innovation Technology Ltd. +F4-5F-F7 (hex) DQ Technology Inc. +F4-63-49 (hex) Diffon Corporation +F4-76-26 (hex) Viltechmeda UAB +F4-AC-C1 (hex) Cisco Systems +F4-CE-46 (hex) Hewlett Packard +F4-FC-32 (hex) Texas Instruments +F8-1E-DF (hex) Apple, Inc +F8-47-2D (hex) X2gen Digital Corp. Ltd +F8-52-DF (hex) VNL Europe AB +F8-71-FE (hex) The Goldman Sachs Group, Inc. +F8-81-1A (hex) S2IH +F8-8D-EF (hex) Tenebraex +F8-91-2A (hex) GLP German Light Products GmbH +F8-DC-7A (hex) Variscite LTD +F8-E9-68 (hex) Egker Kft. +FC-08-77 (hex) Prentke Romich Company +FC-44-63 (hex) Universal Audio +FC-61-98 (hex) NEC Personal Products, Ltd +FC-68-3E (hex) Directed Perception, Inc +FC-CC-E4 (hex) Ascon Ltd. +FC-CF-62 (hex) BLADE Network Technology +FC-E1-92 (hex) Sichuan Jinwangtong Electronic Science&Technology Co,.Ltd +FC-FA-F7 (hex) Shanghai Baud Data Communication Co.,Ltd. +FC-FB-FB (hex) Cisco Systems diff --git a/doctrine/data/sql/inex-schema.sql b/doctrine/data/sql/inex-schema.sql new file mode 100644 index 000000000..3d93fd742 --- /dev/null +++ b/doctrine/data/sql/inex-schema.sql @@ -0,0 +1,652 @@ +-- MySQL dump 10.11 +-- +-- Host: localhost Database: inex +-- ------------------------------------------------------ +-- Server version 5.0.67-log + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `bgpsessiondata` +-- + +DROP TABLE IF EXISTS `bgpsessiondata`; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +CREATE TABLE `bgpsessiondata` ( + `id` int(10) unsigned NOT NULL auto_increment, + `srcipv4addressid` int(10) unsigned default NULL, + `dstipv4addressid` int(10) unsigned default NULL, + `packetcount` int(10) unsigned default NULL, + `timestamp` datetime default NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM AUTO_INCREMENT=803044 DEFAULT CHARSET=latin1; +SET character_set_client = @saved_cs_client; + +-- +-- Table structure for table `cabinet` +-- + +DROP TABLE IF EXISTS `cabinet`; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +CREATE TABLE `cabinet` ( + `id` int(10) unsigned NOT NULL auto_increment, + `locationid` int(10) unsigned NOT NULL default '0', + `name` varchar(255) NOT NULL default '', + `cololocation` varchar(255) NOT NULL default '', + `height` int(11) NOT NULL default '0', + `type` varchar(255) NOT NULL default '', + `notes` mediumtext NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; +SET character_set_client = @saved_cs_client; + +-- +-- Table structure for table `consoleserverconnection` +-- + +DROP TABLE IF EXISTS `consoleserverconnection`; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +CREATE TABLE `consoleserverconnection` ( + `id` int(10) unsigned NOT NULL auto_increment, + `description` varchar(255) default NULL, + `custid` int(10) unsigned NOT NULL, + `port` varchar(255) default NULL, + `switchid` int(10) unsigned NOT NULL, + `speed` int(10) unsigned default NULL, + `parity` int(10) unsigned default NULL, + `stopbits` int(10) unsigned default NULL, + `flowcontrol` int(10) unsigned default NULL, + `autobaud` tinyint(4) default NULL, + `notes` mediumtext, + PRIMARY KEY (`id`) +) ENGINE=MyISAM AUTO_INCREMENT=23 DEFAULT CHARSET=latin1; +SET character_set_client = @saved_cs_client; + +-- +-- Table structure for table `consoleserverconnection_seq` +-- + +DROP TABLE IF EXISTS `consoleserverconnection_seq`; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +CREATE TABLE `consoleserverconnection_seq` ( + `id` int(10) unsigned NOT NULL auto_increment, + PRIMARY KEY (`id`) +) ENGINE=MyISAM AUTO_INCREMENT=23 DEFAULT CHARSET=latin1; +SET character_set_client = @saved_cs_client; + +-- +-- Table structure for table `contact` +-- + +DROP TABLE IF EXISTS `contact`; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +CREATE TABLE `contact` ( + `custid` int(10) unsigned NOT NULL default '0', + `name` varchar(64) NOT NULL default '', + `email` varchar(64) default NULL, + `phone` varchar(32) default NULL, + `mobile` varchar(32) default NULL, + `facilityaccess` tinyint(3) unsigned NOT NULL default '1', + `mayauthorize` tinyint(3) unsigned NOT NULL default '0', + `lastupdated` datetime default NULL, + `lastupdatedby` int(11) default NULL, + `creator` varchar(32) default 'Operations', + `created` datetime default NULL, + `id` int(10) unsigned NOT NULL auto_increment, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=336 DEFAULT CHARSET=utf8; +SET character_set_client = @saved_cs_client; + +-- +-- Table structure for table `contact_seq` +-- + +DROP TABLE IF EXISTS `contact_seq`; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +CREATE TABLE `contact_seq` ( + `id` int(10) unsigned NOT NULL auto_increment, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; +SET character_set_client = @saved_cs_client; + +-- +-- Table structure for table `cust` +-- + +DROP TABLE IF EXISTS `cust`; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +CREATE TABLE `cust` ( + `name` varchar(255) NOT NULL default '', + `type` int(10) unsigned default NULL, + `shortname` varchar(255) NOT NULL default '', + `autsys` int(10) unsigned NOT NULL default '0', + `maxprefixes` int(10) unsigned default NULL, + `peeringemail` varchar(64) NOT NULL default '', + `nocphone` varchar(255) default NULL, + `noc24hphone` varchar(255) default NULL, + `nocfax` varchar(40) default NULL, + `nocemail` varchar(40) default NULL, + `nochours` varchar(40) NOT NULL default '24x7', + `nocwww` varchar(255) default NULL, + `peeringmacro` varchar(255) NOT NULL default '', + `peeringpolicy` varchar(255) default NULL, + `billingContact` varchar(64) default NULL, + `billingAddress1` varchar(64) default NULL, + `billingAddress2` varchar(64) default NULL, + `billingCity` varchar(64) default NULL, + `billingCountry` char(2) default NULL, + `corpwww` varchar(255) default NULL, + `datejoin` date default NULL, + `dateleave` date default NULL, + `status` tinyint(4) default NULL, + `activepeeringmatrix` tinyint(4) NOT NULL default '1', + `notes` mediumtext, + `lastupdated` datetime default NULL, + `lastupdatedby` int(11) default NULL, + `creator` varchar(32) default 'Operations', + `created` datetime default NULL, + `id` int(10) unsigned NOT NULL auto_increment, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=68 DEFAULT CHARSET=utf8; +SET character_set_client = @saved_cs_client; + +-- +-- Table structure for table `cust_seq` +-- + +DROP TABLE IF EXISTS `cust_seq`; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +CREATE TABLE `cust_seq` ( + `id` int(10) unsigned NOT NULL auto_increment, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=68 DEFAULT CHARSET=utf8; +SET character_set_client = @saved_cs_client; + +-- +-- Table structure for table `custkit` +-- + +DROP TABLE IF EXISTS `custkit`; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +CREATE TABLE `custkit` ( + `id` int(10) unsigned NOT NULL auto_increment, + `name` varchar(255) NOT NULL default '', + `custid` int(10) unsigned NOT NULL default '0', + `cabinetid` int(10) unsigned NOT NULL default '0', + `descr` mediumtext NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +SET character_set_client = @saved_cs_client; + +-- +-- Table structure for table `ipv4address` +-- + +DROP TABLE IF EXISTS `ipv4address`; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +CREATE TABLE `ipv4address` ( + `id` int(10) unsigned NOT NULL auto_increment, + `address` varchar(16) NOT NULL, + `vlanid` int(10) unsigned default NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `address` (`address`) +) ENGINE=InnoDB AUTO_INCREMENT=377 DEFAULT CHARSET=utf8; +SET character_set_client = @saved_cs_client; + +-- +-- Table structure for table `ipv6address` +-- + +DROP TABLE IF EXISTS `ipv6address`; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +CREATE TABLE `ipv6address` ( + `id` int(10) unsigned NOT NULL auto_increment, + `address` varchar(40) NOT NULL, + `vlanid` int(10) unsigned default NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `address` (`address`) +) ENGINE=InnoDB AUTO_INCREMENT=1309 DEFAULT CHARSET=utf8; +SET character_set_client = @saved_cs_client; + +-- +-- Table structure for table `location` +-- + +DROP TABLE IF EXISTS `location`; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +CREATE TABLE `location` ( + `id` int(10) unsigned NOT NULL default '0', + `name` varchar(255) NOT NULL default '', + `shortname` varchar(255) default NULL, + `address` varchar(255) NOT NULL default '', + `nocphone` varchar(255) NOT NULL default '', + `nocfax` varchar(255) NOT NULL default '', + `nocemail` varchar(255) NOT NULL default '', + `officephone` varchar(255) NOT NULL default '', + `officefax` varchar(255) NOT NULL default '', + `officeemail` varchar(255) NOT NULL default '', + `notes` blob, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +SET character_set_client = @saved_cs_client; + +-- +-- Table structure for table `networkinfo` +-- + +DROP TABLE IF EXISTS `networkinfo`; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +CREATE TABLE `networkinfo` ( + `id` int(10) unsigned NOT NULL auto_increment, + `vlanid` int(10) unsigned NOT NULL, + `protocol` tinyint(3) unsigned NOT NULL, + `network` varchar(255) NOT NULL, + `masklen` tinyint(4) default NULL, + `rs1address` varchar(40) default NULL, + `rs2address` varchar(40) default NULL, + `dnsfile` varchar(255) default NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM AUTO_INCREMENT=9 DEFAULT CHARSET=latin1; +SET character_set_client = @saved_cs_client; + +-- +-- Table structure for table `physicalinterface` +-- + +DROP TABLE IF EXISTS `physicalinterface`; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +CREATE TABLE `physicalinterface` ( + `id` int(10) unsigned NOT NULL auto_increment, + `switchportid` int(10) unsigned NOT NULL, + `virtualinterfaceid` int(10) unsigned default NULL, + `status` int(10) unsigned NOT NULL, + `speed` int(10) unsigned NOT NULL, + `duplex` varchar(16) NOT NULL, + `monitorindex` int(10) unsigned NOT NULL, + `notes` mediumtext, + PRIMARY KEY (`id`), + KEY `virtualinterfaceid` (`virtualinterfaceid`) +) ENGINE=InnoDB AUTO_INCREMENT=164 DEFAULT CHARSET=utf8; +SET character_set_client = @saved_cs_client; + +-- +-- Table structure for table `physicalinterface_seq` +-- + +DROP TABLE IF EXISTS `physicalinterface_seq`; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +CREATE TABLE `physicalinterface_seq` ( + `id` int(10) unsigned NOT NULL auto_increment, + PRIMARY KEY (`id`) +) ENGINE=MyISAM AUTO_INCREMENT=32 DEFAULT CHARSET=latin1; +SET character_set_client = @saved_cs_client; + +-- +-- Table structure for table `switch` +-- + +DROP TABLE IF EXISTS `switch`; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +CREATE TABLE `switch` ( + `id` int(10) unsigned NOT NULL auto_increment, + `name` varchar(255) NOT NULL default '', + `cabinetid` int(10) unsigned NOT NULL default '0', + `ipv4addr` varchar(255) NOT NULL default '', + `ipv6addr` varchar(255) NOT NULL default '', + `snmppasswd` varchar(255) NOT NULL default '', + `switchtype` int(10) unsigned default NULL, + `vendorid` int(10) unsigned NOT NULL default '0', + `model` varchar(255) NOT NULL default '', + `notes` mediumtext NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8; +SET character_set_client = @saved_cs_client; + +-- +-- Table structure for table `switch_seq` +-- + +DROP TABLE IF EXISTS `switch_seq`; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +CREATE TABLE `switch_seq` ( + `id` int(10) unsigned NOT NULL auto_increment, + PRIMARY KEY (`id`) +) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=latin1; +SET character_set_client = @saved_cs_client; + +-- +-- Table structure for table `switchport` +-- + +DROP TABLE IF EXISTS `switchport`; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +CREATE TABLE `switchport` ( + `id` int(10) unsigned NOT NULL auto_increment, + `switchid` int(10) unsigned NOT NULL default '0', + `name` varchar(255) NOT NULL default '', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=380 DEFAULT CHARSET=utf8; +SET character_set_client = @saved_cs_client; + +-- +-- Table structure for table `user` +-- + +DROP TABLE IF EXISTS `user`; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +CREATE TABLE `user` ( + `username` varchar(30) NOT NULL default '', + `password` varchar(30) NOT NULL default '', + `email` varchar(255) default NULL, + `uid` int(10) unsigned default NULL, + `custid` int(10) unsigned NOT NULL default '0', + `privs` tinyint(4) default '0', + `disabled` tinyint(4) NOT NULL default '0', + `lastupdated` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, + `lastupdatedby` int(11) default NULL, + `creator` varchar(32) default 'Manager', + `created` datetime default NULL, + `id` int(10) unsigned NOT NULL auto_increment, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=64 DEFAULT CHARSET=utf8; +SET character_set_client = @saved_cs_client; + +-- +-- Table structure for table `user_seq` +-- + +DROP TABLE IF EXISTS `user_seq`; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +CREATE TABLE `user_seq` ( + `id` int(10) unsigned NOT NULL auto_increment, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=63 DEFAULT CHARSET=utf8; +SET character_set_client = @saved_cs_client; + +-- +-- Table structure for table `vendor` +-- + +DROP TABLE IF EXISTS `vendor`; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +CREATE TABLE `vendor` ( + `id` int(10) unsigned NOT NULL auto_increment, + `name` varchar(255) NOT NULL default '', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8; +SET character_set_client = @saved_cs_client; + +-- +-- Temporary table structure for view `view_cust_current_active` +-- + +DROP TABLE IF EXISTS `view_cust_current_active`; +/*!50001 DROP VIEW IF EXISTS `view_cust_current_active`*/; +/*!50001 CREATE TABLE `view_cust_current_active` ( + `name` varchar(255), + `type` int(10) unsigned, + `shortname` varchar(255), + `autsys` int(10) unsigned, + `maxprefixes` int(10) unsigned, + `peeringemail` varchar(64), + `nocphone` varchar(255), + `noc24hphone` varchar(255), + `nocfax` varchar(40), + `nocemail` varchar(40), + `nochours` varchar(40), + `nocwww` varchar(255), + `peeringmacro` varchar(255), + `peeringpolicy` varchar(255), + `billingContact` varchar(64), + `billingAddress1` varchar(64), + `billingAddress2` varchar(64), + `billingCity` varchar(64), + `billingCountry` char(2), + `corpwww` varchar(255), + `datejoin` date, + `dateleave` date, + `status` tinyint(4), + `activepeeringmatrix` tinyint(4), + `notes` mediumtext, + `lastupdated` datetime, + `lastupdatedby` int(11), + `creator` varchar(32), + `created` datetime, + `id` int(10) unsigned +) */; + +-- +-- Temporary table structure for view `view_switch_details_by_custid` +-- + +DROP TABLE IF EXISTS `view_switch_details_by_custid`; +/*!50001 DROP VIEW IF EXISTS `view_switch_details_by_custid`*/; +/*!50001 CREATE TABLE `view_switch_details_by_custid` ( + `custid` int(10) unsigned, + `virtualinterfaceid` int(10) unsigned, + `status` int(10) unsigned, + `speed` int(10) unsigned, + `duplex` varchar(16), + `monitorindex` int(10) unsigned, + `notes` mediumtext, + `switchport` varchar(255), + `switchportid` int(10) unsigned, + `switch` varchar(255), + `switchid` int(10) unsigned, + `cabinet` varchar(255), + `colocabinet` varchar(255), + `locationname` varchar(255), + `locationshortname` varchar(255) +) */; + +-- +-- Temporary table structure for view `view_vlaninterface_details_by_custid` +-- + +DROP TABLE IF EXISTS `view_vlaninterface_details_by_custid`; +/*!50001 DROP VIEW IF EXISTS `view_vlaninterface_details_by_custid`*/; +/*!50001 CREATE TABLE `view_vlaninterface_details_by_custid` ( + `custid` int(10) unsigned, + `virtualinterfaceid` int(10) unsigned, + `monitorindex` int(10) unsigned, + `virtualinterfacename` varchar(255), + `vlan` int(10) unsigned, + `vlanname` varchar(255), + `vlanid` int(10) unsigned, + `rcvrfname` varchar(255), + `ipv4enabled` tinyint(4), + `ipv4hostname` varchar(64), + `ipv4canping` tinyint(3) unsigned, + `ipv4monitorrcbgp` tinyint(3) unsigned, + `ipv6enabled` tinyint(4), + `ipv6hostname` varchar(64), + `ipv6canping` tinyint(3) unsigned, + `ipv6monitorrcbgp` tinyint(3) unsigned, + `as112client` tinyint(3) unsigned, + `mcastenabled` tinyint(4), + `bgpmd5secret` varchar(64), + `rsclient` tinyint(4), + `notes` text, + `ipv4address` varchar(16), + `ipv6address` varchar(40) +) */; + +-- +-- Table structure for table `virtualinterface` +-- + +DROP TABLE IF EXISTS `virtualinterface`; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +CREATE TABLE `virtualinterface` ( + `id` int(10) unsigned NOT NULL auto_increment, + `custid` int(10) unsigned default NULL, + `name` varchar(255) NOT NULL, + `description` varchar(255) default NULL, + `mtu` int(10) unsigned default NULL, + `trunk` tinyint(3) unsigned default NULL, + `channelgroup` int(10) unsigned default NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=168 DEFAULT CHARSET=utf8; +SET character_set_client = @saved_cs_client; + +-- +-- Table structure for table `virtualinterface_seq` +-- + +DROP TABLE IF EXISTS `virtualinterface_seq`; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +CREATE TABLE `virtualinterface_seq` ( + `id` int(10) unsigned NOT NULL auto_increment, + PRIMARY KEY (`id`) +) ENGINE=MyISAM AUTO_INCREMENT=31 DEFAULT CHARSET=latin1; +SET character_set_client = @saved_cs_client; + +-- +-- Table structure for table `vlan` +-- + +DROP TABLE IF EXISTS `vlan`; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +CREATE TABLE `vlan` ( + `id` int(10) unsigned NOT NULL auto_increment, + `name` varchar(255) NOT NULL default '', + `number` int(10) unsigned NOT NULL default '0', + `ipv6masklen` smallint(5) unsigned default NULL, + `ipv4masklen` smallint(5) unsigned default NULL, + `rcvrfname` varchar(255) default NULL, + `notes` mediumtext NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8; +SET character_set_client = @saved_cs_client; + +-- +-- Table structure for table `vlan_seq` +-- + +DROP TABLE IF EXISTS `vlan_seq`; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +CREATE TABLE `vlan_seq` ( + `id` int(10) unsigned NOT NULL auto_increment, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8; +SET character_set_client = @saved_cs_client; + +-- +-- Table structure for table `vlaninterface` +-- + +DROP TABLE IF EXISTS `vlaninterface`; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +CREATE TABLE `vlaninterface` ( + `virtualinterfaceid` int(10) unsigned NOT NULL, + `vlanid` int(10) unsigned default NULL, + `ipv4enabled` tinyint(4) default NULL, + `ipv4addressid` int(10) unsigned default NULL, + `ipv4hostname` varchar(64) NOT NULL default '', + `ipv6enabled` tinyint(4) default NULL, + `ipv6addressid` int(10) unsigned default NULL, + `ipv6hostname` varchar(64) NOT NULL default '', + `mcastenabled` tinyint(4) default NULL, + `bgpmd5secret` varchar(64) default NULL, + `maxbgpprefix` int(10) unsigned default NULL, + `rsclient` tinyint(4) NOT NULL default '0', + `ipv4canping` tinyint(3) unsigned default NULL, + `ipv6canping` tinyint(3) unsigned default NULL, + `ipv4monitorrcbgp` tinyint(3) unsigned default NULL, + `ipv6monitorrcbgp` tinyint(3) unsigned default NULL, + `as112client` tinyint(3) unsigned default NULL, + `notes` text, + `id` int(10) unsigned NOT NULL auto_increment, + PRIMARY KEY (`id`), + KEY `virtualinterfaceid` (`virtualinterfaceid`) +) ENGINE=InnoDB AUTO_INCREMENT=98 DEFAULT CHARSET=latin1; +SET character_set_client = @saved_cs_client; + +-- +-- Table structure for table `vlaninterface_seq` +-- + +DROP TABLE IF EXISTS `vlaninterface_seq`; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +CREATE TABLE `vlaninterface_seq` ( + `id` int(10) unsigned NOT NULL auto_increment, + PRIMARY KEY (`id`) +) ENGINE=MyISAM AUTO_INCREMENT=98 DEFAULT CHARSET=latin1; +SET character_set_client = @saved_cs_client; + +-- +-- Final view structure for view `view_cust_current_active` +-- + +/*!50001 DROP TABLE `view_cust_current_active`*/; +/*!50001 DROP VIEW IF EXISTS `view_cust_current_active`*/; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `view_cust_current_active` AS select `cu`.`name` AS `name`,`cu`.`type` AS `type`,`cu`.`shortname` AS `shortname`,`cu`.`autsys` AS `autsys`,`cu`.`maxprefixes` AS `maxprefixes`,`cu`.`peeringemail` AS `peeringemail`,`cu`.`nocphone` AS `nocphone`,`cu`.`noc24hphone` AS `noc24hphone`,`cu`.`nocfax` AS `nocfax`,`cu`.`nocemail` AS `nocemail`,`cu`.`nochours` AS `nochours`,`cu`.`nocwww` AS `nocwww`,`cu`.`peeringmacro` AS `peeringmacro`,`cu`.`peeringpolicy` AS `peeringpolicy`,`cu`.`billingContact` AS `billingContact`,`cu`.`billingAddress1` AS `billingAddress1`,`cu`.`billingAddress2` AS `billingAddress2`,`cu`.`billingCity` AS `billingCity`,`cu`.`billingCountry` AS `billingCountry`,`cu`.`corpwww` AS `corpwww`,`cu`.`datejoin` AS `datejoin`,`cu`.`dateleave` AS `dateleave`,`cu`.`status` AS `status`,`cu`.`activepeeringmatrix` AS `activepeeringmatrix`,`cu`.`notes` AS `notes`,`cu`.`lastupdated` AS `lastupdated`,`cu`.`lastupdatedby` AS `lastupdatedby`,`cu`.`creator` AS `creator`,`cu`.`created` AS `created`,`cu`.`id` AS `id` from `cust` `cu` where ((isnull(`cu`.`dateleave`) or ((`cu`.`dateleave` < _latin1'1990-01-01') and (`cu`.`dateleave` < now()))) and ((`cu`.`status` = 1) or (`cu`.`status` = 2))) */; + +-- +-- Final view structure for view `view_switch_details_by_custid` +-- + +/*!50001 DROP TABLE `view_switch_details_by_custid`*/; +/*!50001 DROP VIEW IF EXISTS `view_switch_details_by_custid`*/; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `view_switch_details_by_custid` AS select `vi`.`custid` AS `custid`,`pi`.`virtualinterfaceid` AS `virtualinterfaceid`,`pi`.`status` AS `status`,`pi`.`speed` AS `speed`,`pi`.`duplex` AS `duplex`,`pi`.`monitorindex` AS `monitorindex`,`pi`.`notes` AS `notes`,`sp`.`name` AS `switchport`,`sp`.`id` AS `switchportid`,`sw`.`name` AS `switch`,`sw`.`id` AS `switchid`,`ca`.`name` AS `cabinet`,`ca`.`cololocation` AS `colocabinet`,`lo`.`name` AS `locationname`,`lo`.`shortname` AS `locationshortname` from (((((`virtualinterface` `vi` join `physicalinterface` `pi`) join `switchport` `sp`) join `switch` `sw`) join `cabinet` `ca`) join `location` `lo`) where ((`pi`.`virtualinterfaceid` = `vi`.`id`) and (`pi`.`switchportid` = `sp`.`id`) and (`sp`.`switchid` = `sw`.`id`) and (`sw`.`cabinetid` = `ca`.`id`) and (`ca`.`locationid` = `lo`.`id`)) */; + +-- +-- Final view structure for view `view_vlaninterface_details_by_custid` +-- + +/*!50001 DROP TABLE `view_vlaninterface_details_by_custid`*/; +/*!50001 DROP VIEW IF EXISTS `view_vlaninterface_details_by_custid`*/; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `view_vlaninterface_details_by_custid` AS select `vi`.`custid` AS `custid`,`pi`.`virtualinterfaceid` AS `virtualinterfaceid`,`pi`.`monitorindex` AS `monitorindex`,`vi`.`name` AS `virtualinterfacename`,`vlan`.`number` AS `vlan`,`vlan`.`name` AS `vlanname`,`vlan`.`id` AS `vlanid`,`vlan`.`rcvrfname` AS `rcvrfname`,`vli`.`ipv4enabled` AS `ipv4enabled`,`vli`.`ipv4hostname` AS `ipv4hostname`,`vli`.`ipv4canping` AS `ipv4canping`,`vli`.`ipv4monitorrcbgp` AS `ipv4monitorrcbgp`,`vli`.`ipv6enabled` AS `ipv6enabled`,`vli`.`ipv6hostname` AS `ipv6hostname`,`vli`.`ipv6canping` AS `ipv6canping`,`vli`.`ipv6monitorrcbgp` AS `ipv6monitorrcbgp`,`vli`.`as112client` AS `as112client`,`vli`.`mcastenabled` AS `mcastenabled`,`vli`.`bgpmd5secret` AS `bgpmd5secret`,`vli`.`rsclient` AS `rsclient`,`vli`.`notes` AS `notes`,`v4`.`address` AS `ipv4address`,`v6`.`address` AS `ipv6address` from ((`physicalinterface` `pi` join `virtualinterface` `vi`) join (((`vlaninterface` `vli` left join `ipv4address` `v4` on((`vli`.`ipv4addressid` = `v4`.`id`))) left join `ipv6address` `v6` on((`vli`.`ipv6addressid` = `v6`.`id`))) left join `vlan` on((`vli`.`vlanid` = `vlan`.`id`)))) where ((`pi`.`virtualinterfaceid` = `vi`.`id`) and (`vli`.`virtualinterfaceid` = `vi`.`id`)) */; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2008-11-17 15:26:58 diff --git a/library/INEX/Auth/DoctrineAdapter.php b/library/INEX/Auth/DoctrineAdapter.php new file mode 100644 index 000000000..a731a3d85 --- /dev/null +++ b/library/INEX/Auth/DoctrineAdapter.php @@ -0,0 +1,140 @@ + + * All rights reserved. + * + * @category INEX + * @version $Id: DoctrineAdapter.php 447 2011-05-26 13:53:52Z barryo $ + * @package INEX_Auth + * @copyright Copyright (c) 2009 Internet Neutral Exchange Limited + * + */ + + +/** + * Doctrine Adapter for Zend_Auth + * + * @category INEX + * @package INEX_Bootstrap_Resources + * @copyright Copyright (c) 2009 Internet Neutral Exchange Limited + */ +class INEX_Auth_DoctrineAdapter implements Zend_Auth_Adapter_Interface +{ + /** + * The username + * + * @var string The username + */ + private $username = null; + + /** + * The password + * + * @var string The password + */ + private $password = null; + + /** + * Sets username and password for authentication + * + * @throws Zend_Auth_Adapter_Exception If parameters are incorrect / not present + * @return void + */ + public function __construct( $username, $password ) + { + if( $username == null || $username == '' || $password == null || $password == '' ) + throw new Zend_Auth_Adapter_Exception( "No username / password specified" ); + + $this->username = $username; + $this->password = $password; + } + + /** + * Performs an authentication attempt + * + * @throws Zend_Auth_Adapter_Exception If authentication cannot + * be performed + * @return Zend_Auth_Result + */ + public function authenticate() + { + $user = Doctrine_Query::create() + ->from( 'User u' ) + ->leftJoin( 'u.Cust c' ) + ->where( 'u.username = ?', $this->username ) + ->fetchOne(); + + // $user === false if no record + + $result = array( + 'code' => Zend_Auth_Result::FAILURE, + 'identity' => array( + 'username' => $this->username + ), + 'messages' => array() + ); + + if( !$user ) + { + $result['code'] = Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND; + $result['messages'][] = 'Username / password invalid'; + } + else if( $user->disabled == 1 ) + { + $result['code'] = Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID; + $result['messages'][] = 'Your account has been disabled'; + } + else if( $user['Cust']['dateleave'] != null && $user['Cust']['dateleave'] != '0000-00-00' ) + { + $result['code'] = Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID; + $result['messages'][] = 'Your organisation is no longer a member of the exchange'; + } + else if( $user->password != $this->password ) + { + $result['code'] = Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID; + $result['messages'][] = 'Username / password invalid'; + } + else if( $user->password == $this->password ) + { + $result['code'] = Zend_Auth_Result::SUCCESS; + $result['identity'] = array( + 'username' => $this->username, + 'user' => $user->toArray() + ); + + // password is plaintext in the database so let's not include this is session files + $result['identity']['user']['password'] = 'xxxxxxxx'; + } + + return new Zend_Auth_Result( $result['code'], $result['identity'], $result['messages'] ); + } + +} + +?> \ No newline at end of file diff --git a/library/INEX/Controller/Action.php b/library/INEX/Controller/Action.php new file mode 100644 index 000000000..d3c9ce27d --- /dev/null +++ b/library/INEX/Controller/Action.php @@ -0,0 +1,326 @@ +_bootstrap = $invokeArgs['bootstrap']; + + // and from the bootstrap, we can get other resources: + + $this->config = $this->_bootstrap->getApplication()->getOptions(); + + $this->logger = $this->_bootstrap->getResource( 'logger' ); + + // Smarty must be set during bootstrap + try + { + $this->view = $this->_bootstrap->getResource( 'view' ); + + if( php_sapi_name() != 'cli' ) + { + $this->view->pagebase = 'http' . ( isset( $_SERVER['HTTPS'] ) ? 's' : '' ) . '://' . $_SERVER['SERVER_NAME'] + . Zend_Controller_Front::getInstance()->getBaseUrl(); + } + + $this->view->basepath = Zend_Controller_Front::getInstance()->getBaseUrl(); + + + $this->auth = $this->_bootstrap->getResource( 'auth' ); + + if( $this->auth->hasIdentity() ) + { + $this->identity = $this->auth->getIdentity(); + $this->user = Doctrine::getTable( 'User' )->find( $this->identity['user']['id'] ); + $this->customer = Doctrine::getTable( 'Cust' )->find( $this->identity['user']['custid'] ); + } + + $this->session = $this->_bootstrap->getResource('namespace'); + + $this->view->auth = $this->auth; + $this->view->hasIdentity = $this->auth->hasIdentity(); + $this->view->identity = $this->identity; + $this->view->customer = $this->customer; + $this->view->user = $this->user; + $this->view->config = $this->config; + $this->view->session = $this->session; + + // pull a message from the session if it exists + // (this is when we do a ->_redirect after an action) + if( isset( $this->session->message ) && $this->session->message !== null ) + { + $this->view->message = $this->session->message; + $this->session->message = null; + } + + + // should we check the change log? (and if so, only once per session) + if( $this->config['change_log']['enabled'] && $this->auth->hasIdentity() ) + { + if( isset( $this->session->change_log_has_updates ) ) + { + $this->view->change_log_has_updates = $this->session->change_log_has_updates; + } + else + { + $lastSeen = $this->user->getPreference( 'change_log.last_seen' ); + + // don't alert past changes to new users + if( $lastSeen === false ) + { + $this->user->setPreference( 'change_log.last_seen', date( 'Y-m-d H:i:s' ) ); + $lastSeen = date( 'Y-m-d H:i:s' ); + } + + $this->session->change_log_has_updates + = ChangeLogTable::hasUpdates( $this->user['privs'], $lastSeen ); + $this->view->change_log_has_updates = $this->session->change_log_has_updates; + } + } + } + catch( Zend_Exception $e ) + { + echo "Caught exception: " . get_class( $e ) . "\n"; + echo "Message: " . $e->getMessage() . "\n"; + + die( "\n\nYou must set-up Smarty in the bootstrap code.\n\n" ); + } + + // call the parent's version where all the Zend magic happens + parent::__construct( $request, $response, $invokeArgs ); + $this->view->controller = $this->getRequest()->getParam( 'controller' ); + $this->view->action = $this->getRequest()->getParam( 'action' ); + + // see if the user's session has timed out + if( $this->auth->hasIdentity() ) + { + if( ( mktime() - $this->session->timeOfLastAction ) > $this->config['resources']['session']['remember_me_seconds'] ) + { + $this->auth->clearIdentity(); + $this->view->message = new INEX_Message( + 'To protect your account and information, you have been logged out automatically ' + . 'due to an extended period of inactivity. Please log in again below to continue.', + INEX_Message::MESSAGE_TYPE_ALERT + ); + + Zend_Session::destroy( true, true ); + $this->view->display( 'auth/login.tpl' ); + ob_end_flush(); + die(); + } + + $this->session->timeOfLastAction = mktime(); + } + } + + /** + * A utility function to get parameters in $_GET. It strips the slashes + * added by PHP as well as trimming the whitespace. + * + * @param string $name The parameter name to get (i.e. $_GET[$name]) + * @param bool $trim Trim whitespace from the string. Default: true. + * @return mixed The parameter if it exists, else null. + */ + public static function inexGetGet( $name, $trim = true ) + { + if( isset( $_GET[ $name ] ) ) + { + if( $trim ) + return trim( stripslashes( $_GET[ $name ] ) ); + else + return stripslashes( $_GET[ $name ] ); + } + else + return null; + } + + + /** + * A utility function to get parameters in $_POST. It strips the slashes + * added by PHP as well as trimming the whitespace. + * + * @param string $name The parameter name to get (i.e. $_POST[$name]) + * @param bool $trim Trim whitespace from the string. Default: true. + * @return mixed The parameter if it exists, else null. + */ + public static function inexGetPost( $name, $trim = true ) + { + if( isset( $_POST[ $name ] ) ) + { + if( $trim ) + return trim( stripslashes( $_POST[ $name ] ) ); + else + return stripslashes( $_GET[ $name ] ); + } + else + return null; + } + + /** + * A utility function to get parameters in either $_POST or $_GET respectivily. + * It strips the slashes added by PHP as well as trimming the whitespace. + * + * If the parameter does not exist in POST, we try GET. + * + * @param string $name The parameter name to get (i.e. $_POST/GET[$name]) + * @param bool $trim Trim whitespace from the string. Default: true. + * @return mixed The parameter if it exists, else null. + */ + public static function inexGetRequest( $name, $trim = true ) + { + if( ( $value = INEX_Controller_Action::inexGetPost( $name ) ) !== null ) + return $value; + else + return INEX_Controller_Action::inexGetGet( $name ); + } + + /** + * Utility function to instantiate the INEX_SMS_Clickatell resource. + */ + public function getSMS() + { + if( $this->_sms === null ) + { + $this->_sms = new INEX_SMS_Clickatell( + $this->config['sms']['clickatell']['username'], + $this->config['sms']['clickatell']['password'], + $this->config['sms']['clickatell']['api_id'], + $this->config['sms']['clickatell']['sender_id'] + ); + } + + return $this->_sms; + } + + /** + * Get the user object + * + * @return User The user object + */ + protected function getUser() + { + return $this->user; + } + + /** + * Get the logger object + * + * @return Zend_Log The user object + */ + protected function getLogger() + { + return $this->logger; + } +} + +?> \ No newline at end of file diff --git a/library/INEX/Controller/FrontEnd.php b/library/INEX/Controller/FrontEnd.php new file mode 100644 index 000000000..727b0b765 --- /dev/null +++ b/library/INEX/Controller/FrontEnd.php @@ -0,0 +1,432 @@ +feAuthLevelRequired != User::AUTH_PUBLIC ) + { + if( isset( $this->frontend['authLevels'][$this->getRequest()->getActionName()] ) + && $this->frontend['authLevels'][$this->getRequest()->getActionName()] == User::AUTH_PUBLIC + ) + { + // do nothing -> action has public access + } + else if( !$this->auth->hasIdentity() ) + { + // record the page we wanted + $this->session->postAuthRedirect = $this->_request->getPathInfo(); + $this->_redirect( 'auth/login' ); + } + else + { + if( isset( $this->frontend['authLevels'][$this->getRequest()->getActionName()] ) ) + $authRequired = $this->frontend['authLevels'][$this->getRequest()->getActionName()]; + else + $authRequired = $this->feAuthLevelRequired; + + if( $this->identity['user']['privs'] < $authRequired ) + { + $this->logger->alert( "User {$this->identity['username']} was denied access to {$this->frontend['name']}" ); + $this->view->message = new INEX_Message( "You are not authorised to view the requested page!", "alert" ); + return( $this->_forward( 'index', 'index' ) ); + } + } + } + } + + /** + * Validation function that is called as part of the subclasses set up. + * + * This should check that all necessary variables are set. + */ + final protected function feInit() + { + if( $this->frontend['name'] == null ) + throw new Exception( "You must set a name for the controller in the init() method." ); + + + if( $this->frontend['model'] == null ) + throw new Exception( "You must set the model in the init() method for the {$this->feName} controller." ); + + if( $this->frontend['columns'] == null ) + throw new Exception( "You must set the view's column configuration in the init() method for the {$this->feName} controller." ); + + $this->frontend['controller'] = $this->getRequest()->getParam( 'controller' ); + $this->feSession = $this->_bootstrap->getResource( 'namespace' ); + $this->view->frontend = $this->frontend; + } + + + public function indexAction() + { + $this->_forward( 'list' ); + } + + + + + public function addAction() + { + // is this an attempt to edit? + if( $this->getRequest()->getParam( 'id' ) !== NULL && is_numeric( $this->getRequest()->getParam( 'id' ) ) ) + { + $isEdit = true; + + // is the ID valid? + if( !( $object = Doctrine::getTable( $this->frontend['model'] )->find( $this->getRequest()->getParam( 'id' ) ) ) ) + { + $this->view->message = new INEX_Message( 'No entry with ID: ' . $this->getRequest()->getParam( 'id' ) . " exists.", "failure" ); + return( $this->_forward( 'list' ) ); + } + + $this->view->object = $object; + + $form = $this->getForm( null, $isEdit ); + $form->assignModelToForm( $object, $this ); + $form->setAction( Zend_Controller_Front::getInstance()->getBaseUrl() . '/' . $this->getRequest()->getParam( 'controller' ) . '/edit/id/' . $this->getRequest()->getParam( 'id' ) ); + $form->getElement( 'commit' )->setLabel( 'Save Changes' ); + } + else + { + $isEdit = false; + + $form = $this->getForm( null, $isEdit ); + $form->setAction( Zend_Controller_Front::getInstance()->getBaseUrl() . '/' . $this->getRequest()->getParam( 'controller' ) . "/add" ); + $object = new $this->frontend['model']; + } + + $this->view->isEdit = $isEdit; + + if( $this->getRequest()->getParam( 'return' ) !== null ) + $form->addElement( $form->createElement( 'hidden', 'return' )->setValue( $this->getRequest()->getParam( 'return' ) ) ); + + // optional extra pre-validation code + if( method_exists( $this, 'formPrevalidate' ) ) + $this->formPrevalidate( $form, $isEdit ); + + if( $this->inexGetPost( 'commit' ) !== null && $form->isValid( $_POST ) ) + { + do + { + try + { + + // non-standard validation checks + if( !$isEdit ) + { + if( method_exists( $this, 'formValidateForAdd' ) ) + if( $this->formValidateForAdd( $form ) === false ) + break; + } + + $form->assignFormToModel( $object, $this, $isEdit ); + + if( method_exists( $this, 'addEditPreSave' ) ) + $this->addEditPreSave( $object, $isEdit, $form ); + + $object->save(); + + if( method_exists( $this, 'addEditPostSave' ) ) + $this->addEditPostSave( $object, $isEdit, $form ); + + if( $isEdit ) + { + $this->logger->notice( $this->getName() . ' edited' ); + $this->session->message = new INEX_Message( $this->getName() . ' edited', "success" ); + } + else + { + $this->logger->notice( 'New ' . $this->getName() . ' created' ); + $this->session->message = new INEX_Message( $this->getName() . ' added', "success" ); + } + + if( $this->getRequest()->getParam( 'return' ) !== null ) + $this->_redirect( $this->getRequest()->getParam( 'return' ) . '/objectid/' . $object['id'] ); + else + $this->_redirect( $this->getRequest()->getParam( 'controller' ) ); + } + catch( Exception $e ) + { + Zend_Registry::set( 'exception', $e ); + return( $this->_forward( 'error', 'error' ) ); + } + }while( false ); + } + + if( method_exists( $this, 'addEditPreDisplay' ) ) + $this->addEditPreDisplay( $form ); + + $this->view->form = $form->render( $this->view ); + $this->view->object = $object; + + if( $this->view->templateExists( $this->getRequest()->getParam( 'controller' ) . DIRECTORY_SEPARATOR . 'addEdit.tpl' ) ) + $this->view->display( $this->getRequest()->getParam( 'controller' ) . DIRECTORY_SEPARATOR . 'addEdit.tpl' ); + else + $this->view->display( 'frontend' . DIRECTORY_SEPARATOR . 'addEdit.tpl' ); + } + + public function editAction() + { + $this->_forward( 'add' ); + } + + public function viewAction() + { + $this->view->perspective = $this->getRequest()->getParam( 'perspective' ); + + if( $this->getRequest()->getParam( 'id' ) !== NULL && is_numeric( $this->getRequest()->getParam( 'id' ) ) ) + { + // is the ID valid? + if( !( $object = Doctrine::getTable( $this->frontend['model'] )->find( $this->getRequest()->getParam( 'id' ) ) ) ) + { + $view = '

Error

No entry with ID: ' . $this->getRequest()->getParam( 'id' ) . ' exists.

'; + } + else + { + $this->view->object = $object; + } + } + + $this->view->display( 'frontend' . DIRECTORY_SEPARATOR . 'view.tpl' ); + } + + + + /** + * A generic action to delete an element of a database (as represented + * by a Doctrine model) via Smarty templates. + * + * This method calls preDelete before the deletion. + * + * It then calls postDelete() after the deletion (assuming it succeeds). + * + * To capture errors, pre and postDelete() should throw an exception. + * + */ + public function deleteAction() + { + // is the ID valid? + if( !( $object = Doctrine::getTable( $this->getModelName() )->find( $this->getRequest()->getParam( 'id' ) ) ) ) + { + $this->view->message = new INEX_Message( 'No such object with ID: ' . $this->getRequest()->getParam( 'id' ), "error" ); + return( $this->_forward( 'list' ) ); + } + + $this->preDelete( $object ); + + if( $object->delete() ) + { + $this->logger->notice( 'Object with ID: ' . $this->getRequest()->getParam( 'id' ) . " deleted from {$this->frontend['model']}" ); + $this->view->message = new INEX_Message( "Object with ID " . $this->getRequest()->getParam( 'id' ) . " deleted", "success" ); + + $this->postDelete(); + } + else + { + $this->logger->error( "Object could not be deleted" ); + $this->view->message = new INEX_Message( "Error deleting object", "error" ); + } + + if( $this->getRequest()->getParam( 'return' ) !== null ) + $this->_redirect( 'http' . ( isset( $_SERVER['HTTPS'] ) ? 's' : '' ) . '://' . $_SERVER['SERVER_NAME'] . $this->getRequest()->getParam( 'return' ) ); + else + return( $this->_forward( 'list' ) ); + } + + /** + * A generic action to list the elements of a database (as represented + * by a Doctrine model) via Smarty templates. + */ + public function listAction() + { + $dataQuery = Doctrine_Query::create() + ->from( $this->frontend['model'] . ' x' ); + + if( isset( $this->frontend['columns']['sortDefaults'] ) ) + { + $order = ''; + if( isset( $this->frontend['columns']['sortDefaults']['order'] ) ) + $order = strtoupper( $this->frontend['columns']['sortDefaults']['order'] ); + + $dataQuery->orderBy( "{$this->frontend['columns']['sortDefaults']['column']} $order" ); + } + + $dataQuery = $this->_preList( $dataQuery ); + + $this->view->rows = $dataQuery->execute(); + + $this->view->feSession = $this->feSession; + + $this->view->frontend = $this->frontend; + + + if( $this->view->templateExists( $this->getRequest()->getParam( 'controller' ) . DIRECTORY_SEPARATOR . 'customContextMenu.js.tpl' ) ) + $this->view->hasCustomContextMenu = $this->getRequest()->getParam( 'controller' ) . DIRECTORY_SEPARATOR . 'customContextMenu.js.tpl'; + + if( $this->view->templateExists( $this->getRequest()->getParam( 'controller' ) . DIRECTORY_SEPARATOR . 'postContent.tpl' ) ) + $this->view->hasPostContent = $this->getRequest()->getParam( 'controller' ) . DIRECTORY_SEPARATOR . 'postContent.tpl'; + + if( $this->view->templateExists( $this->getRequest()->getParam( 'controller' ) . DIRECTORY_SEPARATOR . 'list.tpl' ) ) + $this->view->display( $this->getRequest()->getParam( 'controller' ) . DIRECTORY_SEPARATOR . 'list.tpl' ); + else + $this->view->display( 'frontend' . DIRECTORY_SEPARATOR . 'list.tpl' ); + } + + + /** + * A function executed before the list action queries the database. + * + * You can add clauses to the query or perform other queries and assign data to the + * view. + * + * @param Doctrine_Query $dataQuery The query being formed to which you can add clauses. Just be sure to return it irregardless! + * @return You *must* return the $dataQuery object. + */ + protected function _preList( $dataQuery ) + { + return $dataQuery; + } + + protected function getForm( $options = null, $isEdit = false ) + { + $formName = "INEX_Form_{$this->frontend['name']}"; + + if( $this->getRequest()->getParam( 'return' ) !== null ) + $cancelLocation = 'http' . ( isset( $_SERVER['HTTPS'] ) ? 's' : '' ) . '://' . $_SERVER['SERVER_NAME'] . $this->getRequest()->getParam( 'return' ); + else + $cancelLocation = 'http' . ( isset( $_SERVER['HTTPS'] ) ? 's' : '' ) . '://' . $_SERVER['SERVER_NAME'] . Zend_Controller_Front::getInstance()->getBaseUrl() . '/' . $this->getRequest()->getParam( 'controller' ) . '/list'; + + return new $formName( $options, $isEdit, $cancelLocation ); + } + + + /** + * Returns the model name. + * + * Each controller extending the FrontEnd class represents a Doctrine model. This returns the name of that model. + * + * @return string the model name + */ + public function getModelName() + { + return $this->frontend['model']; + } + + /** + * Returns the controller name. + * + * Each controller extending the FrontEnd class represents a Doctrine model. This returns the name that we use for the frontend to describe the model. + * + * @return string the name + */ + public function getName() + { + return $this->frontend['name']; + } + + + /** + * Base method to allow for pre-deletion hooks. + */ + protected function preDelete() + {} + + + /** + * Base method to allow for post-deletion hooks. + */ + protected function postDelete() + {} + + + + /** + * Base method to allow for pre-add/edit save hooks. + * + * @param Doctrine_Record $object The object being built for adding or edited + * @param bool $isEdit True if this is an edit, false if it's an add + * @param Zend_Form $form The submitted add / edit form + */ + protected function addEditPreSave( $object, $isEdit, $form ) + {} + + +} + +?> \ No newline at end of file diff --git a/library/INEX/Controller/Request/Simple.php b/library/INEX/Controller/Request/Simple.php new file mode 100644 index 000000000..70fefa7ae --- /dev/null +++ b/library/INEX/Controller/Request/Simple.php @@ -0,0 +1,55 @@ + \ No newline at end of file diff --git a/library/INEX/Controller/Router/Cli.php b/library/INEX/Controller/Router/Cli.php new file mode 100644 index 000000000..6cdfe5827 --- /dev/null +++ b/library/INEX/Controller/Router/Cli.php @@ -0,0 +1,42 @@ + tags. + * + * The dump command is Zend_Debug::dump() + * + * + * @param object $object The variable / object to dump + * @param bool $html If true (default) surround the output with
 tags
+    * @author Barry O'Donovan  20100323
+    */
+    public static function dd( $object, $html = true )
+    {
+        if( $html ) echo '
';
+        Zend_Debug::dump( $object );
+        if( $html ) echo '
'; + die(); + } + + + /** + * A wrapper and extension for print_r(). The output looks the same in the browser as the output of print_r() in the source, as it turns the pure + * text output of print_r() into HTML (XHTML). + * + * @param mixed $data the data to be printed or returned + * @param mixed $var_name null if we don't want to display the variable name, otherwise the name of the variable + * @param boolean $return default false; if true it returns with the result, if true then prints it + * @param boolean $pAddPre default true adds the '
 ... 
' tags to the output, useful for HTML output + * @param boolean $pAddDollarSign default true adds a $ sign to the $var_name if it is set to true + * @return mixed void (null) or a string + * @author Roland Huszti + * @license Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php + */ + public static function prr($data, $var_name=null, $return=false, $pAddPre=true, $pAddDollarSign=true) + { + $vRetVal = ($pAddPre == true ? "\n
\n" : '') .
+                    ($var_name == '' ? '' : ($pAddDollarSign == true ? "\$" : '') . "{$var_name} = ") .
+                    print_r($data, true) .
+                    ($pAddPre == true ? "\n
\n" : ''); + + + if ($return === false) + print $vRetVal; + else + return $vRetVal; + } + + + /** + * Returns with a simplified, easier-to-read version of the result of debug_backtrace() as an associative array. + * + * @param void + * @return array + */ + public static function compact_debug_backtrace() + { + $res = debug_backtrace(); + $ret_val = array(); + + foreach($res as $res_val) + { + $xyz = array(); + if (isset($res_val['file'])) $xyz['file'] = $res_val['file']; + if (isset($res_val['line'])) $xyz['line'] = $res_val['line']; + if (isset($res_val['function'])) $xyz['function'] = $res_val['function']; + if (isset($res_val['class'])) $xyz['class'] = $res_val['class']; + if (isset($res_val['object']->name)) $xyz['object'] = $res_val['object']->name; + + $ret_val[] = $xyz; + } + + return $ret_val; + } + +} + + diff --git a/library/INEX/Exception.php b/library/INEX/Exception.php new file mode 100644 index 000000000..d7d46c26e --- /dev/null +++ b/library/INEX/Exception.php @@ -0,0 +1,32 @@ + \ No newline at end of file diff --git a/library/INEX/Form.php b/library/INEX/Form.php new file mode 100644 index 000000000..a0c9b14f5 --- /dev/null +++ b/library/INEX/Form.php @@ -0,0 +1,152 @@ +setAttrib( 'accept-charset', 'UTF-8' ); + $this->setAttrib( 'class', 'form' ); + + $this->setElementDecorators( + array( + 'ViewHelper', + 'Errors', + array( 'HtmlTag', array( 'tag' => 'dd' ) ), + array( 'Label', array( 'tag' => 'dt' ) ), + ) + ); + + $this->setMethod( 'post' ); + + $this->onEditSkipIfBlank = array(); + } + + public function assignFormToModel( $model, $controller, $isEdit ) + { + + // For logic to decide what non super users can edit: + // $auth = Zend_Auth::getInstance(); + // if( $auth->hasIdentity() ) + // $identity = $auth->getIdentity(); + // else + // return false; + + //$identity['user']['privs'] + + + $columns = Doctrine::getTable( $controller->getModelName() )->getFieldNames(); + + foreach( $this->getElements() as $elementName => $elementConfig ) + { + if( in_array( $elementName, $columns ) ) + { + // don't remove centain elements on an edit + if( $isEdit and in_array( $elementName, $this->onEditSkipIfBlank ) and $this->getValue( $elementName ) == '' ) + continue; + + $model->$elementName = $this->getValue( $elementName ); + } + } + + return $model; + } + + public function assignModelToForm( $model, $controller ) + { + $columns = Doctrine::getTable( $controller->getModelName() )->getFieldNames(); + + foreach( $this->getElements() as $elementName => $elementConfig ) + if( in_array( $elementName, $columns ) ) + $this->getElement( $elementName )->setValue( $model->$elementName ); + + return $this; + } + + /** + * Populate a Zend_Form SELECT element from a database table + * + * + * @param Form_Element $element The form element to populate + * @param string $model The model to select items from + * @param string $indexElement The element with which to set the select value attributes with + * @param string|array $displayElements If a string, then the element to show in the select, if an array, a list of elements concatenated with dashes + * @param string $orderBy The element to order by + * @param string $orderDir The order direction + * @return int The maximum value of the $indexElement (asuming integer!) + */ + public static function createSelectFromDatabaseTable( $element, $model, $indexElement, $displayElements, $orderBy = null, $orderDir = 'ASC' ) + { + $query = Doctrine_Query::create() + ->from( "$model m" ); + + if( $orderBy !== null ) + $query->orderBy( "m.{$orderBy} {$orderDir}" ); + + $collection = $query->execute(); + + $options = array( '0' => '' ); + $maxId = 0; + + foreach( $collection as $c ) + { + $value = ''; + + if( is_array( $displayElements ) ) + { + foreach( $displayElements as $e ) + $value .= "{$c[$e]} - "; + + $value = substr( $value, 0, strlen( $value ) - 2 ); + } + else + $value = $c[$displayElements]; + + $options[ $c[$indexElement] ] = $value; + + if( $c[$indexElement] > $maxId ) $maxId = $c[$indexElement]; + } + + $element->setMultiOptions( $options ); + + return( $maxId ); + } + +} + +?> \ No newline at end of file diff --git a/library/INEX/Form/Cabinet.php b/library/INEX/Form/Cabinet.php new file mode 100644 index 000000000..ed24050fe --- /dev/null +++ b/library/INEX/Form/Cabinet.php @@ -0,0 +1,134 @@ +createElement( 'text', 'name' ); + $name->addValidator( 'stringLength', false, array( 1, 255 ) ) + ->setRequired( true ) + ->setLabel( 'Name' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $name ); + + + + + //////////////////////////////////////////////// + // Location + //////////////////////////////////////////////// + + $dbLocations = Doctrine_Query::create() + ->from( 'Location' ) + ->execute(); + + $locations = array( '0' => '' ); + $maxId = 0; + + foreach( $dbLocations as $l ) + { + $locations[ $l['id'] ] = "{$l['name']}"; + if( $l['id'] > $maxId ) $maxId = $l['id']; + } + + $location = $this->createElement( 'select', 'locationid' ); + $location->setMultiOptions( $locations ); + $location->setRegisterInArrayValidator( true ) + ->setLabel( 'Location' ) + ->addValidator( 'between', false, array( 1, $maxId ) ) + ->setErrorMessages( array( 'Please select a location' ) ); + + $this->addElement( $location ); + + + + + + $cololocation = $this->createElement( 'text', 'cololocation' ); + $cololocation->addValidator( 'stringLength', false, array( 1, 255 ) ) + ->setRequired( true ) + ->setLabel( 'Co-lo Location' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $cololocation ); + + $type = $this->createElement( 'text', 'type' ); + $type->addValidator( 'type', false, array( 1, 255 ) ) + ->setRequired( true ) + ->setLabel( 'Type' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $cololocation ); + + $height = $this->createElement( 'text', 'height' ); + $height->addValidator( 'between', false, array( 0, 100 ) ) + ->setLabel( 'Height (U)' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $height ); + + $notes = $this->createElement( 'textarea', 'notes' ); + $notes->setLabel( 'Notes' ) + ->setRequired( false ) + ->addFilter( new INEX_Filter_StripSlashes() ) + ->setAttrib( 'cols', 60 ) + ->setAttrib( 'rows', 5 ); + $this->addElement( $notes ); + + + $this->addElement( 'button', 'cancel', array( 'label' => 'Cancel', 'onClick' => "parent.location='" + . $cancelLocation . "'" ) ); + $this->addElement( 'submit', 'commit', array( 'label' => 'Add' ) ); + + } + +} + +?> \ No newline at end of file diff --git a/library/INEX/Form/ChangeLog.php b/library/INEX/Form/ChangeLog.php new file mode 100644 index 000000000..f627ecc6a --- /dev/null +++ b/library/INEX/Form/ChangeLog.php @@ -0,0 +1,110 @@ +setAttrib( 'accept-charset', 'UTF-8' ); + $this->setAttrib( 'class', 'form' ); + + $this->setElementDecorators( + array( + 'ViewHelper', + 'Errors', + array( 'HtmlTag', array( 'tag' => 'dd' ) ), + array( 'Label', array( 'tag' => 'dt' ) ), + ) + ); + + + //////////////////////////////////////////////// + // Create and configure title element + //////////////////////////////////////////////// + + $title = $this->createElement( 'text', 'title', array( 'size' => '100' ) ); + $title->addValidator( 'stringLength', false, array( 1, 255 ) ) + ->setRequired( true ) + ->setLabel( 'Summary' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $title ); + + $change = $this->createElement( 'textarea', 'details' ); + $change->setLabel( 'Details' ) + ->setRequired( false ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ) + ->setAttrib( 'cols', 100 ) + ->setAttrib( 'rows', 10 ); + $this->addElement( $change ); + + $visibility = $this->createElement( 'select', 'visibility' ); + $visibility->setMultiOptions( + User::$PRIVILEGES + ); + $visibility->setRegisterInArrayValidator( true ) + ->setLabel( 'Visibility' ) + ->setValue( User::AUTH_SUPERUSER ) + ->setErrorMessages( array( 'Please select the minimum privileges a user needs to see this change log' ) ); + + $this->addElement( $visibility ); + + + $livedate = $this->createElement( 'text', 'livedate' ); + $livedate->addValidator( 'stringLength', false, array( 10, 10 ) ) + ->addValidator( 'regex', false, array('/^\d\d\d\d-\d\d-\d\d/' ) ) + ->setRequired( true ) + ->setLabel( 'Live Date' ) + ->addFilter( 'StringTrim' ); + $this->addElement( $livedate ); + + + $this->addElement( 'button', 'cancel', array( 'label' => 'Cancel', 'onClick' => "parent.location='" . Zend_Controller_Front::getInstance()->getBaseUrl() . "/customer/list'" ) ); + + $this->addElement( 'submit', 'commit', array( 'label' => 'Add' ) ); + + } + +} + +?> \ No newline at end of file diff --git a/library/INEX/Form/ConsoleServerConnection.php b/library/INEX/Form/ConsoleServerConnection.php new file mode 100644 index 000000000..9277874fe --- /dev/null +++ b/library/INEX/Form/ConsoleServerConnection.php @@ -0,0 +1,210 @@ +createElement( 'text', 'description' ); + $description->addValidator( 'stringLength', false, array( 1, 255 ) ) + ->setRequired( true ) + ->setLabel( 'Description' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $description ); + + + + + + + $dbCusts = Doctrine_Query::create() + ->from( 'Cust c' ) + ->orderBy( 'c.name ASC' ) + ->execute(); + + $custs = array( '0' => '' ); + $maxId = 0; + + foreach( $dbCusts as $c ) + { + $custs[ $c['id'] ] = "{$c['name']}"; + if( $c['id'] > $maxId ) $maxId = $c['id']; + } + + $cust = $this->createElement( 'select', 'custid' ); + $cust->setMultiOptions( $custs ); + $cust->setRegisterInArrayValidator( true ) + ->setRequired( true ) + ->setLabel( 'Customer' ) + ->addValidator( 'between', false, array( 1, $maxId ) ) + ->setErrorMessages( array( 'Please select a customer' ) ); + + $this->addElement( $cust ); + + + + + + + + + + $dbSwitches = Doctrine_Query::create() + ->from( 'SwitchTable' ) + ->execute(); + + $switches = array( '0' => '' ); + $maxId = 0; + + foreach( $dbSwitches as $c ) + { + $switches[ $c['id'] ] = "{$c['name']}"; + if( $c['id'] > $maxId ) $maxId = $c['id']; + } + + $switch = $this->createElement( 'select', 'switchid' ); + $switch->setMultiOptions( $switches ) + ->setRegisterInArrayValidator( true ) + ->setRequired( true ) + ->setLabel( 'Console Server' ) + ->addValidator( 'between', false, array( 1, $maxId ) ) + ->setErrorMessages( array( 'Please select a console server' ) ); + + $this->addElement( $switch ); + + + + + $port = $this->createElement( 'text', 'port' ); + $port->addValidator( 'stringLength', false, array( 1, 255 ) ) + ->setRequired( true ) + ->setLabel( 'Port' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $port ); + + + + + + + + $speed = $this->createElement( 'text', 'speed' ); + $speed->addValidator( 'int' ) + ->setLabel( 'Speed' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $speed ); + + + + + $parity = $this->createElement( 'text', 'parity' ); + $parity->addValidator( 'int' ) + ->setLabel( 'Parity' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $parity ); + + + + + $stopbits = $this->createElement( 'text', 'stopbits' ); + $stopbits->addValidator( 'int' ) + ->setLabel( 'Stop Bits' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $stopbits ); + + + + + $flowcontrol = $this->createElement( 'text', 'flowcontrol' ); + $flowcontrol->addValidator( 'int' ) + ->setLabel( 'Flow Control' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $flowcontrol ); + + + + + $autobaud = $this->createElement( 'text', 'autobaud' ); + $autobaud->addValidator( 'int' ) + ->setLabel( 'Autobaud' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $autobaud ); + + + + + + $notes = $this->createElement( 'textarea', 'notes' ); + $notes->setLabel( 'Notes' ) + ->setRequired( false ) + ->addFilter( new INEX_Filter_StripSlashes() ) + ->setAttrib( 'cols', 60 ) + ->setAttrib( 'rows', 5 ); + $this->addElement( $notes ); + + + $this->addElement( 'button', 'cancel', array( 'label' => 'Cancel', 'onClick' => "parent.location='" + . $cancelLocation . "'" ) ); + $this->addElement( 'submit', 'commit', array( 'label' => 'Add' ) ); + + } + +} + +?> \ No newline at end of file diff --git a/library/INEX/Form/Contact.php b/library/INEX/Form/Contact.php new file mode 100644 index 000000000..3f4fcec42 --- /dev/null +++ b/library/INEX/Form/Contact.php @@ -0,0 +1,156 @@ +createElement( 'text', 'name' ); + $name->addValidator( 'stringLength', false, array( 1, 255 ) ) + ->setRequired( true ) + ->setLabel( 'Name' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $name ); + + + + + + + $dbCusts = Doctrine_Query::create() + ->from( 'Cust c' ) + ->orderBy( 'c.name ASC' ) + ->execute(); + + $custs = array( '0' => '' ); + $maxId = 0; + + foreach( $dbCusts as $c ) + { + $custs[ $c['id'] ] = "{$c['name']}"; + if( $c['id'] > $maxId ) $maxId = $c['id']; + } + + $cust = $this->createElement( 'select', 'custid' ); + $cust->setMultiOptions( $custs ); + $cust->setRegisterInArrayValidator( true ) + ->setRequired( true ) + ->setLabel( 'Customer' ) + ->addValidator( 'between', false, array( 1, $maxId ) ) + ->setErrorMessages( array( 'Please select a customer' ) ); + + $this->addElement( $cust ); + + + + + + + + + + $email = $this->createElement( 'text', 'email' ); + $email->addValidator( 'stringLength', false, array( 1, 64 ) ) + ->addValidator( 'emailAddress' ) + ->setLabel( 'E-mail' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $email ); + + + + + + $phone = $this->createElement( 'text', 'phone' ); + $phone->addValidator( 'stringLength', false, array( 1, 32 ) ) + ->setLabel( 'Phone' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $phone ); + + + + + $mobile = $this->createElement( 'text', 'mobile' ); + $mobile->addValidator( 'stringLength', false, array( 1, 32 ) ) + ->setLabel( 'Mobile' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $mobile ); + + + + + + $facilityaccess = $this->createElement( 'checkbox', 'facilityaccess' ); + $facilityaccess->setLabel( 'Facility Access' ) + ->setCheckedValue( '1' ); + $this->addElement( $facilityaccess ); + + + + + $mayauthorize = $this->createElement( 'checkbox', 'mayauthorize' ); + $mayauthorize->setLabel( 'May Authorize' ) + ->setCheckedValue( '1' ); + $this->addElement( $mayauthorize ); + + + + + $this->addElement( 'button', 'cancel', array( 'label' => 'Cancel', 'onClick' => "parent.location='" + . $cancelLocation . "'" ) ); + $this->addElement( 'submit', 'commit', array( 'label' => 'Add' ) ); + + } + +} + +?> \ No newline at end of file diff --git a/library/INEX/Form/CustKit.php b/library/INEX/Form/CustKit.php new file mode 100644 index 000000000..4d8cea8a1 --- /dev/null +++ b/library/INEX/Form/CustKit.php @@ -0,0 +1,134 @@ +createElement( 'text', 'name' ); + $name->addValidator( 'stringLength', false, array( 1, 255 ) ) + ->setRequired( true ) + ->setLabel( 'Name' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $name ); + + + + + $dbCusts = Doctrine_Query::create() + ->from( 'Cust c' ) + ->orderBy( 'c.name ASC' ) + ->execute(); + + $custs = array( '0' => '' ); + $maxId = 0; + + foreach( $dbCusts as $c ) + { + $custs[ $c['id'] ] = "{$c['name']}"; + if( $c['id'] > $maxId ) $maxId = $c['id']; + } + + $cust = $this->createElement( 'select', 'custid' ); + $cust->setMultiOptions( $custs ); + $cust->setRegisterInArrayValidator( true ) + ->setRequired( true ) + ->setLabel( 'Customer' ) + ->addValidator( 'between', false, array( 1, $maxId ) ) + ->setErrorMessages( array( 'Please select a customer' ) ); + + $this->addElement( $cust ); + + + + + + $dbCabinets = Doctrine_Query::create() + ->from( 'Cabinet' ) + ->execute(); + + $cabinets = array( '0' => '' ); + $maxId = 0; + + foreach( $dbCabinets as $c ) + { + $cabinets[ $c['id'] ] = "{$c->Location->name} :: {$c['name']}"; + if( $c['id'] > $maxId ) $maxId = $c['id']; + } + + $cabinet = $this->createElement( 'select', 'cabinetid' ); + $cabinet->setMultiOptions( $cabinets ); + $cabinet->setRegisterInArrayValidator( true ) + ->setLabel( 'Cabinet' ) + ->addValidator( 'between', false, array( 1, $maxId ) ) + ->setErrorMessages( array( 'Please select a cabinet' ) ); + + $this->addElement( $cabinet ); + + + + + + + $descr = $this->createElement( 'textarea', 'descr' ); + $descr->setLabel( 'Description' ) + ->setRequired( false ) + ->addFilter( new INEX_Filter_StripSlashes() ) + ->setAttrib( 'cols', 60 ) + ->setAttrib( 'rows', 5 ); + $this->addElement( $descr ); + + + $this->addElement( 'button', 'cancel', array( 'label' => 'Cancel', 'onClick' => "parent.location='" + . $cancelLocation . "'" ) ); + $this->addElement( 'submit', 'commit', array( 'label' => 'Add' ) ); + + } + +} + +?> \ No newline at end of file diff --git a/library/INEX/Form/Customer.php b/library/INEX/Form/Customer.php new file mode 100644 index 000000000..2e4721560 --- /dev/null +++ b/library/INEX/Form/Customer.php @@ -0,0 +1,376 @@ +setAttrib( 'accept-charset', 'UTF-8' ); + $this->setAttrib( 'class', 'form' ); + + $this->setElementDecorators( + array( + 'ViewHelper', + 'Errors', + array( 'HtmlTag', array( 'tag' => 'dd' ) ), + array( 'Label', array( 'tag' => 'dt' ) ), + ) + ); + + + //////////////////////////////////////////////// + // Create and configure name element + //////////////////////////////////////////////// + + $name = $this->createElement( 'text', 'name' ); + $name->addValidator( 'stringLength', false, array( 1, 255 ) ) + ->setRequired( true ) + ->setLabel( 'Name' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $name ); + + //////////////////////////////////////////////// + // Create and configure type element + //////////////////////////////////////////////// + + $type = $this->createElement( 'select', 'type' ); + $type->setMultiOptions( + array( + '0' => '', + '1' => 'Full Member', + '2' => 'Associate', + '3' => 'IXP Internal Infrastructure', + '4' => 'Pro-Bono Service' + ) + ); + $type->setRegisterInArrayValidator( true ) + ->setLabel( 'Type' ) + ->addValidator( 'between', false, array( 1, 4 ) ) + ->setErrorMessages( array( 'Please select a customer type' ) ); + + $this->addElement( $type ); + + //////////////////////////////////////////////// + // Create and configure shortname element + //////////////////////////////////////////////// + + $shortname = $this->createElement( 'text', 'shortname' ); + $shortname->addValidator( 'stringLength', false, array( 1, 255 ) ) + ->addValidator('alnum') + ->addValidator( 'regex', false, array('/^[a-z0-9]+/' ) ) + ->setRequired( true ) + ->setLabel( 'Short Name' ) + ->addFilter( 'StringToLower' ) + ->addFilter( 'StringTrim' ); + + $this->addElement( $shortname ); + + + $corpwww = $this->createElement( 'text', 'corpwww' ); + $corpwww->addValidator( 'stringLength', false, array( 0, 255 ) ) + ->setRequired( false ) + ->setLabel( 'Corporate Website' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + $this->addElement( $corpwww ); + + $datejoin = $this->createElement( 'text', 'datejoin' ); + $datejoin->addValidator( 'stringLength', false, array( 10, 10 ) ) + ->addValidator( 'regex', false, array('/^\d\d\d\d-\d\d-\d\d/' ) ) + ->setRequired( false ) + ->setLabel( 'Date Joined (YYYY-MM-DD)' ) + ->addFilter( 'StringTrim' ) + ->addDecorators( + array( + array( 'Callback', + array( + 'callback' => array( 'INEX_Form_Customer', 'addYUICalanderDiv' ), + 'placement' => 'append', + 'id' => 'datejoinContainer' + ) + ) + ) + ) + ->setAttrib( 'id', 'datejoin' ); + $this->addElement( $datejoin ); + + $dateleave = $this->createElement( 'text', 'dateleave' ); + $dateleave->addValidator( 'stringLength', false, array( 10, 10 ) ) + ->addValidator( 'regex', false, array('/^\d\d\d\d-\d\d-\d\d/' ) ) + ->setRequired( false ) + ->setLabel( 'Date Left (YYYY-MM-DD)' ) + ->addFilter( 'StringTrim' ); + $this->addElement( $dateleave ); + + $status = $this->createElement( 'select', 'status' ); + $status->setMultiOptions( + array( + '0' => '', + '1' => 'Normal', + '2' => 'Not Connected', + '3' => 'Suspended' + ) + ); + + $status->setRegisterInArrayValidator( true ) + ->setLabel( 'Status' ) + ->setRequired( true ) + ->addValidator( 'between', false, array( 1, 3 ) ) + ->setErrorMessages( array( 'Please set the customer\'s status' ) ); + $this->addElement( $status ); + + + + $autsys = $this->createElement( 'text', 'autsys' ); + $autsys->addValidator('int') + ->addValidator( 'greaterThan', false, array( -1 ) ) + ->setRequired( false ) + ->setLabel( 'AS Number' ); + $this->addElement( $autsys ); + + $maxprefixes = $this->createElement( 'text', 'maxprefixes' ); + $maxprefixes->addValidator('int') + ->addValidator( 'greaterThan', false, array( -1 ) ) + ->setRequired( false ) + ->setLabel( 'Max Prefixes' ); + $this->addElement( $maxprefixes ); + + $peeringemail = $this->createElement( 'text', 'peeringemail' ); + $peeringemail->addValidator('emailAddress' ) + ->addValidator( 'stringLength', false, array( 0, 64 ) ) + ->setRequired( false ) + ->setLabel( 'Peering E-Mail' ); + $this->addElement( $peeringemail ); + + $peeringpolicy = $this->createElement( 'text', 'peeringpolicy' ); + $peeringpolicy->addValidator( 'stringLength', false, array( 0, 255 ) ) + ->setRequired( false ) + ->setLabel( 'Peering Policy' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + $this->addElement( $peeringpolicy ); + + $peeringmacro = $this->createElement( 'text', 'peeringmacro' ); + $peeringmacro->addValidator( 'stringLength', false, array( 0, 255 ) ) + ->setRequired( false ) + ->setLabel( 'Peering Macro' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + $this->addElement( $peeringmacro ); + + + + $irrdb = $this->createElement( 'select', 'irrdb' ); + + $maxIrrdbId = $this->createSelectFromDatabaseTable( $irrdb, 'Irrdbconfig', 'id', + array( 'source', 'host' ), + 'source' + ); + + $irrdb->setRegisterInArrayValidator( true ) + ->setRequired( false ) + ->setLabel( 'IRRDB' ) + ->addValidator( 'between', false, array( 1, $maxIrrdbId ) ) + ->setErrorMessages( array( 'Please select an IRRDB' ) ); + + $this->addElement( $irrdb ); + + + + $activepeeringmatrix = $this->createElement( 'checkbox', 'activepeeringmatrix' ); + $activepeeringmatrix->setLabel( 'Active Peering Matrix' ) + ->setCheckedValue( '1' ); + $this->addElement( $activepeeringmatrix ); + + + $this->addDisplayGroup( + array( + 'autsys', 'maxprefixes', 'peeringemail', 'peeringmacro', 'peeringpolicy', 'irrdb', 'activepeeringmatrix' + ), + 'peeringDisplayGroup' + ); + $this->getDisplayGroup( 'peeringDisplayGroup' )->setLegend( 'Peering Details' ); + + $nocphone = $this->createElement( 'text', 'nocphone' ); + $nocphone->addValidator( 'stringLength', false, array( 0, 255 ) ) + ->setRequired( false ) + ->setLabel( 'NOC Phone' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + $this->addElement( $nocphone ); + + $noc24hphone = $this->createElement( 'text', 'noc24hphone' ); + $noc24hphone->addValidator( 'stringLength', false, array( 0, 255 ) ) + ->setRequired( false ) + ->setLabel( 'NOC 24h Phone' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + $this->addElement( $noc24hphone ); + + $nocfax = $this->createElement( 'text', 'nocfax' ); + $nocfax->addValidator( 'stringLength', false, array( 0, 40 ) ) + ->setRequired( false ) + ->setLabel( 'NOC Fax' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + $this->addElement( $nocfax ); + + $nocemail = $this->createElement( 'text', 'nocemail' ); + $nocemail->addValidator('emailAddress' ) + ->addValidator( 'stringLength', false, array( 0, 40 ) ) + ->setRequired( false ) + ->setLabel( 'NOC E-Mail' ); + $this->addElement( $nocemail ); + + $nochours = $this->createElement( 'text', 'nochours' ); + $nochours->addValidator( 'stringLength', false, array( 0, 40 ) ) + ->setRequired( false ) + ->setLabel( 'NOC Hours' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + $this->addElement( $nochours ); + + $nocwww = $this->createElement( 'text', 'nocwww' ); + $nocwww->addValidator( 'stringLength', false, array( 0, 255 ) ) + ->setRequired( false ) + ->setLabel( 'NOC WWW' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + $this->addElement( $nocwww ); + + $this->addDisplayGroup( + array( 'nocphone', 'noc24hphone', 'nocfax', 'nocemail', 'nochours', 'nocwww' ), + 'nocDisplayGroup' + ); + $this->getDisplayGroup( 'nocDisplayGroup' )->setLegend( 'NOC Details' ); + + $billingContact = $this->createElement( 'text', 'billingContact' ); + $billingContact->addValidator( 'stringLength', false, array( 0, 64 ) ) + ->setRequired( false ) + ->setLabel( 'Billing Contact' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + $this->addElement( $billingContact ); + + $billingAddress1 = $this->createElement( 'text', 'billingAddress1' ); + $billingAddress1->addValidator( 'stringLength', false, array( 0, 64 ) ) + ->setRequired( false ) + ->setLabel( 'Billing Address (1)' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + $this->addElement( $billingAddress1 ); + + $billingAddress2 = $this->createElement( 'text', 'billingAddress2' ); + $billingAddress2->addValidator( 'stringLength', false, array( 0, 64 ) ) + ->setRequired( false ) + ->setLabel( 'Billing Address (2)' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + $this->addElement( $billingAddress2 ); + + $billingCity = $this->createElement( 'text', 'billingCity' ); + $billingCity->addValidator( 'stringLength', false, array( 0, 64 ) ) + ->setRequired( false ) + ->setLabel( 'Billing City' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + $this->addElement( $billingCity ); + + $billingCountry = $this->createElement( 'text', 'billingCountry' ); + $billingCountry->addValidator( 'stringLength', false, array( 0, 2 ) ) + ->setRequired( false ) + ->setLabel( 'Billing Country' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + $this->addElement( $billingCountry ); + + $this->addDisplayGroup( + array( 'billingContact', 'billingAddress1', 'billingAddress2', 'billingCity', 'billingCountry' ), + 'billingDisplayGroup' + ); + $this->getDisplayGroup( 'billingDisplayGroup' )->setLegend( 'Billing Details' ); + + + $notes = $this->createElement( 'textarea', 'notes' ); + $notes->setLabel( 'Notes' ) + ->setRequired( false ) + ->addFilter( new INEX_Filter_StripSlashes() ) + ->setAttrib( 'cols', 60 ) + ->setAttrib( 'rows', 5 ); + $this->addElement( $notes ); + + $this->addElement( 'button', 'cancel', array( 'label' => 'Cancel', 'onClick' => "parent.location='" . Zend_Controller_Front::getInstance()->getBaseUrl() . "/customer/list'" ) ); + + $this->addElement( 'submit', 'commit', array( 'label' => 'Add New Customer' ) ); + + } + + public function assignFormToModel( $model ) + { + $columns = Doctrine::getTable( "Cust" )->getFieldNames(); + + foreach( $this->getElements() as $elementName => $elementConfig ) + if( in_array( $elementName, $columns ) ) + $model->$elementName = $this->getValue( $elementName ); + + return $model; + } + + public function assignModelToForm( $model ) + { + $columns = Doctrine::getTable( "Cust" )->getFieldNames(); + + foreach( $this->getElements() as $elementName => $elementConfig ) + if( in_array( $elementName, $columns ) ) + $this->getElement( $elementName )->setValue( $model->$elementName ); + + return $this; + } + + public static function addYUICalanderDiv( $content, $element, array $options ) + { + return "
"; + } + +} + diff --git a/library/INEX/Form/Customer/SendWelcomeEmail.php b/library/INEX/Form/Customer/SendWelcomeEmail.php new file mode 100644 index 000000000..e3d851c1f --- /dev/null +++ b/library/INEX/Form/Customer/SendWelcomeEmail.php @@ -0,0 +1,133 @@ +setAttrib( 'accept-charset', 'UTF-8' ); + $this->setAttrib( 'class', 'form' ); + + $this->setElementDecorators( + array( + 'ViewHelper', + 'Errors', + array( 'HtmlTag', array( 'tag' => 'dd' ) ), + array( 'Label', array( 'tag' => 'dt' ) ), + ) + ); + + + $to = $this->createElement( 'text', 'to', + array( + 'size' => 100 + ) + ); + $to->addValidator( 'stringLength', false, array( 1, 4096 ) ) + ->setRequired( true ) + ->setLabel( 'To' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $to ); + + $cc = $this->createElement( 'text', 'cc', + array( + 'size' => 100 + ) + ); + + $cc->addValidator( 'stringLength', false, array( 1, 4096 ) ) + ->setRequired( false ) + ->setLabel( 'CC' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $cc ); + + $bcc = $this->createElement( 'text', 'bcc', + array( + 'size' => 100 + ) + ); + + $bcc->addValidator( 'stringLength', false, array( 1, 4096 ) ) + ->setRequired( false ) + ->setLabel( 'BCC' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $bcc ); + + $subject = $this->createElement( 'text', 'subject', + array( + 'size' => 100 + ) + ); + + $subject->addValidator( 'stringLength', false, array( 1, 4096 ) ) + ->setRequired( true ) + ->setLabel( 'Subject' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $subject ); + + + $message = $this->createElement( 'textarea', 'message', + array( + 'cols' => 100, + 'rows' => 12, + 'style' => 'font-family:monospace;' + ) + ); + + $message->addValidator( 'stringLength', false, array( 1, 40960 ) ) + ->setRequired( true ) + ->setLabel( 'Message' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $message ); + + + + + $this->addElement( 'button', 'cancel', array( 'label' => 'Cancel', 'onClick' => "parent.location='$cancelLocation'" ) ); + $this->addElement( 'submit', 'commit', array( 'label' => 'Send Welcome Email' ) ); + } + +} diff --git a/library/INEX/Form/IrrdbConfig.php b/library/INEX/Form/IrrdbConfig.php new file mode 100644 index 000000000..f7475b859 --- /dev/null +++ b/library/INEX/Form/IrrdbConfig.php @@ -0,0 +1,99 @@ +createElement( 'text', 'host' ); + $host->addValidator( 'stringLength', false, array( 1, 255 ) ) + ->setRequired( true ) + ->setLabel( 'Host' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $host ); + + + $protocol = $this->createElement( 'text', 'protocol' ); + $protocol->addValidator( 'stringLength', false, array( 1, 10 ) ) + ->setRequired( true ) + ->setLabel( 'Protocol' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $protocol ); + + + $source = $this->createElement( 'text', 'source' ); + $source->addValidator( 'stringLength', false, array( 1, 50 ) ) + ->setRequired( true ) + ->setLabel( 'Source' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $source ); + + + + + $notes = $this->createElement( 'textarea', 'notes' ); + $notes->setLabel( 'Notes' ) + ->setRequired( false ) + ->addFilter( new INEX_Filter_StripSlashes() ) + ->setAttrib( 'cols', 60 ) + ->setAttrib( 'rows', 5 ); + + $this->addElement( $notes ); + + + $this->addElement( 'button', 'cancel', array( 'label' => 'Cancel', 'onClick' => "parent.location='" + . $cancelLocation . "'" ) ); + $this->addElement( 'submit', 'commit', array( 'label' => 'Add' ) ); + + } + +} + diff --git a/library/INEX/Form/Location.php b/library/INEX/Form/Location.php new file mode 100644 index 000000000..374315519 --- /dev/null +++ b/library/INEX/Form/Location.php @@ -0,0 +1,163 @@ +createElement( 'text', 'name' ); + $name->addValidator( 'stringLength', false, array( 1, 255 ) ) + ->setRequired( true ) + ->setLabel( 'Name' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $name ); + + + $shortname = $this->createElement( 'text', 'shortname' ); + $shortname->addValidator( 'stringLength', false, array( 1, 255 ) ) + ->setRequired( true ) + ->setLabel( 'Short Name' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $shortname ); + + $address = $this->createElement( 'textarea', 'address' ); + $address->addValidator( 'stringLength', false, array( 1, 255 ) ) + ->setLabel( 'Address' ) + ->addFilter( new INEX_Filter_StripSlashes() ) + ->setAttrib( 'cols', 60 ) + ->setAttrib( 'rows', 5 ); + + $this->addElement( $address ); + + $nocphone = $this->createElement( 'text', 'nocphone' ); + $nocphone->addValidator( 'stringLength', false, array( 0, 255 ) ) + ->setRequired( false ) + ->setLabel( 'Phone' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + $this->addElement( $nocphone ); + + $nocfax = $this->createElement( 'text', 'nocfax' ); + $nocfax->addValidator( 'stringLength', false, array( 0, 255 ) ) + ->setRequired( false ) + ->setLabel( 'Fax' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + $this->addElement( $nocfax ); + + $nocemail = $this->createElement( 'text', 'nocemail' ); + $nocemail->addValidator('emailAddress' ) + ->addValidator( 'stringLength', false, array( 0, 255 ) ) + ->setRequired( false ) + ->setLabel( 'E-Mail' ); + $this->addElement( $nocemail ); + + + $this->addDisplayGroup( + array( 'nocphone', 'nocfax', 'nocemail' ), + 'nocDisplayGroup' + ); + $this->getDisplayGroup( 'nocDisplayGroup' )->setLegend( 'NOC Details' ); + + + + $officephone = $this->createElement( 'text', 'officephone' ); + $officephone->addValidator( 'stringLength', false, array( 0, 255 ) ) + ->setRequired( false ) + ->setLabel( 'Phone' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + $this->addElement( $officephone ); + + $officefax = $this->createElement( 'text', 'officefax' ); + $officefax->addValidator( 'stringLength', false, array( 0, 255 ) ) + ->setRequired( false ) + ->setLabel( 'Fax' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + $this->addElement( $officefax ); + + $officeemail = $this->createElement( 'text', 'officeemail' ); + $officeemail->addValidator('emailAddress' ) + ->addValidator( 'stringLength', false, array( 0, 255 ) ) + ->setRequired( false ) + ->setLabel( 'E-Mail' ); + $this->addElement( $officeemail ); + + $this->addDisplayGroup( + array( 'officephone', 'officefax', 'officeemail' ), + 'officeDisplayGroup' + ); + $this->getDisplayGroup( 'officeDisplayGroup' )->setLegend( 'Office Details' ); + + + $notes = $this->createElement( 'textarea', 'notes' ); + $notes->setLabel( 'Notes' ) + ->setRequired( false ) + ->addFilter( new INEX_Filter_StripSlashes() ) + ->setAttrib( 'cols', 60 ) + ->setAttrib( 'rows', 5 ); + $this->addElement( $notes ); + + + $this->addElement( 'button', 'cancel', array( 'label' => 'Cancel', 'onClick' => "parent.location='" + . $cancelLocation . "'" ) ); + $this->addElement( 'submit', 'commit', array( 'label' => 'Add' ) ); + + } + + + public static function addYUICalanderDiv( $content, $element, array $options ) + { + return "
"; + } + +} + +?> \ No newline at end of file diff --git a/library/INEX/Form/LogicalCircuit.php b/library/INEX/Form/LogicalCircuit.php new file mode 100644 index 000000000..a02f717df --- /dev/null +++ b/library/INEX/Form/LogicalCircuit.php @@ -0,0 +1,132 @@ +setAttrib( 'accept-charset', 'UTF-8' ); + $this->setAttrib( 'class', 'form' ); + + $this->setDecorators( + array( + array( 'ViewScript', array( 'viewScript' => 'logical-circuit/form/add-edit.tpl' ) ) + ) + ); + + + + $our_ref = $this->createElement( 'text', 'our_ref' ); + $our_ref->addValidator( 'stringLength', false, array( 1, 255 ) ) + ->setRequired( true ) + ->setLabel( 'Our Reference' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ) + ->addErrorMessage( 'Our Reference is required (and must be a string and less than 255 characters)' ); + + $this->addElement( $our_ref ); + + + + $installed = $this->createElement( 'text', 'installed' ); + $installed->addValidator( 'stringLength', false, array( 10, 10 ) ) + ->addValidator( 'regex', false, array('/^\d\d\d\d-\d\d-\d\d/' ) ) + ->setRequired( true ) + ->setLabel( 'Installed (YYYY-MM-DD)' ) + ->addFilter( 'StringTrim' ) + ->addErrorMessage( 'An installed data is required (and must be of the form YYYY-MM-DD)' ); + + $this->addElement( $installed ); + + $removed = $this->createElement( 'text', 'removed' ); + $removed->addValidator( 'stringLength', false, array( 10, 10 ) ) + ->addValidator( 'regex', false, array('/^\d\d\d\d-\d\d-\d\d/' ) ) + ->setRequired( false ) + ->setLabel( 'Removed (YYYY-MM-DD)' ) + ->addFilter( 'StringTrim' ); + + $this->addElement( $removed ); + + + + $cust = $this->createElement( 'select', 'custid' ); + + $maxId = $this->createSelectFromDatabaseTable( $cust, 'Cust', 'id', 'name', 'name' ); + + $cust->setRegisterInArrayValidator( true ) + ->setRequired( true ) + ->setLabel( 'Customer' ) + ->addValidator( 'between', false, array( 1, $maxId ) ) + ->setErrorMessages( array( 'Please select a customer' ) ); + + $this->addElement( $cust ); + + + $notes = $this->createElement( 'textarea', 'notes' ); + $notes->setLabel( 'Notes' ) + ->setRequired( false ) + ->addFilter( new INEX_Filter_StripSlashes() ) + ->setAttrib( 'cols', 60 ) + ->setAttrib( 'rows', 5 ); + + $this->addElement( $notes ); + + + $this->addElement( 'button', 'cancel', array( 'label' => 'Cancel', 'onClick' => "parent.location='" . Zend_Controller_Front::getInstance()->getBaseUrl() . "/logical-circuit/list'" ) ); + + $this->addElement( 'submit', 'commit', array( 'label' => 'Add New Circuit' ) ); + + $this->setElementDecorators( + array( + 'ViewHelper' + ) + ); + + $this->setSubFormDecorators( + array( 'FormElements' ) + ); + + } + + +} + +?> \ No newline at end of file diff --git a/library/INEX/Form/Meeting.php b/library/INEX/Form/Meeting.php new file mode 100644 index 000000000..a13980db4 --- /dev/null +++ b/library/INEX/Form/Meeting.php @@ -0,0 +1,127 @@ +setAttrib( 'accept-charset', 'UTF-8' ); + $this->setAttrib( 'class', 'form' ); + + //////////////////////////////////////////////// + // Create and configure title element + //////////////////////////////////////////////// + + $title = $this->createElement( 'text', 'title', array( 'size' => '100' ) ); + $title->addValidator( 'stringLength', false, array( 1, 255 ) ) + ->setRequired( true ) + ->setLabel( 'Title' ) + ->setValue( 'Members\' Meeting' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $title ); + + $before_text = $this->createElement( 'textarea', 'before_text' ); + $before_text->setLabel( 'Preamble' ) + ->setRequired( false ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ) + ->setAttrib( 'cols', 120 ) + ->setAttrib( 'rows', 10 ); + $this->addElement( $before_text ); + + $after_text = $this->createElement( 'textarea', 'after_text' ); + $after_text->setLabel( 'Postamble' ) + ->setRequired( false ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ) + ->setAttrib( 'cols', 120 ) + ->setAttrib( 'rows', 10 ); + $this->addElement( $after_text ); + + $date = $this->createElement( 'text', 'date' ); + $date->addValidator( 'stringLength', false, array( 10, 10 ) ) + ->addValidator( 'regex', false, array('/^\d\d\d\d-\d\d-\d\d/' ) ) + ->setRequired( true ) + ->setLabel( 'Date' ) + ->setValue( 'YYYY-MM-DD' ) + ->addFilter( 'StringTrim' ); + $this->addElement( $date ); + + $time = $this->createElement( 'text', 'time' ); + $time->addValidator( 'stringLength', false, array( 5, 8 ) ) + ->addValidator( 'regex', false, array('/^\d\d:\d\d(:\d\d){0,1}/' ) ) + ->setRequired( true ) + ->setValue( 'HH:MM' ) + ->setLabel( 'Time' ) + ->addFilter( 'StringTrim' ); + $this->addElement( $time ); + + $venue = $this->createElement( 'text', 'venue', array( 'size' => '100' ) ); + $venue->addValidator( 'stringLength', false, array( 1, 255 ) ) + ->setRequired( true ) + ->setLabel( 'Venue' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $venue ); + + $venue_url = $this->createElement( 'text', 'venue_url', array( 'size' => '100' ) ); + $venue_url->addValidator( 'stringLength', false, array( 0, 255 ) ) + ->setRequired( false ) + ->setLabel( 'Venue URL' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ) + ->setValue( '' ); + + $this->addElement( $venue_url ); + + + $this->addElement( 'button', 'cancel', array( 'label' => 'Cancel', 'onClick' => "parent.location='" . Zend_Controller_Front::getInstance()->getBaseUrl() . "/customer/list'" ) ); + + $this->addElement( 'submit', 'commit', array( 'label' => 'Add' ) ); + + } + +} + +?> \ No newline at end of file diff --git a/library/INEX/Form/MeetingItem.php b/library/INEX/Form/MeetingItem.php new file mode 100644 index 000000000..b799c69a4 --- /dev/null +++ b/library/INEX/Form/MeetingItem.php @@ -0,0 +1,165 @@ +setAttrib( 'accept-charset', 'UTF-8' ); + $this->setAttrib( 'enctype', 'multipart/form-data' ); + $this->setAttrib( 'class', 'form' ); + + //////////////////////////////////////////////// + // Create and configure title element + //////////////////////////////////////////////// + + $meeting = $this->createElement( 'select', 'meeting_id' ); + + $maxMeetingId = $this->createSelectFromDatabaseTable( $meeting, 'Meeting', 'id', + array( 'title', 'date' ), + 'date' + ); + + $meeting->setRegisterInArrayValidator( true ) + ->setRequired( true ) + ->setLabel( 'Meeting' ) + ->addValidator( 'between', false, array( 1, $maxMeetingId ) ) + ->setErrorMessages( array( 'Please select a meeting' ) ); + + $this->addElement( $meeting ); + + + $title = $this->createElement( 'text', 'title', array( 'size' => '100' ) ); + $title->addValidator( 'stringLength', false, array( 1, 255 ) ) + ->setRequired( true ) + ->setLabel( 'Title' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $title ); + + $name = $this->createElement( 'text', 'name', array( 'size' => '100' ) ); + $name->addValidator( 'stringLength', false, array( 1, 255 ) ) + ->setRequired( true ) + ->setLabel( 'Name' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $name ); + + $role = $this->createElement( 'text', 'role', array( 'size' => '100' ) ); + $role->addValidator( 'stringLength', false, array( 1, 255 ) ) + ->setRequired( false ) + ->setLabel( 'Role' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $role ); + + $email = $this->createElement( 'text', 'email', array( 'size' => '100' ) ); + $email->addValidator( 'stringLength', false, array( 1, 255 ) ) + ->setRequired( false ) + ->setLabel( 'E-Mail' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $email ); + + $company = $this->createElement( 'text', 'company', array( 'size' => '100' ) ); + $company->addValidator( 'stringLength', false, array( 1, 255 ) ) + ->setRequired( true ) + ->setLabel( 'Company' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $company ); + + $company_url = $this->createElement( 'text', 'company_url', array( 'size' => '100' ) ); + $company_url->addValidator( 'stringLength', false, array( 1, 255 ) ) + ->setRequired( false ) + ->setLabel( 'Company URL' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $company_url ); + + + $summary = $this->createElement( 'textarea', 'summary' ); + $summary->setLabel( 'Summary' ) + ->setRequired( false ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ) + ->setAttrib( 'cols', 100 ) + ->setAttrib( 'rows', 10 ); + $this->addElement( $summary ); + + $presentation = $this->createElement( 'file', 'presentation' ); + $presentation->setLabel( 'Attach Presentation' ) + ->setRequired( false ); + $this->addElement( $presentation ); + + $video_url = $this->createElement( 'text', 'video_url', array( 'size' => '100' ) ); + $video_url->addValidator( 'stringLength', false, array( 1, 255 ) ) + ->setRequired( false ) + ->setLabel( 'Video' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $video_url ); + + + $other_content = $this->createElement( 'checkbox', 'other_content' ); + $other_content->setLabel( 'Other Content?' ) + ->setRequired( false ); + $this->addElement( $other_content ); + + $this->addElement( 'button', 'cancel', array( 'label' => 'Cancel', 'onClick' => "parent.location='" . Zend_Controller_Front::getInstance()->getBaseUrl() . "/customer/list'" ) ); + + $this->addElement( 'submit', 'commit', array( 'label' => 'Add' ) ); + + // we shouldn't update the presentation file on an edit if it's blank + $this->onEditSkipIfBlank = array( 'presentation' ); + + } + +} + +?> \ No newline at end of file diff --git a/library/INEX/Form/PatchPanel.php b/library/INEX/Form/PatchPanel.php new file mode 100644 index 000000000..e1c186220 --- /dev/null +++ b/library/INEX/Form/PatchPanel.php @@ -0,0 +1,63 @@ +setSubFormDecorators( + array( + 'FormElements' + ) + ); + + // Add these sub forms in _AFTER_ setting the global sub form decorators as they define their own decorators during initialisation. + $this->addSubForm( new INEX_Form_SubForm_PatchPanel(), 'PatchPanelForm', 0 ); + $this->addSubForm( new INEX_Form_SubForm_PatchPanelAutoGen(), 'AutoGenForm', 1 ); + + if( $isEdit ) + $this->addSubForm( new INEX_Form_SubForm_AddEditCancel( null, $isEdit), 'AddEditCancelForm', 2 ); + else + $this->addSubForm( new INEX_Form_SubForm_AddCancel(), 'AddCancelForm', 2 ); + } + +} + diff --git a/library/INEX/Form/PatchPanelPorts.php b/library/INEX/Form/PatchPanelPorts.php new file mode 100644 index 000000000..524e31c4a --- /dev/null +++ b/library/INEX/Form/PatchPanelPorts.php @@ -0,0 +1,55 @@ +addElement( 'button', 'cancel', + array( 'label' => 'Cancel', 'onClick' => "parent.location='" . $cancelLocation . "'" ) + ); + + $this->addElement( 'submit', 'commit2', array( 'label' => 'Add' ) ); + } + +} + diff --git a/library/INEX/Form/PhysicalInterface.php b/library/INEX/Form/PhysicalInterface.php new file mode 100644 index 000000000..3e0eb1cf4 --- /dev/null +++ b/library/INEX/Form/PhysicalInterface.php @@ -0,0 +1,148 @@ +createElement( 'select', 'switchportid' ); + + $collection = Doctrine_Query::create() + ->from( 'Switchport sp' ) + ->leftJoin( 'sp.SwitchTable s' ) + ->leftJoin( 'sp.Physicalinterface pi' ) + ->where( 'pi.id IS NULL' ) + ->orWhere( 'pi.id = ?', Zend_Controller_Front::getInstance()->getRequest()->getParam( 'id' ) ) + ->orderBy( 's.name ASC, sp.name ASC' ) + ->execute(); + + $options = array( '0' => '' ); + $maxId = 0; + + foreach( $collection as $c ) + { + $options[ $c['id'] ] = "{$c['SwitchTable']['name']} - {$c['name']} - (" . Switchport::$TYPE_TEXT[$c['type']] . ')'; + + if( $c['id'] > $maxId ) $maxId = $c['id']; + } + + + + $switchPorts->setMultiOptions( $options ) + ->setRegisterInArrayValidator( true ) + ->setRequired( true ) + ->setLabel( 'Port' ) + ->addValidator( 'between', false, array( 1, $maxId ) ) + ->setErrorMessages( array( 'Please select a switch port' ) ); + $this->addElement( $switchPorts ); + + + + $virtualInterface = $this->createElement( 'hidden', 'virtualinterfaceid' ); + $this->addElement( $virtualInterface ); + + + $status = $this->createElement( 'select', 'status' ); + $status->setMultiOptions( Physicalinterface::$STATES_TEXT ) + ->setRegisterInArrayValidator( true ) + ->setLabel( 'Status' ) + ->setErrorMessages( array( 'Please set the status' ) ); + + $this->addElement( $status ); + + + + + $speed = $this->createElement( 'select', 'speed' ); + $speed->setMultiOptions( Physicalinterface::$SPEED ) + ->setRegisterInArrayValidator( true ) + ->setLabel( 'Speed' ) + ->setErrorMessages( array( 'Please set the speed' ) ); + + $this->addElement( $speed ); + + + $duplex = $this->createElement( 'select', 'duplex' ); + $duplex->setMultiOptions( Physicalinterface::$DUPLEX ) + ->setRegisterInArrayValidator( true ) + ->setLabel( 'Duplex' ) + ->setErrorMessages( array( 'Please set the duplex' ) ); + + $this->addElement( $duplex ); + + + + + + $monitorindex = $this->createElement( 'text', 'monitorindex' ); + $monitorindex->addValidator( 'int' ) + ->setLabel( 'Monitor Index' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + $this->addElement( $monitorindex ); + + + + + $notes = $this->createElement( 'textarea', 'notes' ); + $notes->setLabel( 'Notes' ) + ->setRequired( false ) + ->addFilter( new INEX_Filter_StripSlashes() ) + ->setAttrib( 'cols', 60 ) + ->setAttrib( 'rows', 5 ); + $this->addElement( $notes ); + + + $this->addElement( 'button', 'cancel', array( 'label' => 'Cancel', 'onClick' => "parent.location='" + . $cancelLocation . "'" ) ); + + $this->addElement( 'submit', 'commit', array( 'label' => 'Add' ) ); + + + } + +} + +?> \ No newline at end of file diff --git a/library/INEX/Form/Profile.php b/library/INEX/Form/Profile.php new file mode 100644 index 000000000..a437a7e02 --- /dev/null +++ b/library/INEX/Form/Profile.php @@ -0,0 +1,99 @@ +createElement( 'text', 'username', + array( + 'readonly' => 'readonly', + 'size' => '50' + ) + ); + $username->setLabel( 'Username' ); + + $this->addElement( $username ); + + $mobile = $this->createElement( 'text', 'mobile', array( 'size' => 50 ) ); + $mobile->addValidator( 'stringLength', false, array( 9, 30 ) ) + ->addValidator( 'digits', false ) + ->setRequired( true ) + ->setLabel( 'Mobile Number' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $mobile ); + + $email = $this->createElement( 'text', 'email', array( 'size' => 50 ) ); + $email->addValidator( 'stringLength', false, array( 0, 255 ) ) + ->addValidator( 'emailAddress', false, array( 'domain' => true, 'mx' => true ) ) + ->setRequired( true ) + ->setLabel( 'E-Mail' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $email ); + + $submit = $this->createElement( 'submit', 'submit', array( 'label' => 'Change' ) ); + $this->addElement( $submit ); + + $this->addDisplayGroup( + array( 'username', 'email', 'mobile', 'submit' ), + 'profileDisplayGroup' + ); + + $this->getDisplayGroup( 'profileDisplayGroup' )->setLegend( 'Change Your Profile' ); + + } + + +} + +?> \ No newline at end of file diff --git a/library/INEX/Form/ProfilePassword.php b/library/INEX/Form/ProfilePassword.php new file mode 100644 index 000000000..4ec7a8231 --- /dev/null +++ b/library/INEX/Form/ProfilePassword.php @@ -0,0 +1,99 @@ +createElement( 'password', 'oldpassword' ); + $oldpassword->addValidator( 'stringLength', false, array( 1, 30 ) ) + ->setRequired( true ) + ->setLabel( 'Current Password' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $oldpassword ); + + $password1 = $this->createElement( 'password', 'password1' ); + $password1->addValidator( 'stringLength', false, array( 8, 30 ) ) + ->addValidator( 'regex', true, array( '/^[a-zA-Z0-9\!\£\$\%\^\&\*\(\)\-\=\_\+\{\}\[\]\;\'\#\:\@\~\,\.\/\<\>\?\|]+$/' ) ) + ->setRequired( true ) + ->setLabel( 'New Password' ) + ->setErrorMessages( array( 'The password must between 8 and 30 characters and cannot contain a double quote - " - character.' ) ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $password1 ); + + $password2 = $this->createElement( 'password', 'password2' ); + $password2->addValidator( 'stringLength', false, array( 8, 30 ) ) + ->setRequired( true ) + ->setLabel( 'Confirm New Password' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $password2 ); + + $submit = $this->createElement( 'submit', 'submit', array( 'label' => 'Change' ) ); + $this->addElement( $submit ); + + + $this->addDisplayGroup( + array( 'oldpassword', 'password1', 'password2', 'submit' ), + 'passwordDisplayGroup' + ); + + $this->getDisplayGroup( 'passwordDisplayGroup' )->setLegend( 'Change Your Password' ); + + } + + +} + +?> \ No newline at end of file diff --git a/library/INEX/Form/Provision/InterfaceEmail.php b/library/INEX/Form/Provision/InterfaceEmail.php new file mode 100644 index 000000000..1cf91c76e --- /dev/null +++ b/library/INEX/Form/Provision/InterfaceEmail.php @@ -0,0 +1,133 @@ +setAttrib( 'accept-charset', 'UTF-8' ); + $this->setAttrib( 'class', 'form' ); + + $this->setElementDecorators( + array( + 'ViewHelper', + 'Errors', + array( 'HtmlTag', array( 'tag' => 'dd' ) ), + array( 'Label', array( 'tag' => 'dt' ) ), + ) + ); + + + $to = $this->createElement( 'text', 'to', + array( + 'size' => 100 + ) + ); + $to->addValidator( 'stringLength', false, array( 1, 4096 ) ) + ->setRequired( true ) + ->setLabel( 'To' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $to ); + + $cc = $this->createElement( 'text', 'cc', + array( + 'size' => 100 + ) + ); + + $cc->addValidator( 'stringLength', false, array( 1, 4096 ) ) + ->setRequired( false ) + ->setLabel( 'CC' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $cc ); + + $bcc = $this->createElement( 'text', 'bcc', + array( + 'size' => 100 + ) + ); + + $bcc->addValidator( 'stringLength', false, array( 1, 4096 ) ) + ->setRequired( false ) + ->setLabel( 'BCC' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $bcc ); + + $subject = $this->createElement( 'text', 'subject', + array( + 'size' => 100 + ) + ); + + $subject->addValidator( 'stringLength', false, array( 1, 4096 ) ) + ->setRequired( true ) + ->setLabel( 'Subject' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $subject ); + + + $message = $this->createElement( 'textarea', 'message', + array( + 'cols' => 100, + 'rows' => 12, + 'style' => 'font-family:monospace;' + ) + ); + + $message->addValidator( 'stringLength', false, array( 1, 40960 ) ) + ->setRequired( true ) + ->setLabel( 'Message' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $message ); + + + + + $this->addElement( 'button', 'cancel', array( 'label' => 'Cancel', 'onClick' => "parent.location='$cancelLocation'" ) ); + $this->addElement( 'submit', 'commit', array( 'label' => 'Send' ) ); + } + +} diff --git a/library/INEX/Form/SubForm.php b/library/INEX/Form/SubForm.php new file mode 100644 index 000000000..e0df35bd5 --- /dev/null +++ b/library/INEX/Form/SubForm.php @@ -0,0 +1,75 @@ +hasIdentity() ) + // $identity = $auth->getIdentity(); + // else + // return false; + + //$identity['user']['privs'] + + + $columns = Doctrine::getTable( $controller->getModelName() )->getFieldNames(); + + foreach( $this->getElements() as $elementName => $elementConfig ) + if( in_array( $elementName, $columns ) ) + $model->$elementName = $this->getValue( $elementName ); + + return $model; + } + + public function assignModelToForm( $model, $controller ) + { + $columns = Doctrine::getTable( $controller->getModelName() )->getFieldNames(); + + foreach( $this->getElements() as $elementName => $elementConfig ) + if( in_array( $elementName, $columns ) ) + $this->getElement( $elementName )->setValue( $model->$elementName ); + + return $this; + } + +} + +?> \ No newline at end of file diff --git a/library/INEX/Form/SubForm/AddCancel.php b/library/INEX/Form/SubForm/AddCancel.php new file mode 100644 index 000000000..8a937cd23 --- /dev/null +++ b/library/INEX/Form/SubForm/AddCancel.php @@ -0,0 +1,66 @@ +setDecorators( + array( + array( 'ViewScript', array( 'viewScript' => 'form/add-cancel.tpl' ) ) + ) + ); + + + $this->setElementDecorators( + array( + 'ViewHelper' + ) + ); + + } + +} + +?> \ No newline at end of file diff --git a/library/INEX/Form/SubForm/AddEditCancel.php b/library/INEX/Form/SubForm/AddEditCancel.php new file mode 100644 index 000000000..ff9ff8f69 --- /dev/null +++ b/library/INEX/Form/SubForm/AddEditCancel.php @@ -0,0 +1,65 @@ +setDecorators( + array( + array( 'ViewScript', array( 'viewScript' => 'form/add-edit-cancel.tpl' ) ) + ) + ); + + + $this->setElementDecorators( + array( + 'ViewHelper' + ) + ); + + } + +} + +?> \ No newline at end of file diff --git a/library/INEX/Form/SubForm/PatchPanel.php b/library/INEX/Form/SubForm/PatchPanel.php new file mode 100644 index 000000000..49297e3b6 --- /dev/null +++ b/library/INEX/Form/SubForm/PatchPanel.php @@ -0,0 +1,151 @@ +setDecorators( + array( + array( 'ViewScript', array( 'viewScript' => 'patch-panel/form/patch-panel.tpl' ) ) + ) + ); + + //////////////////////////////////////////////// + // Create and configure elements + //////////////////////////////////////////////// + + $name = $this->createElement( 'text', 'name' ); + $name->addValidator( 'stringLength', false, array( 1, 255 ) ) + ->setAttrib('size', 50 ) + ->setAttrib('maxlength', 255) + ->setRequired( true ) + ->setLabel( 'Name' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ) + ->setErrorMessages( array( 'Name is required and cannot be empty' ) ); + + $this->addElement( $name ); + + + $dbCabinets = Doctrine_Query::create() + ->from( 'Cabinet' ) + ->orderBy( 'name ASC' ) + ->execute(); + + $cabinets = array( '0' => '' ); + $maxId = 0; + + foreach( $dbCabinets as $c ) + { + $cabinets[ $c['id'] ] = "{$c->Location->name} :: {$c['name']}"; + if( $c['id'] > $maxId ) $maxId = $c['id']; + } + + $cabinet = $this->createElement( 'select', 'cabinetid' ); + $cabinet->setMultiOptions( $cabinets ); + $cabinet->setRegisterInArrayValidator( true ) + ->setLabel( 'Cabinet' ) + ->addValidator( 'between', false, array( 1, $maxId ) ) + ->setErrorMessages( array( 'Please select a cabinet' ) ); + + $this->addElement( $cabinet ); + + + $colo_ref = $this->createElement( 'text', 'colo_ref' ); + $colo_ref->addValidator( 'stringLength', false, array( 1, 255 ) ) + ->setAttrib('size', 40 ) + ->setAttrib('maxlength', 255) + ->setRequired( true ) + ->setLabel( 'Colo Provider\'s Ref' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $colo_ref ); + + + $cable_type = $this->createElement( 'select', 'cable_type' ); + $cable_type->setMultiOptions( PatchPanelPort::$CABLES_TYPES ) + ->setRegisterInArrayValidator( true ) + ->addValidator( 'greaterThan', true, array( 0 ) ) + ->setLabel( 'Cable Type' ) + ->setErrorMessages( array( 'Please set the cable type' ) ); + + $this->addElement( $cable_type ); + + $interface_type = $this->createElement( 'select', 'interface_type' ); + $interface_type->setMultiOptions( PatchPanelPort::$INTERFACE_TYPES ) + ->setRegisterInArrayValidator( true ) + ->addValidator( 'greaterThan', true, array( 0 ) ) + ->setLabel( 'Interface Type' ) + ->setErrorMessages( array( 'Please set the interface type' ) ); + + $this->addElement( $interface_type ); + + + $allow_duplex = $this->createElement( 'checkbox', 'allow_duplex' ); + $allow_duplex->setLabel( 'Allow Duplex?' ); + + $this->addElement( $allow_duplex ); + + + $notes = $this->createElement( 'textarea', 'notes' ); + $notes->setLabel( 'Notes' ) + ->setRequired( false ) + ->addFilter( new INEX_Filter_StripSlashes() ) + ->setAttrib( 'cols', 80 ) + ->setAttrib( 'rows', 6 ); + $this->addElement( $notes ); + + + $this->setElementDecorators( + array( + 'ViewHelper' + ) + ); + + } + +} + +?> \ No newline at end of file diff --git a/library/INEX/Form/SubForm/PatchPanelAutoGen.php b/library/INEX/Form/SubForm/PatchPanelAutoGen.php new file mode 100644 index 000000000..4c973bead --- /dev/null +++ b/library/INEX/Form/SubForm/PatchPanelAutoGen.php @@ -0,0 +1,87 @@ +setDecorators( + array( + array( 'ViewScript', array( 'viewScript' => 'patch-panel/form/autogen.tpl' ) ) + ) + ); + + //////////////////////////////////////////////// + // Create and configure elements + //////////////////////////////////////////////// + + $autogen = $this->createElement( 'checkbox', 'cb_autogen' ); + $autogen->setLabel( 'Autogenerate ports for this patch panel?' ) + ->setAttrib( 'id', 'auto_gen_ports_cb' ); + + $this->addElement( $autogen ); + + $num_ports = $this->createElement( 'text', 'num_ports' ); + $num_ports->setAttrib('size', 4 ) + ->setAttrib( 'maxlength', 3 ) + ->setLabel( 'Number of Ports' ) + ->setErrorMessages( array( 'You must provide a numeric number of ports between 1 and 48' ) ); + + $this->addElement( $num_ports ); + + $edit = $this->createElement( 'checkbox', 'edit' ); + $edit->setLabel( 'Edit before committing to database?' ); + + $this->addElement( $edit ); + + $this->setElementDecorators( + array( + 'ViewHelper' + ) + ); + + } + +} + +?> \ No newline at end of file diff --git a/library/INEX/Form/SubForm/PatchPanelPort.php b/library/INEX/Form/SubForm/PatchPanelPort.php new file mode 100644 index 000000000..329ded660 --- /dev/null +++ b/library/INEX/Form/SubForm/PatchPanelPort.php @@ -0,0 +1,112 @@ +setDecorators( + array( + array( 'ViewScript', array( 'viewScript' => 'patch-panel/form/patch-panel-port.tpl' ) ) + ) + ); + + //////////////////////////////////////////////// + // Create and configure elements + //////////////////////////////////////////////// + + $port = $this->createElement( 'hidden', 'port' ); + $this->addElement( $port ); + + + $side = $this->createElement( 'hidden', 'side' ); + $this->addElement( $side ); + + $colo_ref = $this->createElement( 'text', 'colo_ref' ); + $colo_ref->addValidator( 'stringLength', false, array( 1, 255 ) ) + ->setAttrib('size', 40 ) + ->setAttrib('maxlength', 255) + ->setRequired( true ) + ->setLabel( 'Colo Provider\'s Ref' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ) + ->setErrorMessages( array( 'Colocation reference is required' ) ); + + $this->addElement( $colo_ref ); + + $type = $this->createElement( 'select', 'type' ); + $type->setMultiOptions( PatchPanelPort::$INTERFACE_TYPES ) + ->setRegisterInArrayValidator( true ) + ->addValidator( 'greaterThan', true, array( 0 ) ) + ->setLabel( 'Interface Type' ) + ->setErrorMessages( array( 'Please set the interface type' ) ); + + $this->addElement( $type ); + + + + $cable_type = $this->createElement( 'select', 'cable_type' ); + $cable_type->setMultiOptions( PatchPanelPort::$CABLES_TYPES ) + ->setRegisterInArrayValidator( true ) + ->addValidator( 'greaterThan', true, array( 0 ) ) + ->setLabel( 'Cable Type' ) + ->setErrorMessages( array( 'Please set the cable type' ) ); + + $this->addElement( $cable_type ); + + + $this->addElement( 'button', 'cancel', array( 'label' => 'Cancel', 'onClick' => "parent.location='" + . $cancelLocation . "'" ) ); + $this->addElement( 'submit', 'commit', array( 'label' => 'Add' ) ); + + $this->setElementDecorators( + array( + 'ViewHelper' + ) + ); + + } + +} + +?> \ No newline at end of file diff --git a/library/INEX/Form/Switch.php b/library/INEX/Form/Switch.php new file mode 100644 index 000000000..67d8354c2 --- /dev/null +++ b/library/INEX/Form/Switch.php @@ -0,0 +1,184 @@ +createElement( 'text', 'name' ); + $name->addValidator( 'stringLength', false, array( 1, 255 ) ) + ->setRequired( true ) + ->setLabel( 'Name' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $name ); + + $switchtype = $this->createElement( 'select', 'switchtype' ); + $switchtype->setMultiOptions( SwitchTable::$SWITCHTYPES_TEXT ) + ->setRegisterInArrayValidator( true ) + ->addValidator( 'greaterThan', true, array( 0 ) ) + ->setLabel( 'Type' ) + ->setErrorMessages( array( 'Please set the switch type' ) ); + + $this->addElement( $switchtype ); + + + + + + $dbCabinets = Doctrine_Query::create() + ->from( 'Cabinet' ) + ->execute(); + + $cabinets = array( '0' => '' ); + $maxId = 0; + + foreach( $dbCabinets as $c ) + { + $cabinets[ $c['id'] ] = "{$c->Location->name} :: {$c['name']}"; + if( $c['id'] > $maxId ) $maxId = $c['id']; + } + + $cabinet = $this->createElement( 'select', 'cabinetid' ); + $cabinet->setMultiOptions( $cabinets ); + $cabinet->setRegisterInArrayValidator( true ) + ->setLabel( 'Cabinet' ) + ->addValidator( 'between', false, array( 1, $maxId ) ) + ->setErrorMessages( array( 'Please select a cabinet' ) ); + + $this->addElement( $cabinet ); + + + $infrastructre = $this->createElement( 'text', 'infrastructure' ); + $infrastructre->setLabel( 'Infrastructure' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $infrastructre ); + + + + $ipv4addr = $this->createElement( 'text', 'ipv4addr' ); + $ipv4addr->addValidator( 'stringLength', false, array( 1, 255 ) ) + ->setRequired( true ) + ->setLabel( 'IPv4 Address' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $ipv4addr ); + + $ipv6addr = $this->createElement( 'text', 'ipv6addr' ); + $ipv6addr->addValidator( 'stringLength', false, array( 1, 255 ) ) + ->setLabel( 'IPv6 Address' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $ipv6addr ); + + $snmppasswd = $this->createElement( 'text', 'snmppasswd' ); + $snmppasswd->addValidator( 'stringLength', false, array( 1, 255 ) ) + ->setLabel( 'SNMP Password' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $snmppasswd ); + + + + + + $dbVendors = Doctrine_Query::create() + ->from( 'Vendor' ) + ->execute(); + + $vendors = array( '0' => '' ); + $maxId = 0; + + foreach( $dbVendors as $v ) + { + $vendors[ $v['id'] ] = "{$v['name']}"; + if( $v['id'] > $maxId ) $maxId = $v['id']; + } + + $vendor = $this->createElement( 'select', 'vendorid' ); + $vendor->setMultiOptions( $vendors ); + $vendor->setRegisterInArrayValidator( true ) + ->setLabel( 'Vendor' ) + ->addValidator( 'between', false, array( 1, $maxId ) ) + ->setErrorMessages( array( 'Please select a vendor' ) ); + + $this->addElement( $vendor ); + + + + + $model = $this->createElement( 'text', 'model' ); + $model->addValidator( 'stringLength', false, array( 1, 255 ) ) + ->setLabel( 'Model' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $model ); + + + $notes = $this->createElement( 'textarea', 'notes' ); + $notes->setLabel( 'Notes' ) + ->setRequired( false ) + ->addFilter( new INEX_Filter_StripSlashes() ) + ->setAttrib( 'cols', 60 ) + ->setAttrib( 'rows', 5 ); + $this->addElement( $notes ); + + + $this->addElement( 'button', 'cancel', array( 'label' => 'Cancel', 'onClick' => "parent.location='" + . $cancelLocation . "'" ) ); + $this->addElement( 'submit', 'commit', array( 'label' => 'Add' ) ); + + } + +} + +?> \ No newline at end of file diff --git a/library/INEX/Form/SwitchPort.php b/library/INEX/Form/SwitchPort.php new file mode 100644 index 000000000..ad7216ec4 --- /dev/null +++ b/library/INEX/Form/SwitchPort.php @@ -0,0 +1,72 @@ +createElement( 'text', 'name', + array( + 'readonly' => 'readonly', + 'size' => '50' + ) + ); + $name->setLabel( 'Name' ); + $this->addElement( $name ); + + + $type = $this->createElement( 'select', 'type' ); + $type->setMultiOptions( Switchport::$TYPE_TEXT ) + ->setRegisterInArrayValidator( true ) + ->addValidator( 'greaterThan', true, array( 0 ) ) + ->setLabel( 'Type' ) + ->setErrorMessages( array( 'Please set the port type' ) ); + + $this->addElement( $type ); + + $switchid = $this->createElement( 'hidden', 'switchid' ); + $this->addElement( $switchid ); + + $this->addElement( 'button', 'cancel', array( 'label' => 'Cancel', 'onClick' => "parent.location='" + . $cancelLocation . "'" ) ); + + $this->addElement( 'submit', 'commit', array( 'label' => 'Add' ) ); + + } + +} + +?> \ No newline at end of file diff --git a/library/INEX/Form/User.php b/library/INEX/Form/User.php new file mode 100644 index 000000000..31843ece8 --- /dev/null +++ b/library/INEX/Form/User.php @@ -0,0 +1,156 @@ +createElement( 'text', 'username' ); + $username->addValidator( 'stringLength', false, array( 2, 30 ) ) + ->setRequired( true ) + ->setAttrib( 'size', 30 ) + ->setLabel( 'Username' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ) + ->addFilter( 'StringToLower' ) + ->addValidator( 'stringLength', false, array( 6, 30 ) ) + ->addValidator( 'regex', true, array( '/^[a-zA-Z0-9]+$/' ) ); + + $this->addElement( $username ); + + $password = $this->createElement( 'text', 'password' ); + $password->addValidator( 'stringLength', false, array( 8, 30 ) ) + ->addValidator( 'regex', true, array( '/^[a-zA-Z0-9\!\£\$\%\^\&\*\(\)\-\=\_\+\{\}\[\]\;\'\#\:\@\~\,\.\/\<\>\?\|]+$/' ) ) + ->setRequired( true ) + ->setLabel( 'Password' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ) + ->setErrorMessages( array( 'The password must between 8 and 30 characters and cannot contain a double quote - " - character.' ) ); + + $this->addElement( $password ); + + + $privileges = $this->createElement( 'select', 'privs' ); + $privileges->setMultiOptions( User::$PRIVILEGES ) + ->setRegisterInArrayValidator( true ) + ->setLabel( 'Privileges' ) + ->setErrorMessages( array( 'Please select the users privilege level' ) ); + + $this->addElement( $privileges ); + + + $email = $this->createElement( 'text', 'email' ); + $email->addValidator( 'stringLength', false, array( 1, 255 ) ) + ->addValidator( 'emailAddress', false, array( 'mx' => true, 'deep' => true, 'domain' => true ) ) + ->setRequired( true ) + ->setLabel( 'E-mail' ) + ->addFilter( 'StringTrim' ) + ->setAttrib( 'size', 60 ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $email ); + + $mobile = $this->createElement( 'text', 'authorisedMobile' ); + $mobile->addValidator( 'stringLength', false, array( 1, 30 ) ) + ->addValidator( 'regex', true, array( '/^[1-9]+[0-9]*$/' ) ) + ->setRequired( true ) + ->setLabel( 'Authorised Mobile (in the format: 353861234567)' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $mobile ); + + + + $dbCusts = Doctrine_Query::create() + ->from( 'Cust c' ) + ->orderBy( 'c.name ASC' ) + ->execute(); + + $custs = array( '0' => '' ); + $maxId = 0; + + foreach( $dbCusts as $c ) + { + $custs[ $c['id'] ] = "{$c['name']}"; + if( $c['id'] > $maxId ) $maxId = $c['id']; + } + + $cust = $this->createElement( 'select', 'custid' ); + $cust->setMultiOptions( $custs ); + $cust->setRegisterInArrayValidator( true ) + ->setRequired( true ) + ->setLabel( 'Customer' ) + ->addValidator( 'between', false, array( 1, $maxId ) ) + ->setErrorMessages( array( 'Please select a customer' ) ); + + $this->addElement( $cust ); + + + + + + $disabled = $this->createElement( 'checkbox', 'disabled' ); + $disabled->setLabel( 'Disabled?' ) + ->setCheckedValue( '1' ); + $this->addElement( $disabled ); + + $commit = $this->createElement( 'hidden', 'commit' ); + $commit->setValue( '1' ); + $this->addElement( $commit ); + + $cancel = $this->createElement( 'button', 'cancel' ); + $cancel->setLabel( 'Cancel' ) + ->setAttrib( 'onClick', "parent.location='{$cancelLocation}'" ); + $this->addElement( $cancel ); + + $submit = $this->createElement( 'submit', 'submit' ); + $submit->setLabel( 'Add' ); + $this->addElement( $submit ); + } + +} + +?> \ No newline at end of file diff --git a/library/INEX/Form/VLAN.php b/library/INEX/Form/VLAN.php new file mode 100644 index 000000000..5b52c9103 --- /dev/null +++ b/library/INEX/Form/VLAN.php @@ -0,0 +1,100 @@ +createElement( 'text', 'name' ); + $name->addValidator( 'stringLength', false, array( 1, 255 ) ) + ->setRequired( true ) + ->setLabel( 'Name' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $name ); + + + + $number = $this->createElement( 'text', 'number' ); + $number->addValidator( 'int' ) + ->addValidator( 'between', false, array( 1, 4096 ) ) + ->setRequired( true ) + ->setLabel( 'Tag' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $number ); + + $rcvrfname = $this->createElement( 'text', 'rcvrfname' ); + $rcvrfname->addValidator( 'stringLength', false, array( 1, 255 ) ) + ->setLabel( 'RC VRF Name' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $rcvrfname ); + + + + + + $notes = $this->createElement( 'textarea', 'notes' ); + $notes->setLabel( 'Notes' ) + ->setRequired( false ) + ->addFilter( new INEX_Filter_StripSlashes() ) + ->setAttrib( 'cols', 60 ) + ->setAttrib( 'rows', 5 ); + $this->addElement( $notes ); + + + $this->addElement( 'button', 'cancel', array( 'label' => 'Cancel', 'onClick' => "parent.location='" + . $cancelLocation . "'" ) ); + $this->addElement( 'submit', 'commit', array( 'label' => 'Add' ) ); + + } + +} + +?> \ No newline at end of file diff --git a/library/INEX/Form/Vendor.php b/library/INEX/Form/Vendor.php new file mode 100644 index 000000000..d59672e07 --- /dev/null +++ b/library/INEX/Form/Vendor.php @@ -0,0 +1,69 @@ +createElement( 'text', 'name' ); + $name->addValidator( 'stringLength', false, array( 1, 255 ) ) + ->setRequired( true ) + ->setLabel( 'Name' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $name ); + + + + $this->addElement( 'button', 'cancel', array( 'label' => 'Cancel', 'onClick' => "parent.location='" + . $cancelLocation . "'" ) ); + $this->addElement( 'submit', 'commit', array( 'label' => 'Add' ) ); + + } + +} + +?> \ No newline at end of file diff --git a/library/INEX/Form/VirtualInterface.php b/library/INEX/Form/VirtualInterface.php new file mode 100644 index 000000000..248fddd61 --- /dev/null +++ b/library/INEX/Form/VirtualInterface.php @@ -0,0 +1,128 @@ +from( 'Cust c' ) + ->orderBy( 'c.name ASC' ) + ->execute(); + + $custs = array( '0' => '' ); + $maxId = 0; + + foreach( $dbCusts as $c ) + { + $custs[ $c['id'] ] = "{$c['name']}"; + if( $c['id'] > $maxId ) $maxId = $c['id']; + } + + $cust = $this->createElement( 'select', 'custid' ); + $cust->setMultiOptions( $custs ); + $cust->setRegisterInArrayValidator( true ) + ->setRequired( true ) + ->setLabel( 'Customer' ) + ->addValidator( 'between', false, array( 1, $maxId ) ) + ->setErrorMessages( array( 'Please select a customer' ) ); + $this->addElement( $cust ); + + $name = $this->createElement( 'text', 'name' ); + $name->addValidator( 'stringLength', false, array( 0, 255 ) ) + ->setRequired( false ) + ->setLabel( 'Virtual Interface Name' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + $this->addElement( $name ); + + + $descr = $this->createElement( 'text', 'description' ); + $descr->setLabel( 'Description' ) + ->addValidator( 'stringLength', false, array( 0, 255 ) ) + ->setRequired( false ) + ->addFilter( new INEX_Filter_StripSlashes() ) + ->addFilter( 'StringTrim' ); + $this->addElement( $descr ); + + + $channel = $this->createElement( 'text', 'channelgroup' ); + $channel->addValidator( 'int' ) + ->setLabel( 'Channel Group Number' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + $this->addElement( $channel ); + + $mtu = $this->createElement( 'text', 'mtu' ); + $mtu->addValidator( 'int' ) + ->setLabel( 'MTU' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + $this->addElement( $mtu ); + + + + $trunk = $this->createElement( 'checkbox', 'trunk' ); + $trunk->setLabel( 'Is 802.1q Trunk?' ) + ->setCheckedValue( '1' ); + $this->addElement( $trunk ); + + $this->addElement( 'button', 'cancel', array( 'label' => 'Cancel', 'onClick' => "parent.location='" + . $cancelLocation . "'" ) ); + + $this->addElement( 'submit', 'commit', array( 'label' => 'Add' ) ); + + + $this->addDisplayGroup( + array( 'custid', 'name', 'description', 'channelgroup', 'mtu', 'trunk', 'cancel', 'commit' ), + 'virtualInterfaceDisplayGroup' + ); + $this->getDisplayGroup( 'virtualInterfaceDisplayGroup' )->setLegend( 'Customer Connection Details' ); + + } + +} + +?> \ No newline at end of file diff --git a/library/INEX/Form/VlanInterface.php b/library/INEX/Form/VlanInterface.php new file mode 100644 index 000000000..663efc62a --- /dev/null +++ b/library/INEX/Form/VlanInterface.php @@ -0,0 +1,293 @@ +createElement( 'hidden', 'virtualinterfaceid' ); + $this->addElement( $virtualInterface ); + + + $vlan = $this->createElement( 'select', 'vlanid' ); + $maxId = $this->createSelectFromDatabaseTable( $vlan, 'Vlan', 'id', array( 'name', 'number' ), 'name', 'ASC' ); + + $vlan->setRegisterInArrayValidator( true ) + ->setRequired( true ) + ->setLabel( 'VLAN' ) + ->addValidator( 'between', false, array( 1, $maxId ) ) + ->setErrorMessages( array( 'Please select a VLAN' ) ); + $this->addElement( $vlan ); + + + + + + + $ipv4enabled = $this->createElement( 'checkbox', 'ipv4enabled' ); + $ipv4enabled->setLabel( 'IPv4 Enabled?' ) + ->setCheckedValue( '1' ); + $this->addElement( $ipv4enabled ); + + + + + $ipv4addressid = $this->createElement( 'select', 'ipv4addressid' ); + + $collection = Doctrine_Query::create() + ->from( 'Ipv4address ipv4' ) + ->leftJoin( 'ipv4.Vlaninterface vli' ) + ->leftJoin( 'ipv4.Vlan v' ) + ->where( 'vli.id IS NULL' ) + ->orWhere( 'vli.id = ?', Zend_Controller_Front::getInstance()->getRequest()->getParam( 'id' ) ) + ->orderBy( 'ipv4.address ASC, ipv4.vlanid ASC' ) + ->execute(); + + $options = array( '0' => '' ); + $maxId = 0; + + foreach( $collection as $c ) + { + $options[ $c['id'] ] = "VLAN {$c['Vlan']['number']} - {$c['address']}"; + + if( $c['id'] > $maxId ) $maxId = $c['id']; + } + + + $ipv4addressid->setMultiOptions( $options ) + ->setRegisterInArrayValidator( true ) + ->setLabel( 'IPv4 Address' ) + ->addValidator( 'between', false, array( 0, $maxId ) ) + ->setErrorMessages( array( 'Please select a IPv4 address' ) ); + $this->addElement( $ipv4addressid ); + + + + $ipv4hostname = $this->createElement( 'text', 'ipv4hostname' ); + $ipv4hostname->addValidator( 'stringLength', false, array( 1, 64 ) ) + ->setLabel( 'IPv4 Hostname' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $ipv4hostname ); + + $ipv4bgpmd5secret = $this->createElement( 'text', 'ipv4bgpmd5secret' ); + $ipv4bgpmd5secret->addValidator( 'stringLength', false, array( 1, 64 ) ) + ->setLabel( 'IPv4 BGP MD5 Secret' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $ipv4bgpmd5secret ); + + + + $ipv4canping = $this->createElement( 'checkbox', 'ipv4canping' ); + $ipv4canping->setLabel( 'IPv4 Can Ping?' ) + ->setCheckedValue( '1' ); + $this->addElement( $ipv4canping ); + + $ipv4monitorrcbgp = $this->createElement( 'checkbox', 'ipv4monitorrcbgp' ); + $ipv4monitorrcbgp->setLabel( 'IPv4 Monitor RC BGP?' ) + ->setCheckedValue( '1' ); + $this->addElement( $ipv4monitorrcbgp ); + + $this->addDisplayGroup( + array( 'ipv4enabled', 'ipv4addressid', 'ipv4hostname', 'ipv4bgpmd5secret', 'ipv4canping', 'ipv4monitorrcbgp' ), + 'ipv4DisplayGroup' + ); + $this->getDisplayGroup( 'ipv4DisplayGroup' )->setLegend( 'IPv4 Details' ); + + + + + + + + + + + + $ipv6enabled = $this->createElement( 'checkbox', 'ipv6enabled' ); + $ipv6enabled->setLabel( 'IPv6 Enabled?' ) + ->setCheckedValue( '1' ); + $this->addElement( $ipv6enabled ); + + + + + $ipv6addressid = $this->createElement( 'select', 'ipv6addressid' ); + + $collection = Doctrine_Query::create() + ->from( 'Ipv6address ipv6' ) + ->leftJoin( 'ipv6.Vlaninterface vli' ) + ->leftJoin( 'ipv6.Vlan v' ) + ->where( 'vli.id IS NULL' ) + ->orWhere( 'vli.id = ?', Zend_Controller_Front::getInstance()->getRequest()->getParam( 'id' ) ) + ->orderBy( 'ipv6.address ASC, ipv6.vlanid ASC' ) + ->execute(); + + $options = array( '0' => '' ); + $maxId = 0; + + foreach( $collection as $c ) + { + $options[ $c['id'] ] = "VLAN {$c['Vlan']['number']} - {$c['address']}"; + + if( $c['id'] > $maxId ) $maxId = $c['id']; + } + + + $ipv6addressid->setMultiOptions( $options ) + ->setRegisterInArrayValidator( true ) + ->setLabel( 'IPv6 Address' ) + ->addValidator( 'between', false, array( 0, $maxId ) ) + ->setErrorMessages( array( 'Please select a IPv6 address' ) ); + $this->addElement( $ipv6addressid ); + + + + $ipv6hostname = $this->createElement( 'text', 'ipv6hostname' ); + $ipv6hostname->addValidator( 'stringLength', false, array( 1, 64 ) ) + ->setLabel( 'IPv6 Hostname' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $ipv6hostname ); + + $ipv6bgpmd5secret = $this->createElement( 'text', 'ipv6bgpmd5secret' ); + $ipv6bgpmd5secret->addValidator( 'stringLength', false, array( 1, 64 ) ) + ->setLabel( 'IPv6 BGP MD5 Secret' ) + ->addFilter( 'StringTrim' ) + ->addFilter( new INEX_Filter_StripSlashes() ); + + $this->addElement( $ipv6bgpmd5secret ); + + + + $ipv6canping = $this->createElement( 'checkbox', 'ipv6canping' ); + $ipv6canping->setLabel( 'IPv6 Can Ping?' ) + ->setCheckedValue( '1' ); + $this->addElement( $ipv6canping ); + + $ipv6monitorrcbgp = $this->createElement( 'checkbox', 'ipv6monitorrcbgp' ); + $ipv6monitorrcbgp->setLabel( 'IPv6 Monitor RC BGP?' ) + ->setCheckedValue( '1' ); + $this->addElement( $ipv6monitorrcbgp ); + + $this->addDisplayGroup( + array( 'ipv6enabled', 'ipv6addressid', 'ipv6hostname', 'ipv6bgpmd5secret', 'ipv6canping', 'ipv6monitorrcbgp' ), + 'ipv6DisplayGroup' + ); + $this->getDisplayGroup( 'ipv6DisplayGroup' )->setLegend( 'IPv6 Details' ); + + + + + + + + + + $mcastenabled = $this->createElement( 'checkbox', 'mcastenabled' ); + $mcastenabled->setLabel( 'Multicast Enabled?' ) + ->setCheckedValue( '1' ); + $this->addElement( $mcastenabled ); + + + + + $maxbgpprefix = $this->createElement( 'text', 'maxbgpprefix' ); + $maxbgpprefix->addValidator('int') + ->addValidator( 'greaterThan', false, array( -1 ) ) + ->setRequired( false ) + ->setLabel( 'Max BGP Prefixes' ); + $this->addElement( $maxbgpprefix ); + + + + + $rsclient = $this->createElement( 'checkbox', 'rsclient' ); + $rsclient->setLabel( 'Route Server Client?' ) + ->setCheckedValue( '1' ); + $this->addElement( $rsclient ); + + + + + $as112client = $this->createElement( 'checkbox', 'as112client' ); + $as112client->setLabel( 'AS112 Client?' ) + ->setCheckedValue( '1' ); + $this->addElement( $as112client ); + + + + + $busyhost = $this->createElement( 'checkbox', 'busyhost' ); + $busyhost->setLabel( 'Busy host?' ) + ->setCheckedValue( '1' ); + $this->addElement( $busyhost ); + + + + + $notes = $this->createElement( 'textarea', 'notes' ); + $notes->setLabel( 'Notes' ) + ->setRequired( false ) + ->addFilter( new INEX_Filter_StripSlashes() ) + ->setAttrib( 'cols', 60 ) + ->setAttrib( 'rows', 5 ); + $this->addElement( $notes ); + + + + $this->addElement( 'button', 'cancel', array( 'label' => 'Cancel', 'onClick' => "parent.location='" + . $cancelLocation . "'" ) ); + + $this->addElement( 'submit', 'commit', array( 'label' => 'Add' ) ); + } + +} + +?> \ No newline at end of file diff --git a/library/INEX/Message.php b/library/INEX/Message.php new file mode 100644 index 000000000..123fe4d98 --- /dev/null +++ b/library/INEX/Message.php @@ -0,0 +1,110 @@ +message = $message; + $this->class = $class; + $this->isHTML = $isHTML; + } + + + /** + * Get the message as plaintext - essentially strips the tags from the + * message if it is an HTML message + * + * @return string The message after strip_tags() + */ + public function getPlaintext() + { + if( $this->isHTML ) + return( strip_tags( $this->message ) ); + else + return( $this->message ); + } + + /** + * Get the message + * + * @return string The message + */ + public function getMessage() + { + return( $this->message ); + } + + /** + * Get the message + * + * @return string The message + */ + public function getClass() + { + return( $this->class ); + } +} + +?> \ No newline at end of file diff --git a/library/INEX/Mrtg.php b/library/INEX/Mrtg.php new file mode 100644 index 000000000..b83a7a95c --- /dev/null +++ b/library/INEX/Mrtg.php @@ -0,0 +1,458 @@ + INEX_Mrtg::PERIOD_DAY, + 'Week' => INEX_Mrtg::PERIOD_WEEK, + 'Month' => INEX_Mrtg::PERIOD_MONTH, + 'Year' => INEX_Mrtg::PERIOD_YEAR + ); + + + /** + * Period times. + * + * these values are taken from mrtg/src/rateup.c + */ + public static $PERIOD_TIME = array( + 'day' => 119988.0, //( 33.33 * 3600 ), + 'week' => 719712.0, // ( 8.33 * 24 * 3600 ), + 'month' => 2879712.0, // ( 33.33 * 24 * 3600 ), + 'year' => 31622400.0 // ( 366 * 24 * 3600 ) + ); + + + /** + * 'Bits' category for MRTG data and graphs + */ + const CATEGORY_BITS = 'bits'; + + /** + * 'Packets' category for MRTG data and graphs + */ + const CATEGORY_PACKETS = 'pkts'; + + /** + * 'Errors' category for MRTG data and graphs + */ + const CATEGORY_ERRORS = 'errs'; + + /** + * 'Discards' category for MRTG data and graphs + */ + const CATEGORY_DISCARDS = 'discs'; + + /** + * Array of valid categories for graphs + */ + public static $CATEGORIES = array( + 'Bits' => INEX_Mrtg::CATEGORY_BITS, + 'Packets' => INEX_Mrtg::CATEGORY_PACKETS, + 'Errors' => INEX_Mrtg::CATEGORY_ERRORS, + 'Discards' => INEX_Mrtg::CATEGORY_DISCARDS + ); + + /** + * Array of valid categories for aggregate graphs + */ + public static $CATEGORIES_AGGREGATE = array( + 'Bits' => INEX_Mrtg::CATEGORY_BITS, + 'Packets' => INEX_Mrtg::CATEGORY_PACKETS + ); + + + /** + * Class constructor. + * + * @param $file The MRTG log file to load for analysis + */ + function __construct( $file = null ) + { + $this->file = $file; + $this->loadmrtgfile(); + } + + + /** + * Returns the full absolute path to an MRTG graphing file. + * + * This function will sanitise and correct with defaults and inappropriate + * values for $monitorindex, $category, and $period. $shortname is not sanitised + * and it is expected that you have already done this. + * + * @param $mrtgPath The base path on the filesystem to the MRTG files. + * @param $type The file type to return. options are 'PNG' for an image file, 'LOG' for an MRTG log file. + * @param $monitorindex Integer representing the interface number or 'aggregate'. + * @param $category A value from INEX_Mrtg::$CATEGORIES + * @param $shortname The customer's shortname + * @param $period A value from INEX_Mrtg::$PERIODS + * @return string The full absolute path and filename + */ + static function getMrtgFilePath( $mrtgPath, + $type = 'PNG', + $monitorindex = 'aggregate', + $category = 'bits', + $shortname, + $period = 'day' + ) + { + // sanitise these things carefully + if( is_numeric( $monitorindex ) && $monitorindex > 10 ) + $monitorindex = '1'; + + if( !is_numeric( $monitorindex ) && $monitorindex != 'aggregate' ) + $monitorindex = 'aggregate'; + + if( !in_array( $period, INEX_Mrtg::$PERIODS ) ) + $period = INEX_Mrtg::$PERIODS['Day']; + + if( !in_array( $category, INEX_Mrtg::$CATEGORIES ) ) + $category = INEX_Mrtg::$CATEGORIES['Bits']; + + $memberdir = $mrtgPath . '/' . $shortname; + + switch( $type ) + { + case 'PNG': + return $memberdir . '/' + . $shortname .'-'.$monitorindex .'-'.$category.'-'. $period .'.png'; + break; + + case 'LOG': + return $memberdir . '/' + . $shortname .'-'.$monitorindex .'-'.$category . '.log'; + break; + + default: + return ''; + } + } + + /** + * Utility function to generate URLs for grabbing graph images. + * + * FIXME This isn't the right place for this but I'm not sure what is + * right now. + * + * @param array $params Array of parameters to make up the URL + * @return string The URL + */ + public static function generateZendFrontendUrl( $params ) + { + $url = Zend_Controller_Front::getInstance()->getBaseUrl() + . '/mrtg/retrieve-image'; + + if( isset( $params['shortname'] ) ) + $url .= "/shortname/{$params['shortname']}"; + + if( isset( $params['monitorindex'] ) ) + $url .= "/monitorindex/{$params['monitorindex']}"; + else + $url .= "/monitorindex/aggregate"; + + if( isset( $params['period'] ) ) + $url .= "/period/{$params['period']}"; + else + $url .= "/period/day"; + + if( isset( $params['category'] ) ) + $url .= "/category/{$params['category']}"; + else + $url .= "/category/bits"; + + if( isset( $params['graph'] ) ) + $url .= "/graph/{$params['graph']}"; + + return $url; + } + + function getPeriod( $period ) + { + if( isset( INEX_Mrtg::$PERIOD_TIME[ $period ] ) ) + return INEX_Mrtg::$PERIOD_TIME[ $period ]; + else + return null; + } + + /** + * Scale function + * + * This function will scale a number to (for example for traffic + * measured in bits/second) to Kbps, Mbps, Gbps or Tbps. + * + * Valid string formats ($strFormats) and what they return are: + * bytes => Bytes, KBytes, MBytes, GBytes, TBytes + * pkts / errs / discs => pps, Kpps, Mpps, Gpps, Tpps + * bits / * => bits, Kbits, Mbits, Gbits, Tbits + * + * Valid return types ($intReturn) are: + * 0 => fully formatted and scaled value. E.g. 12,354.235 Tbits + * 1 => scaled value without string. E.g. 12,354.235 + * 2 => just the string. E.g. Tbits + * + * @param $intNumber The integer value to scale + * @param $strFormat The string format to use. Valid values are listed above. Defaults to 'bits'. + * @param $intDem Number of decimals after the decimal point. Defaults to 3. + * @param $intReturn Type of string to return. Valid values are listed above. Defaults to 0. + * @return string Scaled / formatted number / type. + */ + public static function scale( $intNumber, $strFormat = 'bits', $intDem = 3, $intReturn = 0 ) + { + if( $strFormat == "bytes" ) + { + $arrFormat = array( + "Bytes", "KBytes", "MBytes", "GBytes", "TBytes" + ); + } + else if( in_array( $strFormat, array( 'pkts', 'errs', 'discs' ) ) ) + { + $arrFormat = array( + "pps", "Kpps", "Mpps", "Gpps", "Tpps" + ); + } + else + { + $intNumber = $intNumber * 8; + $arrFormat = array( + "bits", "Kbits", "Mbits", "Gbits", "Tbits" + ); + } + + for( $i = 0; $i < sizeof( $arrFormat ); $i++ ) + { + if( ( $intNumber / 1000 < 1 ) || ( sizeof( $arrFormat ) == $i + 1 ) ) + { + if( !$intReturn ) + return number_format( $intNumber, $intDem ) . " $arrFormat[$i]"; + elseif( $intReturn == 1 ) + return number_format( $intNumber, $intDem ); + elseif( $intReturn == 2 ) + return "$arrFormat[$i]"; + break; + } + else + { + $intNumber = $intNumber / 1000; + } + } + } + + + function loadmrtgfile() + { + # Create the array and define other expressions i want to use + $arrValues = array(); + + // Log files are available over HTTP from the monitoring server but + // are sometimes unavailable during a log update / rebuild / etc. + // As such, try a reasonable number of times for this infrequent + // occurance to get a good chance of getting the file. + for( $i = 0; $i <10; $i++ ) + { + if( $fd = @fopen( $this->file, "r" ) ) + break; + + sleep( 2 ); + } + + if( !$fd ) + { + $this->array = array(); + return; + } + + + # Take the values inside the time frame and load them into the array + $intCounter = 0; + while( !feof( $fd ) ) + { + $strLina = fgets( $fd, 4096 ); + $arrLine = explode( " ", $strLina ); + + // need to convert $arrLine[4] from string to float, + // because it contains a trailing + if( isset( $arrLine[4] ) ) + $arrLine[ 4 ] = floor( $arrLine[ 4 ] ); + else + $arrLine[ 4 ] = 0; + + if( $arrLine[ 0 ] ) { + $arrValues[ $intCounter ] = array( + $arrLine[ 0 ], + $arrLine[ 1 ], + $arrLine[ 2 ], + isset( $arrLine[ 3 ] ) ? $arrLine[ 3 ] : 0, + isset( $arrLine[ 4 ] ) ? $arrLine[ 4 ] : 0 + ); + $intCounter++; + } + } + + fclose( $fd ); + + $this->array = $arrValues; + } + + function getValues( $period = null, $category = 'bits', $doScale = true ) + { + $periodsecs = $this->getPeriod( $period ); + + if( !isset( $periodsecs ) ) + return null; + + $starttime = time() - $periodsecs; + $endtime = time(); + + $maxIn = 0; + $maxOut = 0; + $totalIn = 0; + $totalOut = 0; + $intLastTime = 0; + $intTime = 0; + + $gotrealstartdate = false; + $curenddate = false; + + $arrValues = $this->array; + + # Run through the array and start calculating + for( $i = sizeof( $arrValues ) - 1; $i > 0; $i-- ) { + # *** get start and end time + if( ($arrValues[ $i ][ 0 ] < $starttime) || ($arrValues[ $i ][ 0 ] > $endtime) ) { + continue; + } + + $curenddate = $arrValues[ $i ][ 0 ]; + + # we depend on array index monotonically increasing + if( !$gotrealstartdate && $arrValues[ $i ][ 0 ] ) { + $starttime = $arrValues[ $i ][ 0 ]; + $gotrealstartdate = true; + } + + list( $intTime, $avgratein, $avgrateout, $peakratein, $peakrateout ) = $arrValues[ $i ]; + + if( $peakratein > $maxIn ) { + $maxIn = $peakratein; + } + if( $peakrateout > $maxOut ) { + $maxOut = $peakrateout; + } + + if( $intLastTime == 0 ) { + $intLastTime = $intTime; + } + else { + $intRange = $intTime - $intLastTime; + $totalIn += $intRange * $avgratein; + $totalOut += $intRange * $avgrateout; + $intLastTime = $intTime; + } + } + + $endtime = $curenddate; + $totalTime = $endtime - $starttime; + + $curIn = isset( $avgratein ) ? $avgratein : 0.0; + $curOut = isset( $avgrateout ) ? $avgrateout : 0.0; + + // we use floor() to convert all values to float and round them suitably + return( + array( + 'totalin' => $totalIn, + 'totalout' => $totalOut, + 'curin' => $doScale ? $this->scale( $curIn, $category, 3, 0 ) : $curIn, + 'curout' => $doScale ? $this->scale( $curOut, $category, 3, 0 ) : $curOut, + 'averagein' => $doScale ? $this->scale( $totalIn / $totalTime, $category, 3, 0 ) : $totalIn / $totalTime, + 'averageout' => $doScale ? $this->scale( $totalOut / $totalTime, $category, 3, 0 ) : $totalOut / $totalTime, + 'maxin' => $doScale ? $this->scale( $maxIn, $category, 3, 0 ) : $maxIn, + 'maxout' => $doScale ? $this->scale( $maxOut, $category, 3, 0 ) : $maxOut + ) + ); + } + + /** + * Accessor method for $array - the data from the MRTG file. + * + * @return array The data from the MRTG file + */ + public function getArray() + { + return $this->array; + } + +} + diff --git a/library/INEX/Resource/Auth.php b/library/INEX/Resource/Auth.php new file mode 100644 index 000000000..4cd9d5411 --- /dev/null +++ b/library/INEX/Resource/Auth.php @@ -0,0 +1,73 @@ + + * All rights reserved. + * + * @category INEX + * @version $Id: Auth.php 447 2011-05-26 13:53:52Z barryo $ + * @package INEX_Bootstrap_Resources + * @copyright Copyright (c) 2009 Internet Neutral Exchange Limited + * + */ + + +/** + * Class to instantiate Auth + * + * @category INEX + * @package INEX_Bootstrap_Resources + * @copyright Copyright (c) 2009 Internet Neutral Exchange Limited + */ +class INEX_Resource_Auth extends Zend_Application_Resource_ResourceAbstract +{ + /** + * Holds the Auth instance + * + * @var + */ + protected $_auth; + + + public function init() + { + // Return Doctrine so bootstrap will store it in the registry + return $this->getAuth(); + } + + + public function getAuth() + { + // Get Doctrine configuration options from the application.ini file + $authConfig = $this->getOptions(); + + $this->_auth = Zend_Auth::getInstance(); + + return $this->_auth; + } + +} diff --git a/library/INEX/Resource/Doctrine.php b/library/INEX/Resource/Doctrine.php new file mode 100644 index 000000000..4cb52436a --- /dev/null +++ b/library/INEX/Resource/Doctrine.php @@ -0,0 +1,110 @@ + + * All rights reserved. + * + * @category INEX + * @version $Id: Doctrine.php 447 2011-05-26 13:53:52Z barryo $ + * @package INEX_Bootstrap_Resources + * @copyright Copyright (c) 2009 Internet Neutral Exchange Limited + * + */ + + +/** + * Class to instantiate Doctrine + * + * @category INEX + * @package INEX_Bootstrap_Resources + * @copyright Copyright (c) 2009 Internet Neutral Exchange Limited + */ +class INEX_Resource_Doctrine extends Zend_Application_Resource_ResourceAbstract +{ + /** + * Holds the Doctrine instance + * + * @var + */ + protected $_doctrine; + + + public function init() + { + // Return Doctrine so bootstrap will store it in the registry + return $this->getDoctrine(); + } + + + public function getDoctrine() + { + if( null === $this->_doctrine ) + { + // Get Doctrine configuration options from the application.ini file + $doctrineConfig = $this->getOptions(); + + require_once 'Doctrine.php'; + + $loader = Zend_Loader_Autoloader::getInstance(); + $loader->pushAutoloader( array( 'Doctrine', 'autoload' ) ); + + $manager = Doctrine_Manager::getInstance(); + + $cacheDriver = new Doctrine_Cache_Apc(); + $manager->setAttribute( Doctrine_Core::ATTR_QUERY_CACHE, $cacheDriver ); + + $manager->setAttribute( Doctrine_Core::ATTR_RESULT_CACHE, $cacheDriver ); + $manager->setAttribute( Doctrine_Core::ATTR_RESULT_CACHE_LIFESPAN, 3600 * 24 ); + + $manager->setAttribute( Doctrine_Core::ATTR_MODEL_LOADING, Doctrine_Core::MODEL_LOADING_CONSERVATIVE ); + $manager->setAttribute( Doctrine_Core::ATTR_AUTO_FREE_QUERY_OBJECTS, true ); + + spl_autoload_register( array( 'Doctrine_Core', 'modelsAutoload' ) ); + Doctrine_Core::loadModels( $doctrineConfig['models_path'], Doctrine_Core::MODEL_LOADING_CONSERVATIVE ); + + $manager->openConnection( $doctrineConfig['connection_string'] ); + + $manager->connection()->setCollate( 'utf8_unicode_ci' ); + $manager->connection()->setCharset( 'utf8' ); + + $this->_doctrine = $manager; + } + + return $this->_doctrine; + } + + /** + * Set the classes $_doctrine member + * + * @param $doctrine The object to set + */ + public function setDoctrine( $doctrine ) + { + $this->_doctrine = $doctrine; + } + + +} diff --git a/library/INEX/Resource/Logger.php b/library/INEX/Resource/Logger.php new file mode 100644 index 000000000..65ee06f76 --- /dev/null +++ b/library/INEX/Resource/Logger.php @@ -0,0 +1,175 @@ + + * All rights reserved. + * + * @category INEX + * @version $Id: Logger.php 447 2011-05-26 13:53:52Z barryo $ + * @package INEX_Bootstrap_Resources + * @copyright Copyright (c) 2009 Internet Neutral Exchange Limited + * + */ + + +/** + * Class to instantiate Logger + * + * @category INEX + * @package INEX_Bootstrap_Resources + * @copyright Copyright (c) 2009 Internet Neutral Exchange Limited + */ +class INEX_Resource_Logger extends Zend_Application_Resource_ResourceAbstract +{ + /** + * Holds the Logger instance + * + * @var + */ + protected $_logger; + + + public function init() + { + // Return logger so bootstrap will store it in the registry + return $this->getLogger(); + } + + + public function getLogger() + { + if( null === $this->_logger ) + { + // Get Doctrine configuration options from the application.ini file + $options = $this->getOptions(); + + $logger = new Zend_Log(); + + if( $options['enabled'] ) + { + foreach( $options['writers'] as $writer => $writerOptions ) + { + switch( $writer ) + { + case 'stream': + $log_path = $writerOptions['path'] + . DIRECTORY_SEPARATOR . date( 'Y' ) + . DIRECTORY_SEPARATOR . date( 'm' ); + + $log_file = $log_path . DIRECTORY_SEPARATOR . date( 'Ymd') . '.log'; + + if( !file_exists( $log_path ) ) + { + mkdir( $log_path, 0770, true ); + chmod( $log_path, 0770 ); + chown( $log_path, $writerOptions['owner'] ); + chgrp( $log_path, $writerOptions['group'] ); + } + + if( !file_exists( $log_file ) ) + { + touch( $log_file ); + chmod( $log_file, 0660 ); + chown( $log_file, $writerOptions['owner'] ); + chgrp( $log_file, $writerOptions['group'] ); + } + + $streamWriter = new Zend_Log_Writer_Stream( $log_file ); + $streamWriter->setFormatter( + new Zend_Log_Formatter_Simple( + '%timestamp% %priorityName% (%priority%) [' + . ( ( isset( $_SERVER ) && array_key_exists( 'REMOTE_ADDR', $_SERVER ) ) ? $_SERVER['REMOTE_ADDR'] : 'CLI' ) + . ']: %message%' . PHP_EOL + ) + ); + $logger->addWriter( $streamWriter ); + + if( isset( $writerOptions['level'] ) ) + $logger->addFilter( (int)$writerOptions['level'] ); + + break; + + case 'email': + $this->getBootstrap()->bootstrap( 'Mailer' ); + + $mail = new Zend_Mail(); + $mail->setFrom( $writerOptions['from'] ) + ->addTo( $writerOptions['to'] ); + + $mailWriter = new Zend_Log_Writer_Mail( $mail ); + + // Set subject text for use; summary of number of errors is appended to the + // subject line before sending the message. + $mailWriter->setSubjectPrependText( "[{$writerOptions['prefix']}]" ); + + // Only email entries with level requested and higher. + $mailWriter->addFilter( (int)$writerOptions['level'] ); + + $logger->addWriter( $mailWriter ); + break; + + case 'firebug': + if( $writerOptions['enabled'] ) + { + $firebugWriter = new Zend_Log_Writer_Firebug(); + $firebugWriter->addFilter( (int)$writerOptions['level'] ); + $logger->addWriter( $firebugWriter ); + } + break; + + default: + try { + $logger->log( "Unknown log writer: {$writer}", Zend_Log::WARN ); + } catch( Zend_Log_Exception $e ) { + die( "Unknown log writer [{$writer}] during application bootstrap" ); + } + break; + } + } + + } + else + $logger->addWriter( new Zend_Log_Writer_Null() ); + + try + { + $logger->log( 'Logger instantiated', Zend_Log::DEBUG ); + } + catch( Zend_Log_Exception $e ) + { + die( "Unknown log writer [{$writer}] during application bootstrap" ); + } + + + $this->_logger = $logger; + } + + return $this->_logger; + } + + +} diff --git a/library/INEX/Resource/Mailer.php b/library/INEX/Resource/Mailer.php new file mode 100644 index 000000000..fb8986ffe --- /dev/null +++ b/library/INEX/Resource/Mailer.php @@ -0,0 +1,92 @@ + + * All rights reserved. + * + * @category INEX + * @version $Id: Mailer.php 447 2011-05-26 13:53:52Z barryo $ + * @package INEX_Bootstrap_Resources + * @copyright Copyright (c) 2009 Internet Neutral Exchange Limited + * + */ + + +/** + * Class to instantiate Mailer + * + * @category INEX + * @package INEX_Bootstrap_Resources + * @copyright Copyright (c) 2009 Internet Neutral Exchange Limited + */ +class INEX_Resource_Mailer extends Zend_Application_Resource_ResourceAbstract +{ + /** + * Holds the Logger instance + * + * @var + */ + protected $_mailer; + + + public function init() + { + // Return logger so bootstrap will store it in the registry + return $this->getMailer(); + } + + + public function getMailer() + { + if( null === $this->_mailer ) + { + $options = $this->getOptions(); + + if( count( $options ) ) + { + if( isset( $options['auth'] ) ) + { + $config = array( + 'auth' => $options['auth'], + 'username' => $options['username'], + 'password' => $options['password'] + ); + } + else + $config = array(); + + $transport = new Zend_Mail_Transport_Smtp( $options['smtphost'], $config ); + Zend_Mail::setDefaultTransport( $transport ); + + $this->_mailer = $transport; + } + } + + return $this->_mailer; + } + + +} diff --git a/library/INEX/Resource/Namespace.php b/library/INEX/Resource/Namespace.php new file mode 100644 index 000000000..5644d770d --- /dev/null +++ b/library/INEX/Resource/Namespace.php @@ -0,0 +1,118 @@ + + * All rights reserved. + * + * @category INEX + * @version $Id: Namespace.php 13 2009-09-30 15:15:33Z barryo $ + * @package INEX_Bootstrap_Resources + * @copyright Copyright (c) 2009 Internet Neutral Exchange Limited + * + */ + + +/** + * Class to instantiate Namespace + * + * @category INEX + * @package INEX_Bootstrap_Resources + * @copyright Copyright (c) 2009 Internet Neutral Exchange Limited + */ +class INEX_Resource_Namespace extends Zend_Application_Resource_ResourceAbstract +{ + /** + * Holds the Logger instance + * + * @var + */ + protected $_namespace; + + + public function init() + { + // Return session so bootstrap will store it in the registry + return $this->getNamespace(); + } + + + public function getNamespace() + { + if( null === $this->_namespace ) + { + $this->getBootstrap()->bootstrap( 'session' ); + + // Get session configuration options from the application.ini file + $options = $this->getOptions(); + + $ApplicationNamespace = new Zend_Session_Namespace( 'Application' ); + + // Secutiry tip from http://framework.zend.com/manual/en/zend.session.global_session_management.html + if( !isset( $Application->initialised ) ) + { + // FIXME This breaks the graphs on the dashboard! Zend_Session::regenerateId(); + $ApplicationNamespace->initialized = true; + } + + $ApplicationNamespace->setExpirationSeconds( $options['timeout'] ); + + // ensure IP consistancy + if( $options['checkip'] ) + { + if( isset( $_SERVER ) && array_key_exists( 'REMOTE_ADDR', $_SERVER ) ) + $ip = $_SERVER['REMOTE_ADDR']; + else + $ip = 'CLI'; + + if( !isset( $ApplicationNamespace->clientIP ) ) + { + $ApplicationNamespace->clientIP = $ip; + } + else if( $ApplicationNamespace->clientIP != $ip ) + { + // security violation - client IP has changed indicating a possible hijacked session + $this->getBootstrap()->bootstrap( 'Logger' ); + $this->getBootstrap()->getResource('logger')->warn( + "IP address changed - possible session hijack attempt." + . "OLD: {$ApplicationNamespace->clientIP} NEW: {$_SERVER['REMOTE_ADDR']}" + ); + Zend_Session::destroy( true, true ); + die( + "Your IP address has changed. As such, your session has been destroyed for your own security. Please refresh your browser." + ); + } + } + + $this->_namespace = $ApplicationNamespace; + + } + + return $this->_namespace; + } + + +} diff --git a/library/INEX/Resource/View.php b/library/INEX/Resource/View.php new file mode 100644 index 000000000..4e35de3af --- /dev/null +++ b/library/INEX/Resource/View.php @@ -0,0 +1,90 @@ + + * All rights reserved. + * + * @category INEX + * @version $Id: View.php 447 2011-05-26 13:53:52Z barryo $ + * @package INEX_Bootstrap_Resources + * @copyright Copyright (c) 2009 Internet Neutral Exchange Limited + * + */ +/** + * Class to instantiate View + * + * @category INEX + * @package INEX_Bootstrap_Resources + * @copyright Copyright (c) 2009 Internet Neutral Exchange Limited + */ +class INEX_Resource_View extends Zend_Application_Resource_ResourceAbstract +{ + + /** + * Holds the View instance + * + * @var + */ + protected $_view; + + public function init() + { + // Return view so bootstrap will store it in the registry + return $this->getView(); + } + + public function getView() + { + if( null === $this->_view ) + { + // Get session configuration options from the application.ini file + $options = $this->getOptions(); + + require_once( 'Smarty.class.php' ); + + // Initialize view + $view = new INEX_View_Smarty( + $options['templates'], + array( + 'cache_dir' => $options['cache'], + 'config_dir' => $options['config'], + 'compile_dir' => $options['compiled'], + 'plugins_dir' => $options['plugins'] + ) + ); + + $view->getEngine()->debugging = $options['debugging']; + + // Add it to the ViewRenderer + $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper( 'ViewRenderer' ); + $viewRenderer->setView( $view ); + + $this->_view = $view; + } + return $this->_view; + } +} diff --git a/library/INEX/Resource/Zfdebug.php b/library/INEX/Resource/Zfdebug.php new file mode 100644 index 000000000..98a8cde13 --- /dev/null +++ b/library/INEX/Resource/Zfdebug.php @@ -0,0 +1,115 @@ + + * All rights reserved. + * + * @category INEX + * @version $Id: Zfdebug.php 447 2011-05-26 13:53:52Z barryo $ + * @package INEX_Bootstrap_Resources + * @copyright Copyright (c) 2009 Internet Neutral Exchange Limited + * + */ + + +/** + * Class to instantiate Zfdebug + * + * @category INEX + * @package INEX_Bootstrap_Resources + * @copyright Copyright (c) 2009 Internet Neutral Exchange Limited + */ +class INEX_Resource_Zfdebug extends Zend_Application_Resource_ResourceAbstract +{ + /** + * Holds the Logger instance + * + * @var + */ + protected $_zfdebug; + + + public function init() + { + // Return session so bootstrap will store it in the registry + return $this->getZfdebug(); + } + + + public function getZfdebug() + { + if( null === $this->_zfdebug ) + { + $this->getBootstrap()->bootstrap( 'session' ); + + // Get Zfdebug configuration options from the application.ini file + $zfdebugConfig = $this->getOptions(); + + if( $zfdebugConfig['enabled'] ) + { + $autoloader = Zend_Loader_Autoloader::getInstance(); + $autoloader->registerNamespace('ZFDebug'); + + $options = array( + 'plugins' => $zfdebugConfig['plugins'] + ); + + # Instantiate the database adapter and setup the plugin. + # Alternatively just add the plugin like above and rely on the autodiscovery feature. + if( $this->getBootstrap()->hasPluginResource( 'db' ) ) + { + $this->getBootstrap()->bootstrap('db'); + $db = $this->getBootstrap()->getPluginResource( 'db' )->getDbAdapter(); + $options['plugins']['Database']['adapter'] = $db; + } + + # Setup the cache plugin + if( $this->getBootstrap()->hasPluginResource( 'cache' ) ) + { + $this->getBootstrap()->bootstrap( 'cache' ); + $cache = $this->getBootstrap()->getPluginResource( 'cache' )->getDbAdapter(); + $options['plugins']['Cache']['backend'] = $cache->getBackend(); + } + + $this->getBootstrap()->bootstrap( 'INEXAutoLoader' ); + $this->getBootstrap()->bootstrap( 'Doctrine' ); + $options['plugins']['INEX_ZFDebug_Controller_Plugin_Debug_Plugin_Doctrine']['manager'] + = $this->getBootstrap()->getResource( 'Doctrine' ); + + $this->_zfdebug = new ZFDebug_Controller_Plugin_Debug( $options ); + + $this->getBootstrap()->bootstrap( 'FrontController' ); + $frontController = $this->getBootstrap()->getResource('FrontController'); + $frontController->registerPlugin($this->_zfdebug); + } + } + + return $this->_zfdebug; + } + + +} diff --git a/library/INEX/SMS/Clickatell.php b/library/INEX/SMS/Clickatell.php new file mode 100644 index 000000000..3b6f0e5d9 --- /dev/null +++ b/library/INEX/SMS/Clickatell.php @@ -0,0 +1,174 @@ +setUsername( $user ); + + if( $pass !== null ) + $this->setPassword( $pass ); + + if( $api_id !== null ) + $this->setApiID( $api_id ); + + if( $sender_id !== null ) + $this->setSenderID( $sender_id ); + } + + + + /** + * Set the Clickatell HTTP(S) gateway API ID + * + * @param $username string The Clickatell API ID + */ + public function setApiID( $api_id ) + { + $this->api_id = $api_id; + } + + /** + * Set the Clickatell HTTP(S) sender ID + * + * @param $sender_id string The Sender ID + */ + public function setSenderID( $sender_id ) + { + $this->sender_id = $sender_id; + } + + + /** + * Set the Clickatell account password + * + * @param $username string The Clickatell password + */ + public function setPassword( $pass ) + { + $this->password = $pass; + } + + + /** + * Set the Clickatell account username + * + * @param $username string The Clickatell username + */ + public function setUsername( $user ) + { + $this->username = $user; + } + + + /** + * Send an SMS message + * + * @param $to string The recipient number in international format (e.g. 353861234567) + * @param $message string The message to send + * @return TRUE on successful, else FALSE + */ + public function send( $to, $message ) + { + // try and send the message via Clickatell + $apiCall = sprintf( INEX_SMS_Clickatell::URL_SEND_SMS, + $this->username, $this->password, $this->api_id, $to, + urlencode( $message ) + ); + + if( $this->sender_id ) + { + $apiCall .= '&from=' . $this->sender_id; + } + + $this->apiResponse = @file_get_contents( $apiCall ); + + if( $this->apiResponse === FALSE || substr( $this->apiResponse, 0, 3 ) !== 'ID:' ) + { + return false; + } + + return true; + } + +} + +?> diff --git a/library/INEX/View/Smarty.php b/library/INEX/View/Smarty.php new file mode 100644 index 000000000..f60b2c92f --- /dev/null +++ b/library/INEX/View/Smarty.php @@ -0,0 +1,275 @@ +_smarty = new Smarty(); + + if( null !== $tmplPath ) + $this->setScriptPath( $tmplPath ); + + foreach( $extraParams as $key => $value ) + $this->_smarty->$key = $value; + } + + /** + * Return the template engine object + * + * @return Smarty + */ + public function getEngine() + { + return $this->_smarty; + } + + + /** + * This is needed for {@link clearVars()} to work properly. It automatically + * runs (PHP 5) after the "clone" operator did it's job. More descriptions + * at {@link clearVars()} . + * + * @param void + * @return void + */ + public function __clone() + { + $_tpl_vars = $this->_smarty->_tpl_vars; + $template_dir = $this->_smarty->template_dir; + $compile_dir = $this->_smarty->compile_dir; + $config_dir = $this->_smarty->config_dir; + $plugins_dir = $this->_smarty->plugins_dir; + + $this->__construct(); + + $this->_smarty->_tpl_vars = $_tpl_vars; + $this->_smarty->template_dir = $template_dir; + $this->_smarty->compile_dir = $compile_dir; + $this->_smarty->config_dir = $config_dir; + $this->_smarty->plugins_dir = $plugins_dir; + } + + + /** + * Set the path to the templates + * + * @param string $path The directory to set as the path. + * @return void + */ + public function setScriptPath($path) + { + if (is_readable($path)) { + $this->_smarty->template_dir = $path; + return; + } + + throw new Exception('Invalid path provided'); + } + + /** + * Retrieve the current template directory + * + * @return string + */ + public function getScriptPaths() + { + return array($this->_smarty->template_dir); + } + + /** + * Alias for setScriptPath + * + * @param string $path + * @param string $prefix Unused + * @return void + */ + public function setBasePath($path, $prefix = 'Zend_View') + { + return $this->setScriptPath($path); + } + + /** + * Alias for setScriptPath + * + * @param string $path + * @param string $prefix Unused + * @return void + */ + public function addBasePath($path, $prefix = 'Zend_View') + { + return $this->setScriptPath($path); + } + + /** + * Assign a variable to the template + * + * @param string $key The variable name. + * @param mixed $val The variable value. + * @return void + */ + public function __set($key, $val) + { + $this->_smarty->assign_by_ref($key, $val); + } + + /** + * Retrieve an assigned variable + * + * @param string $key The variable name. + * @return mixed The variable value. + */ + public function __get($key) + { + return $this->_smarty->get_template_vars($key); + } + + /** + * Allows testing with empty() and isset() to work + * + * @param string $key + * @return boolean + */ + public function __isset($key) + { + return (null !== $this->_smarty->get_template_vars($key)); + } + + /** + * Allows unset() on object properties to work + * + * @param string $key + * @return void + */ + public function __unset($key) + { + $this->_smarty->clear_assign($key); + } + + /** + * Assign variables to the template + * + * Allows setting a specific key to the specified value, OR passing + * an array of key => value pairs to set en masse. + * + * @see __set() + * @param string|array $spec The assignment strategy to use (key or + * array of key => value pairs) + * @param mixed $value (Optional) If assigning a named variable, + * use this as the value. + * @return void + */ + public function assign($spec, $value = null) + { + if (is_array($spec)) { + $this->_smarty->assign($spec); + return; + } + + $this->_smarty->assign($spec, $value); + } + + + /** + * Clears all variables assigned to Zend_View either via {@link assign()} or property + * overloading ({@link __get()}/{@link __set()}). + * + * + * Both Zend_View_Helper_Action::cloneView() and Zend_View_Helper_Partial::cloneView() + * executes a "$view->clearVars();" line after a "$view = clone $this->view;" . Because + * of how the "clone" operator works internally (object references are also copied, so a + * clone of this object will point to the same Smarty object instance as this, + * the "$view->clearVars();" unsets all the Smarty template variables. To solve + * this, there is the {@link __clone()} method in this class which is called by the + * "clone" operator just after it did it's cloning job. + * + * If for any reason this doesn't work, neither after amending {@link __clone()}, an + * other "solution" is in the method, but commented out. + * That will also work, but it is relatively slow and, not nice at all. That takes a look + * on it's backtrace, and if finds a function name + * "cloneView" then does NOT execute Smarty's clear_all_assign(). + * + * Or just make this an empty function if neither the above works. + * + * @param void + * @return void + */ + public function clearVars() + { + //if (in_array('cloneView', XXX_Utils::filterFieldFromResult(OSS_Debug::compact_debug_backtrace(), 'function', false, false)) == false) $this->_smarty->clear_all_assign(); + + // barryo 20100413 + // + // I don't think we need to do this... it's a PITA as in the form view helpers, we lose + // all assigned variables. + // + // $this->_smarty->clear_all_assign(); + } + + + /** + * Clears all variables assigned to Zend_View either via {@link assign()} or property + * overloading ({@link __get()}/{@link __set()}). + * + * @param void + * @return void + */ + public function clear_all_assign() + { + $this->_smarty->clear_all_assign(); + } + + + /** + * Processes a template and returns the output. + * + * @param string $name The template to process. + * @return string The output. + */ + public function render($name) + { + return $this->_smarty->fetch($name); + } + + /** + * Processes a template and sends the output. + * + * @param string $name The template to process. + * @return void + */ + public function display( $name ) + { + return $this->_smarty->display($name); + } + + /** + * Checks to see if the named template exists + * + * @param string $name The template to look for + * @return boolean + */ + public function templateExists( $name ) + { + return $this->_smarty->template_exists( $name ); + } + + + protected function _run() + { + include func_get_arg(0); + } +} + +?> \ No newline at end of file diff --git a/library/INEX/ZFDebug/Controller/Plugin/Debug/Plugin/Doctrine.php b/library/INEX/ZFDebug/Controller/Plugin/Debug/Plugin/Doctrine.php new file mode 100644 index 000000000..24f9097e7 --- /dev/null +++ b/library/INEX/ZFDebug/Controller/Plugin/Debug/Plugin/Doctrine.php @@ -0,0 +1,117 @@ +getIterator() as $connection) { + $this->_profilers[$connection->getName()] = new Doctrine_Connection_Profiler(); + $connection->setListener($this->_profilers[$connection->getName()]); + } + } + + /** + * Gets identifier for this plugin + * + * @return string + */ + public function getIdentifier() + { + return $this->_identifier; + } + + /** + * Gets menu tab for the Debugbar + * + * @return string + */ + public function getTab() + { + if (!$this->_profilers) + return 'No Profiler'; + + foreach ($this->_profilers as $profiler) { + $time = 0; + foreach ($profiler as $event) { + $time += $event->getElapsedSecs(); + } + $profilerInfo[] = $profiler->count() . ' in ' . round($time*1000, 2) . ' ms'; + } + $html = implode(' / ', $profilerInfo); + + return $html; + } + + /** + * Gets content panel for the Debugbar + * + * @return string + */ + public function getPanel() + { + if (!$this->_profilers) + return ''; + + $html = '

Database queries

'; + + foreach ($this->_profilers as $name => $profiler) { + $html .= '

Connection '.$name.'

    '; + foreach ($profiler as $event) { + if (in_array($event->getName(), array('query', 'execute', 'exec'))) { + $info = htmlspecialchars($event->getQuery()); + } else { + $info = '' . htmlspecialchars($event->getName()) . ''; + } + + $html .= '
  1. [' . round($event->getElapsedSecs()*1000, 2) . ' ms] '; + $html .= $info; + + $params = $event->getParams(); + if(!empty($params)) { + $html .= '
      bindings:
    • '. implode('
    • ', $params) . '
    '; + } + $html .= '
  2. '; + } + $html .= '
'; + } + + return $html; + } + +} diff --git a/library/apcinfo.php b/library/apcinfo.php new file mode 100644 index 000000000..1b0c6ec45 --- /dev/null +++ b/library/apcinfo.php @@ -0,0 +1,1346 @@ + | + | Rasmus Lerdorf | + | Ilia Alshanetsky | + +----------------------------------------------------------------------+ + + All other licensing and usage conditions are those of the PHP Group. + + */ + +$VERSION='$Id: apc.php,v 3.68.2.2 2008/05/11 18:57:00 rasmus Exp $'; + +////////// READ OPTIONAL CONFIGURATION FILE //////////// +if (file_exists("apc.conf.php")) include("apc.conf.php"); +//////////////////////////////////////////////////////// + +////////// BEGIN OF DEFAULT CONFIG AREA /////////////////////////////////////////////////////////// + +defaults('USE_AUTHENTICATION',0); // Use (internal) authentication - best choice if + // no other authentication is available + // If set to 0: + // There will be no further authentication. You + // will have to handle this by yourself! + // If set to 1: + // You need to change ADMIN_PASSWORD to make + // this work! +defaults('ADMIN_USERNAME','apc'); // Admin Username +defaults('ADMIN_PASSWORD','password'); // Admin Password - CHANGE THIS TO ENABLE!!! + +// (beckerr) I'm using a clear text password here, because I've no good idea how to let +// users generate a md5 or crypt password in a easy way to fill it in above + +//defaults('DATE_FORMAT', "d.m.Y H:i:s"); // German +defaults('DATE_FORMAT', 'Y/m/d H:i:s'); // US + +defaults('GRAPH_SIZE',200); // Image size + +////////// END OF DEFAULT CONFIG AREA ///////////////////////////////////////////////////////////// + + +// "define if not defined" +function defaults($d,$v) { + if (!defined($d)) define($d,$v); // or just @define(...) +} + +// rewrite $PHP_SELF to block XSS attacks +// +$PHP_SELF= $BU; //isset($_SERVER['PHP_SELF']) ? htmlentities(strip_tags($_SERVER['PHP_SELF'],''), ENT_QUOTES) : ''; +$time = time(); +$host = getenv('HOSTNAME'); +if($host) { $host = '('.$host.')'; } + +// operation constants +define('OB_HOST_STATS',1); +define('OB_SYS_CACHE',2); +define('OB_USER_CACHE',3); +define('OB_SYS_CACHE_DIR',4); +define('OB_VERSION_CHECK',9); + +// check validity of input variables +$vardom=array( + 'OB' => '/^\d+$/', // operational mode switch + 'CC' => '/^[01]$/', // clear cache requested + 'DU' => '/^.*$/', // Delete User Key + 'SH' => '/^[a-z0-9]+$/', // shared object description + + 'IMG' => '/^[123]$/', // image to generate + 'LO' => '/^1$/', // login requested + + 'COUNT' => '/^\d+$/', // number of line displayed in list + 'SCOPE' => '/^[AD]$/', // list view scope + 'SORT1' => '/^[AHSMCDTZ]$/', // first sort key + 'SORT2' => '/^[DA]$/', // second sort key + 'AGGR' => '/^\d+$/', // aggregation by dir level + 'SEARCH' => '~^[a-zA-Z0-1/_.-]*$~' // aggregation by dir level +); + +// default cache mode +$cache_mode='opcode'; + +// cache scope +$scope_list=array( + 'A' => 'cache_list', + 'D' => 'deleted_list' +); + +// handle POST and GET requests +if (empty($_REQUEST)) { + if (!empty($_GET) && !empty($_POST)) { + $_REQUEST = array_merge($_GET, $_POST); + } else if (!empty($_GET)) { + $_REQUEST = $_GET; + } else if (!empty($_POST)) { + $_REQUEST = $_POST; + } else { + $_REQUEST = array(); + } +} + +// check parameter syntax +foreach($vardom as $var => $dom) { + if (!isset($_REQUEST[$var])) { + $MYREQUEST[$var]=NULL; + } else if (!is_array($_REQUEST[$var]) && preg_match($dom.'D',$_REQUEST[$var])) { + $MYREQUEST[$var]=$_REQUEST[$var]; + } else { + $MYREQUEST[$var]=$_REQUEST[$var]=NULL; + } +} + +// check parameter sematics +if (empty($MYREQUEST['SCOPE'])) $MYREQUEST['SCOPE']="A"; +if (empty($MYREQUEST['SORT1'])) $MYREQUEST['SORT1']="H"; +if (empty($MYREQUEST['SORT2'])) $MYREQUEST['SORT2']="D"; +if (empty($MYREQUEST['OB'])) $MYREQUEST['OB']=OB_HOST_STATS; +if (!isset($MYREQUEST['COUNT'])) $MYREQUEST['COUNT']=20; +if (!isset($scope_list[$MYREQUEST['SCOPE']])) $MYREQUEST['SCOPE']='A'; + +$MY_SELF= + "$PHP_SELF". + "?SCOPE=".$MYREQUEST['SCOPE']. + "&SORT1=".$MYREQUEST['SORT1']. + "&SORT2=".$MYREQUEST['SORT2']. + "&COUNT=".$MYREQUEST['COUNT']; +$MY_SELF_WO_SORT= + "$PHP_SELF". + "?SCOPE=".$MYREQUEST['SCOPE']. + "&COUNT=".$MYREQUEST['COUNT']; + +$GLOBALS['MY_SELF'] = $MY_SELF; +$GLOBALS['MY_SELF_WO_SORT'] = $MY_SELF_WO_SORT; + +// authentication needed? +// +if (!USE_AUTHENTICATION) { + $AUTHENTICATED=1; +} else { + $AUTHENTICATED=0; + if (ADMIN_PASSWORD!='password' && ($MYREQUEST['LO'] == 1 || isset($_SERVER['PHP_AUTH_USER']))) { + + if (!isset($_SERVER['PHP_AUTH_USER']) || + !isset($_SERVER['PHP_AUTH_PW']) || + $_SERVER['PHP_AUTH_USER'] != ADMIN_USERNAME || + $_SERVER['PHP_AUTH_PW'] != ADMIN_PASSWORD) { + Header("WWW-Authenticate: Basic realm=\"APC Login\""); + Header("HTTP/1.0 401 Unauthorized"); + + echo << +

Rejected!

+ Wrong Username or Password!
 
  + Continue... + +EOB; + exit; + + } else { + $AUTHENTICATED=1; + } + } +} + +$GLOBALS['AUTHENTICATED'] = $AUTHENTICATED; + +// select cache mode +if ($AUTHENTICATED && $MYREQUEST['OB'] == OB_USER_CACHE) { + $cache_mode='user'; +} +// clear cache +if ($AUTHENTICATED && isset($MYREQUEST['CC']) && $MYREQUEST['CC']) { + apc_clear_cache($cache_mode); +} + +if ($AUTHENTICATED && !empty($MYREQUEST['DU'])) { + apc_delete($MYREQUEST['DU']); +} + +if(!function_exists('apc_cache_info') || !($cache=@apc_cache_info($cache_mode))) { + echo "No cache info available. APC does not appear to be running."; + exit; +} + +$cache_user = apc_cache_info('user', 1); +$mem=apc_sma_info(); +if(!$cache['num_hits']) { $cache['num_hits']=1; $time++; } // Avoid division by 0 errors on a cache clear + +// don't cache this page +// +header("Cache-Control: no-store, no-cache, must-revalidate"); // HTTP/1.1 +header("Cache-Control: post-check=0, pre-check=0", false); +header("Pragma: no-cache"); // HTTP/1.0 + +function duration($ts) { + global $time; + $years = (int)((($time - $ts)/(7*86400))/52.177457); + $rem = (int)(($time-$ts)-($years * 52.177457 * 7 * 86400)); + $weeks = (int)(($rem)/(7*86400)); + $days = (int)(($rem)/86400) - $weeks*7; + $hours = (int)(($rem)/3600) - $days*24 - $weeks*7*24; + $mins = (int)(($rem)/60) - $hours*60 - $days*24*60 - $weeks*7*24*60; + $str = ''; + if($years==1) $str .= "$years year, "; + if($years>1) $str .= "$years years, "; + if($weeks==1) $str .= "$weeks week, "; + if($weeks>1) $str .= "$weeks weeks, "; + if($days==1) $str .= "$days day,"; + if($days>1) $str .= "$days days,"; + if($hours == 1) $str .= " $hours hour and"; + if($hours>1) $str .= " $hours hours and"; + if($mins == 1) $str .= " 1 minute"; + else $str .= " $mins minutes"; + return $str; +} + +// create graphics +// +function graphics_avail() { + return extension_loaded('gd'); +} +if (isset($MYREQUEST['IMG'])) +{ + if (!graphics_avail()) { + exit(0); + } + + function fill_arc($im, $centerX, $centerY, $diameter, $start, $end, $color1,$color2,$text='',$placeindex=0) { + $r=$diameter/2; + $w=deg2rad((360+$start+($end-$start)/2)%360); + + + if (function_exists("imagefilledarc")) { + // exists only if GD 2.0.1 is avaliable + imagefilledarc($im, $centerX+1, $centerY+1, $diameter, $diameter, $start, $end, $color1, IMG_ARC_PIE); + imagefilledarc($im, $centerX, $centerY, $diameter, $diameter, $start, $end, $color2, IMG_ARC_PIE); + imagefilledarc($im, $centerX, $centerY, $diameter, $diameter, $start, $end, $color1, IMG_ARC_NOFILL|IMG_ARC_EDGED); + } else { + imagearc($im, $centerX, $centerY, $diameter, $diameter, $start, $end, $color2); + imageline($im, $centerX, $centerY, $centerX + cos(deg2rad($start)) * $r, $centerY + sin(deg2rad($start)) * $r, $color2); + imageline($im, $centerX, $centerY, $centerX + cos(deg2rad($start+1)) * $r, $centerY + sin(deg2rad($start)) * $r, $color2); + imageline($im, $centerX, $centerY, $centerX + cos(deg2rad($end-1)) * $r, $centerY + sin(deg2rad($end)) * $r, $color2); + imageline($im, $centerX, $centerY, $centerX + cos(deg2rad($end)) * $r, $centerY + sin(deg2rad($end)) * $r, $color2); + imagefill($im,$centerX + $r*cos($w)/2, $centerY + $r*sin($w)/2, $color2); + } + if ($text) { + if ($placeindex>0) { + imageline($im,$centerX + $r*cos($w)/2, $centerY + $r*sin($w)/2,$diameter, $placeindex*12,$color1); + imagestring($im,4,$diameter, $placeindex*12,$text,$color1); + + } else { + imagestring($im,4,$centerX + $r*cos($w)/2, $centerY + $r*sin($w)/2,$text,$color1); + } + } + } + + function text_arc($im, $centerX, $centerY, $diameter, $start, $end, $color1,$text,$placeindex=0) { + $r=$diameter/2; + $w=deg2rad((360+$start+($end-$start)/2)%360); + + if ($placeindex>0) { + imageline($im,$centerX + $r*cos($w)/2, $centerY + $r*sin($w)/2,$diameter, $placeindex*12,$color1); + imagestring($im,4,$diameter, $placeindex*12,$text,$color1); + + } else { + imagestring($im,4,$centerX + $r*cos($w)/2, $centerY + $r*sin($w)/2,$text,$color1); + } + } + + function fill_box($im, $x, $y, $w, $h, $color1, $color2,$text='',$placeindex='') { + global $col_black; + $x1=$x+$w-1; + $y1=$y+$h-1; + + imagerectangle($im, $x, $y1, $x1+1, $y+1, $col_black); + if($y1>$y) imagefilledrectangle($im, $x, $y, $x1, $y1, $color2); + else imagefilledrectangle($im, $x, $y1, $x1, $y, $color2); + imagerectangle($im, $x, $y1, $x1, $y, $color1); + if ($text) { + if ($placeindex>0) { + + if ($placeindex<16) + { + $px=5; + $py=$placeindex*12+6; + imagefilledrectangle($im, $px+90, $py+3, $px+90-4, $py-3, $color2); + imageline($im,$x,$y+$h/2,$px+90,$py,$color2); + imagestring($im,2,$px,$py-6,$text,$color1); + + } else { + if ($placeindex<31) { + $px=$x+40*2; + $py=($placeindex-15)*12+6; + } else { + $px=$x+40*2+100*intval(($placeindex-15)/15); + $py=($placeindex%15)*12+6; + } + imagefilledrectangle($im, $px, $py+3, $px-4, $py-3, $color2); + imageline($im,$x+$w,$y+$h/2,$px,$py,$color2); + imagestring($im,2,$px+2,$py-6,$text,$color1); + } + } else { + imagestring($im,4,$x+5,$y1-16,$text,$color1); + } + } + } + + + $size = GRAPH_SIZE; // image size + if ($MYREQUEST['IMG']==3) + $image = imagecreate(2*$size+150, $size+10); + else + $image = imagecreate($size+50, $size+10); + + $col_white = imagecolorallocate($image, 0xFF, 0xFF, 0xFF); + $col_red = imagecolorallocate($image, 0xD0, 0x60, 0x30); + $col_green = imagecolorallocate($image, 0x60, 0xF0, 0x60); + $col_black = imagecolorallocate($image, 0, 0, 0); + imagecolortransparent($image,$col_white); + + switch ($MYREQUEST['IMG']) { + + case 1: + $s=$mem['num_seg']*$mem['seg_size']; + $a=$mem['avail_mem']; + $x=$y=$size/2; + $fuzz = 0.000001; + + // This block of code creates the pie chart. It is a lot more complex than you + // would expect because we try to visualize any memory fragmentation as well. + $angle_from = 0; + $string_placement=array(); + for($i=0; $i<$mem['num_seg']; $i++) { + $ptr = 0; + $free = $mem['block_lists'][$i]; + foreach($free as $block) { + if($block['offset']!=$ptr) { // Used block + $angle_to = $angle_from+($block['offset']-$ptr)/$s; + if(($angle_to+$fuzz)>1) $angle_to = 1; + if( ($angle_to*360) - ($angle_from*360) >= 1) { + fill_arc($image,$x,$y,$size,$angle_from*360,$angle_to*360,$col_black,$col_red); + if (($angle_to-$angle_from)>0.05) { + array_push($string_placement, array($angle_from,$angle_to)); + } + } + $angle_from = $angle_to; + } + $angle_to = $angle_from+($block['size'])/$s; + if(($angle_to+$fuzz)>1) $angle_to = 1; + if( ($angle_to*360) - ($angle_from*360) >= 1) { + fill_arc($image,$x,$y,$size,$angle_from*360,$angle_to*360,$col_black,$col_green); + if (($angle_to-$angle_from)>0.05) { + array_push($string_placement, array($angle_from,$angle_to)); + } + } + $angle_from = $angle_to; + $ptr = $block['offset']+$block['size']; + } + if ($ptr < $mem['seg_size']) { // memory at the end + $angle_to = $angle_from + ($mem['seg_size'] - $ptr)/$s; + if(($angle_to+$fuzz)>1) $angle_to = 1; + fill_arc($image,$x,$y,$size,$angle_from*360,$angle_to*360,$col_black,$col_red); + if (($angle_to-$angle_from)>0.05) { + array_push($string_placement, array($angle_from,$angle_to)); + } + } + } + foreach ($string_placement as $angle) { + text_arc($image,$x,$y,$size,$angle[0]*360,$angle[1]*360,$col_black,bsize($s*($angle[1]-$angle[0]))); + } + break; + + case 2: + $s=$cache['num_hits']+$cache['num_misses']; + $a=$cache['num_hits']; + + fill_box($image, 30,$size,50,-$a*($size-21)/$s,$col_black,$col_green,sprintf("%.1f%%",$cache['num_hits']*100/$s)); + fill_box($image,130,$size,50,-max(4,($s-$a)*($size-21)/$s),$col_black,$col_red,sprintf("%.1f%%",$cache['num_misses']*100/$s)); + break; + + case 3: + $s=$mem['num_seg']*$mem['seg_size']; + $a=$mem['avail_mem']; + $x=130; + $y=1; + $j=1; + + // This block of code creates the bar chart. It is a lot more complex than you + // would expect because we try to visualize any memory fragmentation as well. + for($i=0; $i<$mem['num_seg']; $i++) { + $ptr = 0; + $free = $mem['block_lists'][$i]; + foreach($free as $block) { + if($block['offset']!=$ptr) { // Used block + $h=(GRAPH_SIZE-5)*($block['offset']-$ptr)/$s; + if ($h>0) { + $j++; + if($j<75) fill_box($image,$x,$y,50,$h,$col_black,$col_red,bsize($block['offset']-$ptr),$j); + else fill_box($image,$x,$y,50,$h,$col_black,$col_red); + } + $y+=$h; + } + $h=(GRAPH_SIZE-5)*($block['size'])/$s; + if ($h>0) { + $j++; + if($j<75) fill_box($image,$x,$y,50,$h,$col_black,$col_green,bsize($block['size']),$j); + else fill_box($image,$x,$y,50,$h,$col_black,$col_green); + } + $y+=$h; + $ptr = $block['offset']+$block['size']; + } + if ($ptr < $mem['seg_size']) { // memory at the end + $h = (GRAPH_SIZE-5) * ($mem['seg_size'] - $ptr) / $s; + if ($h > 0) { + fill_box($image,$x,$y,50,$h,$col_black,$col_red,bsize($mem['seg_size']-$ptr),$j++); + } + } + } + break; + case 4: + $s=$cache['num_hits']+$cache['num_misses']; + $a=$cache['num_hits']; + + fill_box($image, 30,$size,50,-$a*($size-21)/$s,$col_black,$col_green,sprintf("%.1f%%",$cache['num_hits']*100/$s)); + fill_box($image,130,$size,50,-max(4,($s-$a)*($size-21)/$s),$col_black,$col_red,sprintf("%.1f%%",$cache['num_misses']*100/$s)); + break; + + } + header("Content-type: image/png"); + imagepng($image); + exit; +} + +// pretty printer for byte values +// +function bsize($s) { + foreach (array('','K','M','G') as $i => $k) { + if ($s < 1024) break; + $s/=1024; + } + return sprintf("%5.1f %sBytes",$s,$k); +} + +// sortable table header in "scripts for this host" view +function sortheader($key,$name,$extra='') { + global $MYREQUEST, $MY_SELF_WO_SORT; + + if ($MYREQUEST['SORT1']==$key) { + $MYREQUEST['SORT2'] = $MYREQUEST['SORT2']=='A' ? 'D' : 'A'; + } + return "$name"; + +} + +// create menu entry +function menu_entry($ob,$title) { + global $MYREQUEST,$MY_SELF; + if ($MYREQUEST['OB']!=$ob) { + return "
  • $title
  • "; + } else if (empty($MYREQUEST['SH'])) { + return "
  • $title
  • "; + } else { + return "
  • $title
  • "; + } +} + +function put_login_link($s="Login") +{ + global $MY_SELF,$MYREQUEST,$AUTHENTICATED; + // needs ADMIN_PASSWORD to be changed! + // + if (!USE_AUTHENTICATION) { + return; + } else if (ADMIN_PASSWORD=='password') + { + print <<$s +EOB; + } else if ($AUTHENTICATED) { + print <<$s +EOB; + } +} + + +?> + + +APC INFO <?php echo $host ?> + + + +
    +

    + +
    Opcode Cache
    +

    + +
    +
    + +
  • Refresh Data
  • +EOB; +echo + menu_entry(1,'View Host Stats'), + menu_entry(2,'System Cache Entries'); +if ($AUTHENTICATED) { + echo menu_entry(4,'Per-Directory Entries'); +} +echo + menu_entry(3,'User Cache Entries'), + menu_entry(9,'Version Check'); + +if ($AUTHENTICATED) { + echo <<Clear $cache_mode Cache +EOB; +} +echo << +EOB; + + +// CONTENT +echo << +EOB; + +// MAIN SWITCH STATEMENT + +switch ($MYREQUEST['OB']) { + + + + + +// ----------------------------------------------- +// Host Stats +// ----------------------------------------------- +case OB_HOST_STATS: + $mem_size = $mem['num_seg']*$mem['seg_size']; + $mem_avail= $mem['avail_mem']; + $mem_used = $mem_size-$mem_avail; + $seg_size = bsize($mem['seg_size']); + $req_rate = sprintf("%.2f",($cache['num_hits']+$cache['num_misses'])/($time-$cache['start_time'])); + $hit_rate = sprintf("%.2f",($cache['num_hits'])/($time-$cache['start_time'])); + $miss_rate = sprintf("%.2f",($cache['num_misses'])/($time-$cache['start_time'])); + $insert_rate = sprintf("%.2f",($cache['num_inserts'])/($time-$cache['start_time'])); + $req_rate_user = sprintf("%.2f",($cache_user['num_hits']+$cache_user['num_misses'])/($time-$cache_user['start_time'])); + $hit_rate_user = sprintf("%.2f",($cache_user['num_hits'])/($time-$cache_user['start_time'])); + $miss_rate_user = sprintf("%.2f",($cache_user['num_misses'])/($time-$cache_user['start_time'])); + $insert_rate_user = sprintf("%.2f",($cache_user['num_inserts'])/($time-$cache_user['start_time'])); + $apcversion = phpversion('apc'); + $phpversion = phpversion(); + $number_files = $cache['num_entries']; + $size_files = bsize($cache['mem_size']); + $number_vars = $cache_user['num_entries']; + $size_vars = bsize($cache_user['mem_size']); + $i=0; + echo <<< EOB +

    General Cache Information

    + + + +EOB; + + if(!empty($_SERVER['SERVER_NAME'])) + echo "\n"; + if(!empty($_SERVER['SERVER_SOFTWARE'])) + echo "\n"; + + echo << +EOB; + echo ''; + echo ''; + echo ''; + echo <<
    APC Version$apcversion
    PHP Version$phpversion
    APC Host{$_SERVER['SERVER_NAME']} $host
    Server Software{$_SERVER['SERVER_SOFTWARE']}
    Shared Memory{$mem['num_seg']} Segment(s) with $seg_size +
    ({$cache['memory_type']} memory, {$cache['locking_type']} locking) +
    Start Time',date(DATE_FORMAT,$cache['start_time']),'
    Uptime',duration($cache['start_time']),'
    File Upload Support',$cache['file_upload_progress'],'
    +
    + +

    File Cache Information

    + + + + + + + + + +
    Cached Files$number_files ($size_files)
    Hits{$cache['num_hits']}
    Misses{$cache['num_misses']}
    Request Rate (hits, misses)$req_rate cache requests/second
    Hit Rate$hit_rate cache requests/second
    Miss Rate$miss_rate cache requests/second
    Insert Rate$insert_rate cache requests/second
    Cache full count{$cache['expunges']}
    +
    + +

    User Cache Information

    + + + + + + + + + + +
    Cached Variables$number_vars ($size_vars)
    Hits{$cache_user['num_hits']}
    Misses{$cache_user['num_misses']}
    Request Rate (hits, misses)$req_rate_user cache requests/second
    Hit Rate$hit_rate_user cache requests/second
    Miss Rate$miss_rate_user cache requests/second
    Insert Rate$insert_rate_user cache requests/second
    Cache full count{$cache_user['expunges']}
    +
    + +

    Runtime Settings

    +EOB; + + $j = 0; + foreach (ini_get_all('apc') as $k => $v) { + echo "\n"; + $j = 1 - $j; + } + + if($mem['num_seg']>1 || $mem['num_seg']==1 && count($mem['block_lists'][0])>1) + $mem_note = "Memory Usage
    (multiple slices indicate fragments)"; + else + $mem_note = "Memory Usage"; + + echo <<< EOB +
    ",$k,"",str_replace(',',',
    ',$v['local_value']),"
    +
    + +

    Host Status Diagrams

    + +EOB; + $size='width='.(GRAPH_SIZE+50).' height='.(GRAPH_SIZE+10); + echo << + + + +EOB; + + echo + graphics_avail() ? + ''. + "". + "\n" + : "", + '', + '\n", + '\n", + '', + '', + '\n", + '\n"; + echo <<< EOB + +
    $mem_noteHits & Misses
    \"\"\"\"
     Free: ',bsize($mem_avail).sprintf(" (%.1f%%)",$mem_avail*100/$mem_size)," Hits: ',$cache['num_hits'].sprintf(" (%.1f%%)",$cache['num_hits']*100/($cache['num_hits']+$cache['num_misses'])),"
     Used: ',bsize($mem_used ).sprintf(" (%.1f%%)",$mem_used *100/$mem_size)," Misses: ',$cache['num_misses'].sprintf(" (%.1f%%)",$cache['num_misses']*100/($cache['num_hits']+$cache['num_misses'])),"
    + +
    +

    Detailed Memory Usage and Fragmentation

    + + + + +EOB; + if(isset($mem['adist'])) { + foreach($mem['adist'] as $i=>$v) { + $cur = pow(2,$i); $nxt = pow(2,$i+1)-1; + if($i==0) $range = "1"; + else $range = "$cur - $nxt"; + echo "\n"; + } + } + echo <<

    +EOB; + + // Fragementation: (freeseg - 1) / total_seg + $nseg = $freeseg = $fragsize = $freetotal = 0; + for($i=0; $i<$mem['num_seg']; $i++) { + $ptr = 0; + foreach($mem['block_lists'][$i] as $block) { + if ($block['offset'] != $ptr) { + ++$nseg; + } + $ptr = $block['offset'] + $block['size']; + /* Only consider blocks <5M for the fragmentation % */ + if($block['size']<(5*1024*1024)) $fragsize+=$block['size']; + $freetotal+=$block['size']; + } + $freeseg += count($mem['block_lists'][$i]); + } + + if ($freeseg > 1) { + $frag = sprintf("%.2f%% (%s out of %s in %d fragments)", ($fragsize/$freetotal)*100,bsize($fragsize),bsize($freetotal),$freeseg); + } else { + $frag = "0%"; + } + + if (graphics_avail()) { + $size='width='.(2*GRAPH_SIZE+150).' height='.(GRAPH_SIZE+10); + echo << +EOB; + } + echo <<Fragmentation: $frag +
    $range$v
    +
    +EOB; + + break; + + +// ----------------------------------------------- +// User Cache Entries +// ----------------------------------------------- +case OB_USER_CACHE: + if (!$AUTHENTICATED) { + echo '
    You need to login to see the user values here!
     
    '; + put_login_link("Login now!"); + echo '
    '; + break; + } + $fieldname='info'; + $fieldheading='User Entry Label'; + $fieldkey='info'; + +// ----------------------------------------------- +// System Cache Entries +// ----------------------------------------------- +case OB_SYS_CACHE: + if (!isset($fieldname)) + { + $fieldname='filename'; + $fieldheading='Script Filename'; + if(ini_get("apc.stat")) $fieldkey='inode'; + else $fieldkey='filename'; + } + if (!empty($MYREQUEST['SH'])) + { + echo <<< EOB +
    + +EOB; + + $m=0; + foreach($scope_list as $j => $list) { + foreach($cache[$list] as $i => $entry) { + if (md5($entry[$fieldkey])!=$MYREQUEST['SH']) continue; + foreach($entry as $k => $value) { + if (!$AUTHENTICATED) { + // hide all path entries if not logged in + $value=preg_replace('/^.*(\\/|\\\\)/','<hidden>/',$value); + } + + if ($k == "num_hits") { + $value=sprintf("%s (%.2f%%)",$value,$value*100/$cache['num_hits']); + } + if ($k == 'deletion_time') { + if(!$entry['deletion_time']) $value = "None"; + } + echo + "", + "", + "", + ""; + $m=1-$m; + } + if($fieldkey=='info') { + echo "\n"; + } + break; + } + } + + echo <<
    AttributeValue
    ",ucwords(preg_replace("/_/"," ",$k)),"",(preg_match("/time/",$k) && $value!='None') ? date(DATE_FORMAT,$value) : $value,"
    Stored Value
    ";
    +					$output = var_export(apc_fetch($entry[$fieldkey]),true);
    +					echo htmlspecialchars($output);
    +					echo "
    +
    +EOB; + break; + } + + $cols=6; + echo <<
    Scope: + + ", + ", Sorting:', + '', + '', + '  Search: ', + ' ', + '
    '; + + if (isset($MYREQUEST['SEARCH'])) { + // Don't use preg_quote because we want the user to be able to specify a + // regular expression subpattern. + $MYREQUEST['SEARCH'] = '/'.str_replace('/', '\\/', $MYREQUEST['SEARCH']).'/i'; + if (preg_match($MYREQUEST['SEARCH'], 'test') === false) { + echo '
    Error: enter a valid regular expression as a search query.
    '; + break; + } + } + + echo + '
    ', + '', + '', + '', + '', + '', + '', + ''; + + if($fieldname=='info') { + $cols+=2; + echo ''; + } + echo ''; + + // builds list with alpha numeric sortable keys + // + $list = array(); + foreach($cache[$scope_list[$MYREQUEST['SCOPE']]] as $i => $entry) { + switch($MYREQUEST['SORT1']) { + case 'A': $k=sprintf('%015d-',$entry['access_time']); break; + case 'H': $k=sprintf('%015d-',$entry['num_hits']); break; + case 'Z': $k=sprintf('%015d-',$entry['mem_size']); break; + case 'M': $k=sprintf('%015d-',$entry['mtime']); break; + case 'C': $k=sprintf('%015d-',$entry['creation_time']); break; + case 'T': $k=sprintf('%015d-',$entry['ttl']); break; + case 'D': $k=sprintf('%015d-',$entry['deletion_time']); break; + case 'S': $k=''; break; + } + if (!$AUTHENTICATED) { + // hide all path entries if not logged in + $list[$k.$entry[$fieldname]]=preg_replace('/^.*(\\/|\\\\)/','<hidden>/',$entry); + } else { + $list[$k.$entry[$fieldname]]=$entry; + } + } + + if ($list) { + + // sort list + // + switch ($MYREQUEST['SORT2']) { + case "A": krsort($list); break; + case "D": ksort($list); break; + } + + // output list + $i=0; + foreach($list as $k => $entry) { + if(!$MYREQUEST['SEARCH'] || preg_match($MYREQUEST['SEARCH'], $entry[$fieldname]) != 0) { + echo + '', + "', + '', + '', + '', + '', + ''; + + if($fieldname=='info') { + if($entry['ttl']) + echo ''; + else + echo ''; + } + if ($entry['deletion_time']) { + + echo ''; + } else if ($MYREQUEST['OB'] == OB_USER_CACHE) { + + echo ''; + } else { + echo ''; + } + echo ''; + $i++; + if ($i == $MYREQUEST['COUNT']) + break; + } + } + + } else { + echo ''; + } + echo <<< EOB +
    ',sortheader('S',$fieldheading, "&OB=".$MYREQUEST['OB']),'',sortheader('H','Hits', "&OB=".$MYREQUEST['OB']),'',sortheader('Z','Size', "&OB=".$MYREQUEST['OB']),'',sortheader('A','Last accessed',"&OB=".$MYREQUEST['OB']),'',sortheader('M','Last modified',"&OB=".$MYREQUEST['OB']),'',sortheader('C','Created at', "&OB=".$MYREQUEST['OB']),'',sortheader('T','Timeout',"&OB=".$MYREQUEST['OB']),'',sortheader('D','Deleted at',"&OB=".$MYREQUEST['OB']),'
    ",$entry[$fieldname],'',$entry['num_hits'],'',$entry['mem_size'],'',date(DATE_FORMAT,$entry['access_time']),'',date(DATE_FORMAT,$entry['mtime']),'',date(DATE_FORMAT,$entry['creation_time']),''.$entry['ttl'].' secondsNone', date(DATE_FORMAT,$entry['deletion_time']), ''; + echo '[Delete Now]'; + echo '  
    No data
    +EOB; + + if ($list && $i < count($list)) { + echo "",count($list)-$i,' more available...'; + } + + echo <<< EOB +
    +EOB; + break; + + +// ----------------------------------------------- +// Per-Directory System Cache Entries +// ----------------------------------------------- +case OB_SYS_CACHE_DIR: + if (!$AUTHENTICATED) { + break; + } + + echo <<
    Scope: + + ", + ", Sorting:', + '', + '', + ", Group By Dir Level:', + ' ', + '
    ', + + '
    ', + '', + '', + '', + '', + '', + '', + '', + ''; + + // builds list with alpha numeric sortable keys + // + $tmp = $list = array(); + foreach($cache[$scope_list[$MYREQUEST['SCOPE']]] as $entry) { + $n = dirname($entry['filename']); + if ($MYREQUEST['AGGR'] > 0) { + $n = preg_replace("!^(/?(?:[^/\\\\]+[/\\\\]){".($MYREQUEST['AGGR']-1)."}[^/\\\\]*).*!", "$1", $n); + } + if (!isset($tmp[$n])) { + $tmp[$n] = array('hits'=>0,'size'=>0,'ents'=>0); + } + $tmp[$n]['hits'] += $entry['num_hits']; + $tmp[$n]['size'] += $entry['mem_size']; + ++$tmp[$n]['ents']; + } + + foreach ($tmp as $k => $v) { + switch($MYREQUEST['SORT1']) { + case 'A': $kn=sprintf('%015d-',$v['size'] / $v['ents']);break; + case 'T': $kn=sprintf('%015d-',$v['ents']); break; + case 'H': $kn=sprintf('%015d-',$v['hits']); break; + case 'Z': $kn=sprintf('%015d-',$v['size']); break; + case 'C': $kn=sprintf('%015d-',$v['hits'] / $v['ents']);break; + case 'S': $kn = $k; break; + } + $list[$kn.$k] = array($k, $v['ents'], $v['hits'], $v['size']); + } + + if ($list) { + + // sort list + // + switch ($MYREQUEST['SORT2']) { + case "A": krsort($list); break; + case "D": ksort($list); break; + } + + // output list + $i = 0; + foreach($list as $entry) { + echo + '', + "', + '', + '', + '', + '', + '', + ''; + + if (++$i == $MYREQUEST['COUNT']) break; + } + + } else { + echo ''; + } + echo <<< EOB +
    ',sortheader('S','Directory Name', "&OB=".$MYREQUEST['OB']),'',sortheader('T','Number of Files',"&OB=".$MYREQUEST['OB']),'',sortheader('H','Total Hits', "&OB=".$MYREQUEST['OB']),'',sortheader('Z','Total Size', "&OB=".$MYREQUEST['OB']),'',sortheader('C','Avg. Hits', "&OB=".$MYREQUEST['OB']),'',sortheader('A','Avg. Size', "&OB=".$MYREQUEST['OB']),'
    ",$entry[0],'',$entry[1],'',$entry[2],'',$entry[3],'',round($entry[2] / $entry[1]),'',round($entry[3] / $entry[1]),'
    No data
    +EOB; + + if ($list && $i < count($list)) { + echo "",count($list)-$i,' more available...'; + } + + echo <<< EOB +
    +EOB; + break; + +// ----------------------------------------------- +// Version check +// ----------------------------------------------- +case OB_VERSION_CHECK: + echo <<

    APC Version Information

    + + + + +EOB; + + $rss = @file_get_contents("http://pecl.php.net/feeds/pkg_apc.rss"); + if (!$rss) { + echo ''; + } else { + $apcversion = phpversion('apc'); + + preg_match('!APC ([0-9.]+)!', $rss, $match); + echo ''; + echo ''; + } + echo <<< EOB +
    Unable to fetch version information.
    '; + if (version_compare($apcversion, $match[1], '>=')) { + echo '
    You are running the latest version of APC ('.$apcversion.')
    '; + $i = 3; + } else { + echo '
    You are running an older version of APC ('.$apcversion.'), + newer version '.$match[1].' is available at + http://pecl.php.net/package/APC/'.$match[1].' +
    '; + $i = -1; + } + echo '

    Change Log:


    '; + + preg_match_all('!<(title|description)>([^<]+)!', $rss, $match); + next($match[2]); next($match[2]); + + while (list(,$v) = each($match[2])) { + list(,$ver) = explode(' ', $v, 2); + if ($i < 0 && version_compare($apcversion, $ver, '>=')) { + break; + } else if (!$i--) { + break; + } + echo "".htmlspecialchars($v)."
    "; + echo nl2br(htmlspecialchars(current($match[2])))."
    "; + next($match[2]); + } + echo '
    +
    +EOB; + break; + +} + +echo <<< EOB +
    +EOB; + +?> + + + + diff --git a/library/inex-smarty/functions/compiler.include_if_exists.php b/library/inex-smarty/functions/compiler.include_if_exists.php new file mode 100644 index 000000000..7d63300b9 --- /dev/null +++ b/library/inex-smarty/functions/compiler.include_if_exists.php @@ -0,0 +1,78 @@ +_parse_attrs($tag_attrs); + $arg_list = array(); + if(!isset($_params['file'])) { + $compiler->_syntax_error("missing 'file' attribute in include_exists tag", E_USER_ERROR, __FILE__, __LINE__); + return; + } + + foreach($_params as $arg_name => $arg_value) { + if($arg_name == 'file') { + $include_file = $arg_value; + continue; + } else if($arg_name == 'else') { + $include_file_else = $arg_value; + continue; + } else if($arg_name == 'assign') { + $assign_var = $arg_value; + continue; + } + if(is_bool($arg_value)) { + $arg_value = $arg_value ? 'true' : 'false'; + } + $arg_list[] = "'$arg_name' => $arg_value"; + } + + if($include_file_else) { + $output = "\n\$_include_file = (\$this->template_exists({$include_file})) ? {$include_file} : {$include_file_else};\n"; + } else { + $output = "\nif(\$this->template_exists({$include_file})) {\n"; + } + + if(isset($assign_var)) { + $output .= "ob_start();\n"; + } + + $output .= "\$_smarty_tpl_vars = \$this->_tpl_vars;\n"; + + if($include_file_else) { + $params = "array('smarty_include_tpl_file' => \$_include_file, 'smarty_include_vars' => array(".implode(',', (array)$arg_list)."))"; + } else { + $params = "array('smarty_include_tpl_file' => {$include_file}, 'smarty_include_vars' => array(".implode(',', (array)$arg_list)."))"; + } + $output .= "\$this->_smarty_include($params);\n" . + "\$this->_tpl_vars = \$_smarty_tpl_vars;\n" . + "unset(\$_smarty_tpl_vars);\n"; + + if(isset($assign_var)) { + $output .= "\$this->assign(" . $assign_var . ", ob_get_contents()); ob_end_clean();\n"; + } + + if($include_file_else) { + $output .= "unset(\$_include_file);\n"; + } else { + $output .= "}\n"; + } + + return $output; +} diff --git a/library/inex-smarty/functions/function.genDoctrinePagerLinks.php b/library/inex-smarty/functions/function.genDoctrinePagerLinks.php new file mode 100644 index 000000000..a1b4f8ad4 --- /dev/null +++ b/library/inex-smarty/functions/function.genDoctrinePagerLinks.php @@ -0,0 +1,117 @@ + the Doctrine pagination object + * showPageCount => show an extra row of: Page x of y + * + * @param array $params The attributes used when calling the function + * @param object $smarty The Smarty object + */ +function smarty_function_genDoctrinePagerLinks( $params, &$smarty ) +{ + // remove non-URL parameters from the parameters array + $pager = $params['pager']; + unset( $params['pager'] ); + + $showPageCount = isset( $params['showPageCount'] ) && $params['showPageCount'] ? true : false; + + $baseUrl = smarty_function_genUrl( array(), $smarty ); + + $links = ''; + + // number of columns in the pagination table + $numCols = 4; // always first, prev, next, last + + $params['p'] = $pager->getFirstPage(); + if( $pager->getPage() == $params['p'] ) + $links .= ''; + else + $links .= ''; + + $params['p'] = $pager->getPreviousPage(); + if( $pager->getPage() == $params['p'] ) + $links .= ''; + else + $links .= ''; + + + $pagerRange = new Doctrine_Pager_Range_Sliding( + array( + 'chunk' => 5 // Chunk length + ), + $pager + ); + + foreach( $pagerRange->rangeAroundPage() as $p ) + { + if( $p == $pager->getPage() ) + $links .= ""; + else + { + $params['p'] = $p; + $links .= ''; + } + + $numCols++; + } + + $params['p'] = $pager->getNextPage(); + if( $pager->getPage() == $params['p'] ) + $links .= ''; + else + $links .= ''; + + $params['p'] = $pager->getLastPage(); + if( $pager->getPage() == $params['p'] ) + $links .= ''; + else + $links .= ''; + + $links .= ''; + + if( $showPageCount ) + { + $links .= "\n\n"; + } + + $links .= '
    |<|<<<$p' . $p . '>>|>>|
    Page " . $pager->getPage() . " of " . $pager->getLastPage() . "
    '; + + return $links; +} + + diff --git a/library/inex-smarty/functions/function.genMrtgGraphBox.php b/library/inex-smarty/functions/function.genMrtgGraphBox.php new file mode 100644 index 000000000..053b29d00 --- /dev/null +++ b/library/inex-smarty/functions/function.genMrtgGraphBox.php @@ -0,0 +1,91 @@ + + + + + + + + + + + Max     + + + Average     + + + Current     + + + + + + In + + + {$params['values']['maxin']} + + + {$params['values']['averagein']} + + + {$params['values']['curin']} + + + + + + Out + + + {$params['values']['maxout']} + + + {$params['values']['averageout']} + + + {$params['values']['curout']} + + + + +END_BOX; + + return $box; +} + +?> \ No newline at end of file diff --git a/library/inex-smarty/functions/function.genMrtgImgUrl.php b/library/inex-smarty/functions/function.genMrtgImgUrl.php new file mode 100644 index 000000000..4827a5144 --- /dev/null +++ b/library/inex-smarty/functions/function.genMrtgImgUrl.php @@ -0,0 +1,35 @@ + \ No newline at end of file diff --git a/library/inex-smarty/functions/function.genMrtgImgUrlTag.php b/library/inex-smarty/functions/function.genMrtgImgUrlTag.php new file mode 100644 index 000000000..bde246252 --- /dev/null +++ b/library/inex-smarty/functions/function.genMrtgImgUrlTag.php @@ -0,0 +1,37 @@ +'; +} + +?> \ No newline at end of file diff --git a/library/inex-smarty/functions/function.genUrl.php b/library/inex-smarty/functions/function.genUrl.php new file mode 100644 index 000000000..cdc1aca33 --- /dev/null +++ b/library/inex-smarty/functions/function.genUrl.php @@ -0,0 +1,62 @@ + index (for example) + * action => index (for example) + * var1 => value1 (for example) + * @param array $params The attributes used when calling the function + * @param object $smarty The Smarty object + */ +function smarty_function_genUrl( $params, &$smarty ) +{ + $url = Zend_Controller_Front::getInstance()->getBaseUrl(); + + if( isset( $params['controller'] ) ) + { + $url .= "/{$params['controller']}"; + + if( isset( $params['action'] ) ) + { + $url .= "/{$params['action']}"; + + foreach( $params as $var => $value ) + { + if( $var != 'controller' && $var != 'action') + $url .= "/$var/$value"; + } + } + } + + return $url; +} + +?> \ No newline at end of file diff --git a/library/inex-smarty/functions/function.getMrtgStatistics.php b/library/inex-smarty/functions/function.getMrtgStatistics.php new file mode 100644 index 000000000..430e8bfea --- /dev/null +++ b/library/inex-smarty/functions/function.getMrtgStatistics.php @@ -0,0 +1,58 @@ +'; +} + +?> \ No newline at end of file diff --git a/library/inex-smarty/functions/function.mrtgScale.php b/library/inex-smarty/functions/function.mrtgScale.php new file mode 100644 index 000000000..693a8b757 --- /dev/null +++ b/library/inex-smarty/functions/function.mrtgScale.php @@ -0,0 +1,38 @@ + \ No newline at end of file diff --git a/library/inex-smarty/functions/modifier.asnumber.php b/library/inex-smarty/functions/modifier.asnumber.php new file mode 100644 index 000000000..3e5f3912d --- /dev/null +++ b/library/inex-smarty/functions/modifier.asnumber.php @@ -0,0 +1,38 @@ +' . $value . ''; +} + diff --git a/library/inex-smarty/functions/modifier.underline.php b/library/inex-smarty/functions/modifier.underline.php new file mode 100644 index 000000000..50437d358 --- /dev/null +++ b/library/inex-smarty/functions/modifier.underline.php @@ -0,0 +1,47 @@ +bP0l+XkK8G}75 literal 0 HcmV?d00001 diff --git a/public/css/images/controls.png b/public/css/images/controls.png new file mode 100644 index 0000000000000000000000000000000000000000..65cfd1dc95c5ee4c6c3d0848b1dcfc0ec69f6aea GIT binary patch literal 2033 zcmVY16Dl9G~IT3Xc9)Z^ph#l^+1udkq>pj%s8x3{-FJw3a- zyTZc4tgNhJVPUGOs=2wjTUuIPU0s)#m&C-xo0^)sxw(yvjeLB3^78U4D=RH6Ei5c7 zO-)TME-o-IFwM=)IXOA(>+9v^gnk!Dk@A&OhZFMI5;>mGBP$cHrd(PIyySo z*x1a>%u7p4z`(#lLPF^0=SN3JF)=YpN=iXNLGSMFH#av(NJvFRMNv^v@$vCHJ3Bl) zJTo&hNl8iR>FGvBMo>^t>+0%WUS93(?OFDTAPEK`obwEHsK0ZFDr>E}i?Y_RgTwGjIQc{VDiO$Z>?Ck7QQ&aZ#_VDoVc6N4O zUti|s<#>2_pP!#*wE#@J%|ZXjkIv8d15RfRBQxe$bh z9TUw{N+{bY1z&)8>k2t;d{xYxg76&eJ5GSmab7cm2*kJn zLPONkBzslPWkA+%7~Rthzj+ZdH;HAk-Pq6JDgZ%}1qZgnS8` z|A!BGUTY0vuJ8~Q8k9-cggFrxrb5iS-G06qcV|ScTS@l&{bZ%90njJ((hDH>go-Ov zZbB$mN3X(#_fF&Gsyr1MX$KPpfH2>rC?r$(w4Y$dt3?|Rbk9;C`p(jcaF$k70KON_ zQXS~iuoPW9OL=;PXDK^qs;!en!tGwM8Dm32zK3Hnob~aBRzMgVd)VIwFSb@T|pRnFQtL^ zQVJ_)!)j6(b&PC(dhopzE0a4<>r<@qU z`!EtA#BilIes-lde&oVm?AXss0zni9@U)s;c2)_BE*-ve3qd+Xkx|kwB9dCkgI$6` z2)acBb&UMSYiGCKj*SBn@)q-Z5n&E~kT-AMBO%kChC#@X|0tXb=fe3-(?1oCZXuoB zLi}_KX?F|Z?iRyJn&Er?*=Fkav37KPz4^Q2i%?hdj$hRY5$X6y8bhS1yyTxuueKWC z5CSWPU;%-YXn=qr((#(QE2FU06#>QwQ5V+BI|UkI(*RRqvv@oZ-B#&@=C_U&BCHmt zC#jJURR)BX9qafF9iN(TLwU10A{?j~CXS78W{8Uu@HZ?#PAyEpFp1S*%EGlpZ`N&L zTO`O5246{p*$9hz`Xxjbs;;d1D5fGugh*6-y27O=ZrgP)q5m%J z%*b8(_kO793Uc&AR^jAtn*OA38fGEGyOcr5Fk7$*{qtd@niJ25{6h8_pFvpWJ0e#STIxNJ)pDn{H0&eE#G130bNngTwLQ z{r-aw>G;0=r|=|0AtWIQNk~Exl8}TXBq0e&sC~j#A{E;EQlD^{NCv_KN?|hzt4p`= zmiMYgEZpwcxm$P_8++%CQ5bCMy}oe)uer?ORv)df%L>+~SMRSwxVo4v42N~krH0-D zsqp7BEemF3oQ#jZH?};MT1`)gSQr3NRVET5olgiEnaToD3Vmr;&eR^luC95&D|F|1 zySmIE&VwgJDV!&k+duls&IXn^h1S?O8(9D%7J?Dx?3|Gb?cRJt`cH*#(!#mIWIQCf P00000NkvXXu0mjf=5OWV literal 0 HcmV?d00001 diff --git a/public/css/images/loading.gif b/public/css/images/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..b4695d811d4f84ed693eff7b5e6b4d61a3e8c48d GIT binary patch literal 9427 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 +*/ + +.ThemeOfficeMenuItem img.seq1 +{ + display: inline; +} + +.ThemeOfficeMenuItemHover seq2, +.ThemeOfficeMenuItemActive seq2 +{ + display: inline; +} + +.ThemeOfficeMenuItem .seq2, +.ThemeOfficeMenuItemHover .seq1, +.ThemeOfficeMenuItemActive .seq1 +{ + display: none; +} + + +/* inactive settings */ +div.inactive td.ThemeOfficeMainItemHover, div.inactive td.ThemeOfficeMainItemActive +{ + border-top: 0px; + border-right: 1px solid #f1f3f5; + border-left: 1px solid #f1f3f5; +} + +div.inactive .ThemeOfficeMainItem { + color: #bbb; + +} + +div.inactive span.ThemeOfficeMainItemText { + color: #aaa; +} + +div.inactive .ThemeOfficeMainItemHover, div.inactive .ThemeOfficeMainItemActive +{ + background-color: #f1f3f5; +} \ No newline at end of file diff --git a/public/css/joomla.css b/public/css/joomla.css new file mode 100644 index 000000000..113643a95 --- /dev/null +++ b/public/css/joomla.css @@ -0,0 +1,462 @@ +/* ThemeOfficeMenu Style Sheet */ + +.ThemeOfficeMenu,.ThemeOfficeSubMenuTable +{ + font-family: arial, verdana, sans-serif; + font-size: 13px; + padding: 0; + white-space: nowrap; + cursor: default; + height: 25px; +} + +.ThemeOfficeSubMenu +{ + position: absolute; + visibility: hidden; + + /* + Netscape/Mozilla renders borders by increasing + their z-index. The following line is necessary + to cover any borders underneath + */ + z-index: 100; + border: 0; + padding: 0; + + overflow: visible; + border: 1px solid #8C867B; + + filter:progid:DXImageTransform.Microsoft.Shadow(color=#BDC3BD, Direction=135, Strength=4); +} + +.ThemeOfficeSubMenuTable +{ + overflow: visible; +} + +.ThemeOfficeMainItem,.ThemeOfficeMainItemHover,.ThemeOfficeMainItemActive, +.ThemeOfficeMenuItem,.ThemeOfficeMenuItemHover,.ThemeOfficeMenuItemActive +{ + border: 0; + cursor: default; + white-space: nowrap; +} + +.ThemeOfficeMainItem +{ + /*background-color: #EFEBDE;*/ +} + +.ThemeOfficeMainItemHover,.ThemeOfficeMainItemActive +{ + background-color: #f1e8e6; +} + +.ThemeOfficeMenuItem +{ + background-color: #F1F3F5; +} + +.ThemeOfficeMenuItemHover,.ThemeOfficeMenuItemActive +{ + background-color: #f1e8e6; +} + + +/* horizontal main menu */ + +.ThemeOfficeMainItem +{ + padding: 4px 1px 4px 1px; + border: 0; +} + +td.ThemeOfficeMainItemHover,td.ThemeOfficeMainItemActive +{ + padding: 0px; + border-right: 1px solid #c24733; + border-left: 1px solid #c24733; +} + +.ThemeOfficeMainFolderLeft,.ThemeOfficeMainItemLeft, +.ThemeOfficeMainFolderText,.ThemeOfficeMainItemText, +.ThemeOfficeMainFolderRight,.ThemeOfficeMainItemRight +{ + background-color: inherit; +} + +/* vertical main menu sub components */ + +td.ThemeOfficeMainFolderLeft,td.ThemeOfficeMainItemLeft +{ + padding-top: 2px; + padding-bottom: 2px; + padding-left: 0px; + padding-right: 2px; + + border-top: 1px solid #c24733; + border-bottom: 1px solid #c24733; + border-left: 1px solid #c24733; + + background-color: inherit; +} + +td.ThemeOfficeMainFolderText,td.ThemeOfficeMainItemText +{ + padding-top: 2px; + padding-bottom: 2px; + padding-left: 5px; + padding-right: 5px; + + border-top: 1px solid #c24733; + border-bottom: 1px solid #c24733; + + background-color: inherit; + white-space: nowrap; +} + +td.ThemeOfficeMainFolderRight,td.ThemeOfficeMainItemRight +{ + padding-top: 2px; + padding-bottom: 2px; + padding-left: 0px; + padding-right: 0px; + + border-top: 1px solid #c24733; + border-bottom: 1px solid #c24733; + border-right: 1px solid #c24733; + + background-color: inherit; +} + +tr.ThemeOfficeMainItem td.ThemeOfficeMainFolderLeft, +tr.ThemeOfficeMainItem td.ThemeOfficeMainItemLeft +{ + padding-top: 3px; + padding-bottom: 3px; + padding-left: 1px; + padding-right: 2px; + + white-space: nowrap; + + border: 0; + background-color: inherit; +} + +tr.ThemeOfficeMainItem td.ThemeOfficeMainFolderText, +tr.ThemeOfficeMainItem td.ThemeOfficeMainItemText +{ + padding-top: 3px; + padding-bottom: 3px; + padding-left: 5px; + padding-right: 5px; + + border: 0; + background-color: inherit; +} + +tr.ThemeOfficeMainItem td.ThemeOfficeMainItemRight, +tr.ThemeOfficeMainItem td.ThemeOfficeMainFolderRight +{ + padding-top: 3px; + padding-bottom: 3px; + padding-left: 0px; + padding-right: 1px; + + border: 0; + background-color: inherit; +} + +/* sub menu sub components */ + +.ThemeOfficeMenuFolderLeft,.ThemeOfficeMenuItemLeft +{ + padding-top: 2px; + padding-bottom: 2px; + padding-left: 1px; + padding-right: 3px; + + border-top: 1px solid #c24733; + border-bottom: 1px solid #c24733; + border-left: 1px solid #c24733; + + background-color: inherit; + white-space: nowrap; +} + +.ThemeOfficeMenuFolderText,.ThemeOfficeMenuItemText +{ + padding-top: 2px; + padding-bottom: 2px; + padding-left: 5px; + padding-right: 5px; + + border-top: 1px solid #c24733; + border-bottom: 1px solid #c24733; + + background-color: inherit; + white-space: nowrap; +} + +.ThemeOfficeMenuFolderRight,.ThemeOfficeMenuItemRight +{ + padding-top: 2px; + padding-bottom: 2px; + padding-left: 0px; + padding-right: 0px; + + border-top: 1px solid #c24733; + border-bottom: 1px solid #c24733; + border-right: 1px solid #c24733; + + background-color: inherit; + white-space: nowrap; +} + +.ThemeOfficeMenuItem .ThemeOfficeMenuFolderLeft, +.ThemeOfficeMenuItem .ThemeOfficeMenuItemLeft +{ + padding-top: 3px; + padding-bottom: 3px; + padding-left: 2px; + padding-right: 3px; + + white-space: nowrap; + + border: 0px; + background-color: #DDE1E6; +} + +.ThemeOfficeMenuItem .ThemeOfficeMenuFolderText, +.ThemeOfficeMenuItem .ThemeOfficeMenuItemText +{ + padding-top: 3px; + padding-bottom: 3px; + padding-left: 5px; + padding-right: 5px; + + border: 0px; + background-color: inherit; +} + +.ThemeOfficeMenuItem .ThemeOfficeMenuFolderRight, +.ThemeOfficeMenuItem .ThemeOfficeMenuItemRight +{ + padding-top: 3px; + padding-bottom: 3px; + padding-left: 0px; + padding-right: 1px; + + border: 0; + background-color: inherit; +} + +/* menu splits */ + +.ThemeOfficeMenuSplit +{ + margin: 2px; + height: 1px; + overflow: hidden; + background-color: inherit; + border-top: 1px solid #C6C3BD; +} + +/* image shadow animation */ + +/* + seq1: image for normal + seq2: image for hover and active + + To use, in the icon field, input the following: + +*/ + +.ThemeOfficeMenuItem img.seq1 +{ + display: inline; +} + +.ThemeOfficeMenuItemHover seq2, +.ThemeOfficeMenuItemActive seq2 +{ + display: inline; +} + +.ThemeOfficeMenuItem .seq2, +.ThemeOfficeMenuItemHover .seq1, +.ThemeOfficeMenuItemActive .seq1 +{ + display: none; +} + + +/* inactive settings */ +div.inactive td.ThemeOfficeMainItemHover, div.inactive td.ThemeOfficeMainItemActive +{ + border-top: 0px; + border-right: 1px solid #f1f3f5; + border-left: 1px solid #f1f3f5; +} + +div.inactive .ThemeOfficeMainItem { + color: #bbb; + +} + +div.inactive span.ThemeOfficeMainItemText { + color: #aaa; +} + +div.inactive .ThemeOfficeMainItemHover, div.inactive .ThemeOfficeMainItemActive +{ + background-color: #f1f3f5; +} + + + + + + + +/** +* @version $Id: template_css.css 1594 2005-12-31 04:51:00Z stingrey $ +* @package Joomla +* @copyright Copyright (C) 2005 Open Source Matters. All rights reserved. +* @license http://www.gnu.org/copyleft/gpl.html GNU/GPL, see LICENSE.php +* Joomla! is free software and parts of it may contain or be derived from works +* licensed under the GNU General Public License or other free or open source +* software licenses. See COPYRIGHT.php for copyright notices and details. +*/ + +table.menubar { + width: 100%; + margin-bottom: 0px; +} + + +/* header block */ +table.adminheading { + background-color: #FFF; + margin: 0px; + padding: 0px; + border: 0px; + width: 100%; + border-collapse: collapse; + color: #4FA500; + font-size : 153.9%; + font-weight: bold; + text-align: left; +} +table.adminheading th { + background: url(../images/joomla-admin/generic.png) no-repeat left; + text-align: left; + height: 50px; + width: 99%; + padding-left: 75px; + border-bottom: 5px solid #fff; +} + +table.adminheading th.Cabinet { + background: url(../images/joomla-admin/cabinets.png) no-repeat left; +} + +table.adminheading th.ChangeLog { + background: url(../images/joomla-admin/change-log.png) no-repeat left; +} + +table.adminheading th.ConsoleServerConnection { + background: url(../images/joomla-admin/console.png) no-repeat left; +} + +table.adminheading th.Contact { + background: url(../images/joomla-admin/kontact.png) no-repeat left; +} + +table.adminheading th.Customer { + background: url(../images/joomla-admin/user.png) no-repeat left; +} + +table.adminheading th.CustKit { + background: url(../images/joomla-admin/drive-optical.png) no-repeat left; +} + +table.adminheading th.Document { + background: url(../images/joomla-admin/generic.png) no-repeat left; +} + +table.adminheading th.Drupal { + background: url(../images/joomla-admin/drupalicon.png) no-repeat left; +} + +table.adminheading th.Interface { + background: url(../images/joomla-admin/interface.png) no-repeat left; +} + +table.adminheading th.Location { + background: url(../images/joomla-admin/browser.png) no-repeat left; +} + +table.adminheading th.Meeting { + background: url(../images/joomla-admin/kdmconfig.png) no-repeat left; +} + +table.adminheading th.LogicalCircuit { + background: url(../images/joomla-admin/insert-link.png) no-repeat left; +} + +table.adminheading th.PatchPanel { + background: url(../images/joomla-admin/insert-link.png) no-repeat left; +} + +table.adminheading th.Peering { + background: url(../images/joomla-admin/joomla.png) no-repeat left; +} + +table.adminheading th.profile { + background: url(../images/joomla-admin/gaim.png) no-repeat left; +} + +table.adminheading th.Provision { + background: url(../images/joomla-admin/install.png) no-repeat left; +} + +table.adminheading th.Switch { + background: url(../images/joomla-admin/switch.png) no-repeat left; +} + +table.adminheading th.User { + background: url(../images/joomla-admin/system-users.png) no-repeat left; +} + +table.adminheading th.Vendor { + background: url(../images/joomla-admin/vendor.png) no-repeat left; +} + +table.adminheading th.VLAN { + background: url(../images/joomla-admin/vlan.png) no-repeat left; +} + +table.adminheading th.Statistics { + background: url(../images/joomla-admin/ksysguard.png) no-repeat left; +} + +.menubackgr { + background: #F1F3F5; + border-bottom: 1px solid #cccccc; + border-right: 1px solid #cccccc; + border-left: 1px solid #cccccc; + padding: 0px; +} + +.menudottedline { + border-bottom: 1px solid #cccccc; + border-top: 1px solid #ffffff; + background-color: #F1F3F5; +} + + + + + diff --git a/public/css/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png b/public/css/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png new file mode 100644 index 0000000000000000000000000000000000000000..5b5dab2ab7b1c50dea9cfe73dc5a269a92d2d4b4 GIT binary patch literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F!3HG1q!d*FscKIb$B>N1x91EQ4=4yQ7#`R^ z$vje}bP0l+XkK DSH>_4 literal 0 HcmV?d00001 diff --git a/public/css/smoothness/images/ui-bg_flat_75_ffffff_40x100.png b/public/css/smoothness/images/ui-bg_flat_75_ffffff_40x100.png new file mode 100644 index 0000000000000000000000000000000000000000..ac8b229af950c29356abf64a6c4aa894575445f0 GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F!3HG1q!d*FsY*{5$B>N1x91EQ4=4yQYz+E8 zPo9&<{J;c_6SHRil>2s{Zw^OT)6@jj2u|u!(plXsM>LJD`vD!n;OXk;vd$@?2>^GI BH@yG= literal 0 HcmV?d00001 diff --git a/public/css/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png b/public/css/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..b39a6fb27ffbb1f3712e6cfa09e32d8ac084469b GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAGVZ#9R3S1;RaD978O6-%c^)YcSwpKJWJD z|JpSjLTyTM0au+P{Q|{~ccrfTtih}jaMj?JLB%GE%IBZ@R;P8R&vh>hKRn4$W8y9m tv41~zz4&^o`JA=qud+j;_MeV>*a(IzZneqYxgKZ*gQu&X%Q~loCIF^PH4y*+ literal 0 HcmV?d00001 diff --git a/public/css/smoothness/images/ui-bg_glass_65_ffffff_1x400.png b/public/css/smoothness/images/ui-bg_glass_65_ffffff_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..42ccba269b6e91bef12ad0fa18be651b5ef0ee68 GIT binary patch literal 105 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnouqzpV=978O6-=0?FV^9z|eBtf= z|7WztIJ;WT>{+tN>ySr~=F{k$>;_x^_y?afmf9pRKH0)6?eSP?3s5hEr>mdKI;Vst E0O;M1& literal 0 HcmV?d00001 diff --git a/public/css/smoothness/images/ui-bg_glass_75_dadada_1x400.png b/public/css/smoothness/images/ui-bg_glass_75_dadada_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..5a46b47cb16631068aee9e0bd61269fc4e95e5cd GIT binary patch literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnouq|7{B978O6lPf+wIa#m9#>Unb zm^4K~wN3Zq+uP!ti978O6-(K0sd%%E$<-qfe zy5H_kW;AfU6yYV-p*iPSO9q3Y?VZ0$3?Tx74{vDV26o)#~38k_!`W=^oo1w6ixmPC4R1b Tyd6G3lNdZ*{an^LB{Ts5`idse literal 0 HcmV?d00001 diff --git a/public/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/public/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png new file mode 100644 index 0000000000000000000000000000000000000000..7c9fa6c6edcfcdd3e5b77e6f547b719e6fc66e30 GIT binary patch literal 101 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 literal 0 HcmV?d00001 diff --git a/public/css/smoothness/images/ui-icons_2e83ff_256x240.png b/public/css/smoothness/images/ui-icons_2e83ff_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..45e8928e5284adacea3f9ec07b9b50667d2ac65f GIT binary patch literal 4369 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 literal 0 HcmV?d00001 diff --git a/public/css/smoothness/images/ui-icons_454545_256x240.png b/public/css/smoothness/images/ui-icons_454545_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..fe1085b393bf346b975b96f8e7d110d4022a8136 GIT binary patch literal 5355 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 Qe_!Skb$zv36^EGr0aH~0b^rhX literal 0 HcmV?d00001 diff --git a/public/css/smoothness/images/ui-icons_888888_256x240.png b/public/css/smoothness/images/ui-icons_888888_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..5ba708c39172a69e069136bd1309c4322c61f571 GIT binary patch literal 4369 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 literal 0 HcmV?d00001 diff --git a/public/css/smoothness/jquery-ui-1.7.2.custom.css b/public/css/smoothness/jquery-ui-1.7.2.custom.css new file mode 100644 index 000000000..9d773f0f0 --- /dev/null +++ b/public/css/smoothness/jquery-ui-1.7.2.custom.css @@ -0,0 +1,406 @@ +/* +* jQuery UI CSS Framework +* Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about) +* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses. +*/ + +/* Layout helpers +----------------------------------*/ +.ui-helper-hidden { display: none; } +.ui-helper-hidden-accessible { position: absolute; left: -99999999px; } +.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } +.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } +.ui-helper-clearfix { display: inline-block; } +/* required comment for clearfix to work in Opera \*/ +* html .ui-helper-clearfix { height:1%; } +.ui-helper-clearfix { display:block; } +/* end clearfix */ +.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); } + + +/* Interaction Cues +----------------------------------*/ +.ui-state-disabled { cursor: default !important; } + + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } + + +/* Misc visuals +----------------------------------*/ + +/* Overlays */ +.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } + + + +/* +* jQuery UI CSS Framework +* Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about) +* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses. +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana,Arial,sans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=03_highlight_soft.png&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=01_flat.png&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=02_glass.png&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=02_glass.png&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=02_glass.png&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=01_flat.png&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px +*/ + + +/* Component containers +----------------------------------*/ +.ui-widget { font-family: Verdana,Arial,sans-serif; font-size: 1.1em; } +.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif; font-size: 1em; } +.ui-widget-content { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x; color: #222222; } +.ui-widget-content a { color: #222222; } +.ui-widget-header { border: 1px solid #aaaaaa; background: #cccccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x; color: #222222; font-weight: bold; } +.ui-widget-header a { color: #222222; } + +/* Interaction states +----------------------------------*/ +.ui-state-default, .ui-widget-content .ui-state-default { border: 1px solid #d3d3d3; background: #e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #555555; outline: none; } +.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555; text-decoration: none; outline: none; } +.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus { border: 1px solid #999999; background: #dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; outline: none; } +.ui-state-hover a, .ui-state-hover a:hover { color: #212121; text-decoration: none; outline: none; } +.ui-state-active, .ui-widget-content .ui-state-active { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; outline: none; } +.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121; outline: none; text-decoration: none; } + +/* Interaction Cues +----------------------------------*/ +.ui-state-highlight, .ui-widget-content .ui-state-highlight {border: 1px solid #fcefa1; background: #fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x; color: #363636; } +.ui-state-highlight a, .ui-widget-content .ui-state-highlight a { color: #363636; } +.ui-state-error, .ui-widget-content .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x; color: #cd0a0a; } +.ui-state-error a, .ui-widget-content .ui-state-error a { color: #cd0a0a; } +.ui-state-error-text, .ui-widget-content .ui-state-error-text { color: #cd0a0a; } +.ui-state-disabled, .ui-widget-content .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } +.ui-priority-primary, .ui-widget-content .ui-priority-primary { font-weight: bold; } +.ui-priority-secondary, .ui-widget-content .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); } +.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); } +.ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); } +.ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png); } +.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); } +.ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); } +.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png); } +.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png); } + +/* positioning */ +.ui-icon-carat-1-n { background-position: 0 0; } +.ui-icon-carat-1-ne { background-position: -16px 0; } +.ui-icon-carat-1-e { background-position: -32px 0; } +.ui-icon-carat-1-se { background-position: -48px 0; } +.ui-icon-carat-1-s { background-position: -64px 0; } +.ui-icon-carat-1-sw { background-position: -80px 0; } +.ui-icon-carat-1-w { background-position: -96px 0; } +.ui-icon-carat-1-nw { background-position: -112px 0; } +.ui-icon-carat-2-n-s { background-position: -128px 0; } +.ui-icon-carat-2-e-w { background-position: -144px 0; } +.ui-icon-triangle-1-n { background-position: 0 -16px; } +.ui-icon-triangle-1-ne { background-position: -16px -16px; } +.ui-icon-triangle-1-e { background-position: -32px -16px; } +.ui-icon-triangle-1-se { background-position: -48px -16px; } +.ui-icon-triangle-1-s { background-position: -64px -16px; } +.ui-icon-triangle-1-sw { background-position: -80px -16px; } +.ui-icon-triangle-1-w { background-position: -96px -16px; } +.ui-icon-triangle-1-nw { background-position: -112px -16px; } +.ui-icon-triangle-2-n-s { background-position: -128px -16px; } +.ui-icon-triangle-2-e-w { background-position: -144px -16px; } +.ui-icon-arrow-1-n { background-position: 0 -32px; } +.ui-icon-arrow-1-ne { background-position: -16px -32px; } +.ui-icon-arrow-1-e { background-position: -32px -32px; } +.ui-icon-arrow-1-se { background-position: -48px -32px; } +.ui-icon-arrow-1-s { background-position: -64px -32px; } +.ui-icon-arrow-1-sw { background-position: -80px -32px; } +.ui-icon-arrow-1-w { background-position: -96px -32px; } +.ui-icon-arrow-1-nw { background-position: -112px -32px; } +.ui-icon-arrow-2-n-s { background-position: -128px -32px; } +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } +.ui-icon-arrow-2-e-w { background-position: -160px -32px; } +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } +.ui-icon-arrowstop-1-n { background-position: -192px -32px; } +.ui-icon-arrowstop-1-e { background-position: -208px -32px; } +.ui-icon-arrowstop-1-s { background-position: -224px -32px; } +.ui-icon-arrowstop-1-w { background-position: -240px -32px; } +.ui-icon-arrowthick-1-n { background-position: 0 -48px; } +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } +.ui-icon-arrowthick-1-e { background-position: -32px -48px; } +.ui-icon-arrowthick-1-se { background-position: -48px -48px; } +.ui-icon-arrowthick-1-s { background-position: -64px -48px; } +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } +.ui-icon-arrowthick-1-w { background-position: -96px -48px; } +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } +.ui-icon-arrow-4 { background-position: 0 -80px; } +.ui-icon-arrow-4-diag { background-position: -16px -80px; } +.ui-icon-extlink { background-position: -32px -80px; } +.ui-icon-newwin { background-position: -48px -80px; } +.ui-icon-refresh { background-position: -64px -80px; } +.ui-icon-shuffle { background-position: -80px -80px; } +.ui-icon-transfer-e-w { background-position: -96px -80px; } +.ui-icon-transferthick-e-w { background-position: -112px -80px; } +.ui-icon-folder-collapsed { background-position: 0 -96px; } +.ui-icon-folder-open { background-position: -16px -96px; } +.ui-icon-document { background-position: -32px -96px; } +.ui-icon-document-b { background-position: -48px -96px; } +.ui-icon-note { background-position: -64px -96px; } +.ui-icon-mail-closed { background-position: -80px -96px; } +.ui-icon-mail-open { background-position: -96px -96px; } +.ui-icon-suitcase { background-position: -112px -96px; } +.ui-icon-comment { background-position: -128px -96px; } +.ui-icon-person { background-position: -144px -96px; } +.ui-icon-print { background-position: -160px -96px; } +.ui-icon-trash { background-position: -176px -96px; } +.ui-icon-locked { background-position: -192px -96px; } +.ui-icon-unlocked { background-position: -208px -96px; } +.ui-icon-bookmark { background-position: -224px -96px; } +.ui-icon-tag { background-position: -240px -96px; } +.ui-icon-home { background-position: 0 -112px; } +.ui-icon-flag { background-position: -16px -112px; } +.ui-icon-calendar { background-position: -32px -112px; } +.ui-icon-cart { background-position: -48px -112px; } +.ui-icon-pencil { background-position: -64px -112px; } +.ui-icon-clock { background-position: -80px -112px; } +.ui-icon-disk { background-position: -96px -112px; } +.ui-icon-calculator { background-position: -112px -112px; } +.ui-icon-zoomin { background-position: -128px -112px; } +.ui-icon-zoomout { background-position: -144px -112px; } +.ui-icon-search { background-position: -160px -112px; } +.ui-icon-wrench { background-position: -176px -112px; } +.ui-icon-gear { background-position: -192px -112px; } +.ui-icon-heart { background-position: -208px -112px; } +.ui-icon-star { background-position: -224px -112px; } +.ui-icon-link { background-position: -240px -112px; } +.ui-icon-cancel { background-position: 0 -128px; } +.ui-icon-plus { background-position: -16px -128px; } +.ui-icon-plusthick { background-position: -32px -128px; } +.ui-icon-minus { background-position: -48px -128px; } +.ui-icon-minusthick { background-position: -64px -128px; } +.ui-icon-close { background-position: -80px -128px; } +.ui-icon-closethick { background-position: -96px -128px; } +.ui-icon-key { background-position: -112px -128px; } +.ui-icon-lightbulb { background-position: -128px -128px; } +.ui-icon-scissors { background-position: -144px -128px; } +.ui-icon-clipboard { background-position: -160px -128px; } +.ui-icon-copy { background-position: -176px -128px; } +.ui-icon-contact { background-position: -192px -128px; } +.ui-icon-image { background-position: -208px -128px; } +.ui-icon-video { background-position: -224px -128px; } +.ui-icon-script { background-position: -240px -128px; } +.ui-icon-alert { background-position: 0 -144px; } +.ui-icon-info { background-position: -16px -144px; } +.ui-icon-notice { background-position: -32px -144px; } +.ui-icon-help { background-position: -48px -144px; } +.ui-icon-check { background-position: -64px -144px; } +.ui-icon-bullet { background-position: -80px -144px; } +.ui-icon-radio-off { background-position: -96px -144px; } +.ui-icon-radio-on { background-position: -112px -144px; } +.ui-icon-pin-w { background-position: -128px -144px; } +.ui-icon-pin-s { background-position: -144px -144px; } +.ui-icon-play { background-position: 0 -160px; } +.ui-icon-pause { background-position: -16px -160px; } +.ui-icon-seek-next { background-position: -32px -160px; } +.ui-icon-seek-prev { background-position: -48px -160px; } +.ui-icon-seek-end { background-position: -64px -160px; } +.ui-icon-seek-first { background-position: -80px -160px; } +.ui-icon-stop { background-position: -96px -160px; } +.ui-icon-eject { background-position: -112px -160px; } +.ui-icon-volume-off { background-position: -128px -160px; } +.ui-icon-volume-on { background-position: -144px -160px; } +.ui-icon-power { background-position: 0 -176px; } +.ui-icon-signal-diag { background-position: -16px -176px; } +.ui-icon-signal { background-position: -32px -176px; } +.ui-icon-battery-0 { background-position: -48px -176px; } +.ui-icon-battery-1 { background-position: -64px -176px; } +.ui-icon-battery-2 { background-position: -80px -176px; } +.ui-icon-battery-3 { background-position: -96px -176px; } +.ui-icon-circle-plus { background-position: 0 -192px; } +.ui-icon-circle-minus { background-position: -16px -192px; } +.ui-icon-circle-close { background-position: -32px -192px; } +.ui-icon-circle-triangle-e { background-position: -48px -192px; } +.ui-icon-circle-triangle-s { background-position: -64px -192px; } +.ui-icon-circle-triangle-w { background-position: -80px -192px; } +.ui-icon-circle-triangle-n { background-position: -96px -192px; } +.ui-icon-circle-arrow-e { background-position: -112px -192px; } +.ui-icon-circle-arrow-s { background-position: -128px -192px; } +.ui-icon-circle-arrow-w { background-position: -144px -192px; } +.ui-icon-circle-arrow-n { background-position: -160px -192px; } +.ui-icon-circle-zoomin { background-position: -176px -192px; } +.ui-icon-circle-zoomout { background-position: -192px -192px; } +.ui-icon-circle-check { background-position: -208px -192px; } +.ui-icon-circlesmall-plus { background-position: 0 -208px; } +.ui-icon-circlesmall-minus { background-position: -16px -208px; } +.ui-icon-circlesmall-close { background-position: -32px -208px; } +.ui-icon-squaresmall-plus { background-position: -48px -208px; } +.ui-icon-squaresmall-minus { background-position: -64px -208px; } +.ui-icon-squaresmall-close { background-position: -80px -208px; } +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } +.ui-icon-grip-solid-vertical { background-position: -32px -224px; } +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } +.ui-icon-grip-diagonal-se { background-position: -80px -224px; } + + +/* Misc visuals +----------------------------------*/ + +/* Corner radius */ +.ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; } +.ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; } +.ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; } +.ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; } +.ui-corner-top { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; } +.ui-corner-bottom { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; } +.ui-corner-right { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; } +.ui-corner-left { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; } +.ui-corner-all { -moz-border-radius: 4px; -webkit-border-radius: 4px; } + +/* Overlays */ +.ui-widget-overlay { background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); } +.ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -webkit-border-radius: 8px; }/* Accordion +----------------------------------*/ +.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; } +.ui-accordion .ui-accordion-li-fix { display: inline; } +.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; } +.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em 2.2em; } +.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; } +.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; } +.ui-accordion .ui-accordion-content-active { display: block; }/* Datepicker +----------------------------------*/ +.ui-datepicker { width: 17em; padding: .2em .2em 0; } +.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; } +.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; } +.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; } +.ui-datepicker .ui-datepicker-prev { left:2px; } +.ui-datepicker .ui-datepicker-next { right:2px; } +.ui-datepicker .ui-datepicker-prev-hover { left:1px; } +.ui-datepicker .ui-datepicker-next-hover { right:1px; } +.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; } +.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; } +.ui-datepicker .ui-datepicker-title select { float:left; font-size:1em; margin:1px 0; } +.ui-datepicker select.ui-datepicker-month-year {width: 100%;} +.ui-datepicker select.ui-datepicker-month, +.ui-datepicker select.ui-datepicker-year { width: 49%;} +.ui-datepicker .ui-datepicker-title select.ui-datepicker-year { float: right; } +.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; } +.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; } +.ui-datepicker td { border: 0; padding: 1px; } +.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; } +.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; } +.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; } +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; } + +/* with multiple calendars */ +.ui-datepicker.ui-datepicker-multi { width:auto; } +.ui-datepicker-multi .ui-datepicker-group { float:left; } +.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; } +.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; } +.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; } +.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; } +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; } +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; } +.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; } +.ui-datepicker-row-break { clear:both; width:100%; } + +/* RTL support */ +.ui-datepicker-rtl { direction: rtl; } +.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; } +.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; } +.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; } +.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; } +.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; } +.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; } +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; } +.ui-datepicker-rtl .ui-datepicker-group { float:right; } +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; } +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; } + +/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */ +.ui-datepicker-cover { + display: none; /*sorry for IE5*/ + display/**/: block; /*sorry for IE5*/ + position: absolute; /*must have*/ + z-index: -1; /*must have*/ + filter: mask(); /*must have*/ + top: -4px; /*must have*/ + left: -4px; /*must have*/ + width: 200px; /*must have*/ + height: 200px; /*must have*/ +}/* Dialog +----------------------------------*/ +.ui-dialog { position: relative; padding: .2em; width: 300px; } +.ui-dialog .ui-dialog-titlebar { padding: .5em .3em .3em 1em; position: relative; } +.ui-dialog .ui-dialog-title { float: left; margin: .1em 0 .2em; } +.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; } +.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; } +.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; } +.ui-dialog .ui-dialog-content { border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; } +.ui-dialog .ui-dialog-buttonpane { text-align: center; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; } +.ui-dialog .ui-dialog-buttonpane button { float: none; margin: .5em .4em .5em 0; cursor: pointer; padding: .2em .6em .3em .6em; line-height: 1.4em; width:auto; overflow:visible; } +.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; } +.ui-draggable .ui-dialog-titlebar { cursor: move; } +/* Progressbar +----------------------------------*/ +.ui-progressbar { height:2em; text-align: left; } +.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }/* Resizable +----------------------------------*/ +.ui-resizable { position: relative;} +.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;} +.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; } +.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0px; } +.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0px; } +.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0px; height: 100%; } +.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0px; height: 100%; } +.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; } +.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; } +.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; } +.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/* Slider +----------------------------------*/ +.ui-slider { position: relative; text-align: left; } +.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; } +.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; } + +.ui-slider-horizontal { height: .8em; } +.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; } +.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; } +.ui-slider-horizontal .ui-slider-range-min { left: 0; } +.ui-slider-horizontal .ui-slider-range-max { right: 0; } + +.ui-slider-vertical { width: .8em; height: 100px; } +.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; } +.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; } +.ui-slider-vertical .ui-slider-range-min { bottom: 0; } +.ui-slider-vertical .ui-slider-range-max { top: 0; }/* Tabs +----------------------------------*/ +.ui-tabs { padding: .2em; zoom: 1; } +.ui-tabs .ui-tabs-nav { list-style: none; position: relative; padding: .2em .2em 0; } +.ui-tabs .ui-tabs-nav li { position: relative; float: left; border-bottom-width: 0 !important; margin: 0 .2em -1px 0; padding: 0; } +.ui-tabs .ui-tabs-nav li a { float: left; text-decoration: none; padding: .5em 1em; } +.ui-tabs .ui-tabs-nav li.ui-tabs-selected { padding-bottom: 1px; border-bottom-width: 0; } +.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; } +.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */ +.ui-tabs .ui-tabs-panel { padding: 1em 1.4em; display: block; border-width: 0; background: none; } +.ui-tabs .ui-tabs-hide { display: none !important; } diff --git a/public/css/yui/assets/YUIexamples.js b/public/css/yui/assets/YUIexamples.js new file mode 100644 index 000000000..8ee89176f --- /dev/null +++ b/public/css/yui/assets/YUIexamples.js @@ -0,0 +1,32 @@ +//Create namespace: +YAHOO.namespace("yui.examples"); + +//Only instantiate logger stuff if the page has loaded in logger mode: +if((YAHOO.widget.LogReader)&&(YAHOO.util.Dom.get("loggerDiv"))) { + //Create Logger instance for example page: + YAHOO.yui.examples.exampleLogger = new YAHOO.widget.LogReader("loggerDiv"); + + //Logger comes up a bit more cleanly if its container has an approximate + //height and is visibility:hidden intil after init; + YAHOO.yui.examples.loggerInit = function() { + YAHOO.util.Dom.setStyle("loggerDiv", "height", "auto"); + YAHOO.util.Dom.setStyle("loggerDiv", "visibility", "visible"); + } + YAHOO.util.Event.onDOMReady(YAHOO.yui.examples.loggerInit); +} + +//instantiate buttons: +YAHOO.yui.examples.onLinkButtonsMarkupReady = function() { + //if the logger is in use, enable its button: + if (YAHOO.util.Dom.get("loggerLink")) { + var loggerButton = new YAHOO.widget.Button("loggerLink"); + } + + //if a new window button is present, initialize it: + if (YAHOO.util.Dom.get("newWindowLink")) { + var newWindowButton = new YAHOO.widget.Button("newWindowLink"); + } +} +//wait until loggerDiv is present; the window buttons will have loaded +//by then as well: +YAHOO.util.Event.onDOMReady(YAHOO.yui.examples.onLinkButtonsMarkupReady); \ No newline at end of file diff --git a/public/css/yui/assets/bg_hd.gif b/public/css/yui/assets/bg_hd.gif new file mode 100644 index 0000000000000000000000000000000000000000..c10acba460e4e67dcfdb5f979bdd5f5477279e7c GIT binary patch literal 96 zcmZ?wbhEHbWMq(J*v!E2@a@-|&p++H@Z{v}mj|ytd;Rs-^G`o6K770F?87%-e=%SH g#h)x-F&z*IGJ}DI*I=qkwyDA#N0wg-LW~U707hdXa{vGU literal 0 HcmV?d00001 diff --git a/public/css/yui/assets/dpSyntaxHighlighter.css b/public/css/yui/assets/dpSyntaxHighlighter.css new file mode 100644 index 000000000..5fcbdf33b --- /dev/null +++ b/public/css/yui/assets/dpSyntaxHighlighter.css @@ -0,0 +1,190 @@ +/* Give syntax-highlighting textareas some height for unsupported browsers */ + +textarea.JScript, textarea.HTML, textarea.XML {height:10em;} + +/* Main style for the table */ + +.dp-highlighter { + width: 100%; + overflow: auto; + line-height: 100% !important; + margin:0 0 1em 0; +} + +.dp-highlighter table { + width:99% !important; + margin: 2px 0px 2px 0px !important; + border-collapse: collapse; + border-bottom: 2px solid #eee; + background-color: #fff; +} + +.dp-highlighter tbody.hide { display: none; } +.dp-highlighter tbody.show { display: table-row-group; _display: block; } + +.dp-highlighter td +{ + font-family: Courier New; + font-size: 11px; +} + +/* Styles for the tools */ + +.dp-highlighter .tools-corner { + background-color: #eee; + font-size: 9px; +} + +.dp-highlighter .tools { + background-color: #eee; + padding: 3px 8px 3px 10px; + border-bottom: 1px solid gray; + font: 9px Verdana, Geneva, Arial, Helvetica, sans-serif; + color: silver; +} + +.dp-highlighter .tools-corner { + background-color: #eee; +} + +.dp-highlighter .tools a { + font-size: 9px; + color: gray; + text-decoration: none; +} + +.dp-highlighter .tools a:hover { + color: red; + text-decoration: underline; +} + +/* Gutter with line number */ + +.dp-highlighter .gutter { + padding-right: 5px; + padding-left: 10px; + width: 5px; + background-color: #eee; + border-right: 1px solid gray; + color: gray; + text-align: right; + vertical-align: top; +} + +/* Single line style */ + +.dp-highlighter .line1, .line2 { + padding-left: 10px; + /*border-bottom: 1px solid #F7F7F7;*/ + white-space:nowrap; +} + +.dp-highlighter .line2 { + /*background-color: #F7F7F7;*/ +} + +/* About dialog styles */ + +.dp-about { + background-color: #fff; + margin: 0px; +} + +.dp-about table { + width: 100%; + height: 100%; + font-size: 11px; + font-family: Tahoma, Verdana, Arial, sans-serif !important; +} + +.dp-about td { + padding: 10px; + vertical-align: top; +} + +.dp-about .copy { + border-bottom: 1px solid #ACA899; + height: 95%; +} + +.dp-about .title { + color: red; + font-weight: bold; +} + +.dp-about .para { + margin-bottom: 4px; +} + +.dp-about .footer { + background-color: #ECEADB; + border-top: 1px solid #fff; + text-align: right; +} + +.dp-about .close { + font-size: 11px; + font-family: Tahoma, Verdana, Arial, sans-serif !important; + background-color: #ECEADB; + width: 60px; + height: 22px; +} + +/* Language specific styles */ + +.dp-c {} +.dp-c .comment { color: green; } +.dp-c .string { color: blue; } +.dp-c .preprocessor { color: gray; } +.dp-c .keyword { color: blue; } +.dp-c .vars { color: #d00; } +/* +.dp-vb {} +.dp-vb .comment { color: green; } +.dp-vb .string { color: blue; } +.dp-vb .preprocessor { color: gray; } +.dp-vb .keyword { color: blue; } + +.dp-sql {} +.dp-sql .comment { color: green; } +.dp-sql .string { color: red; } +.dp-sql .keyword { color: blue; } +.dp-sql .func { color: #ff1493; } +.dp-sql .op { color: #808080; } +*/ +.dp-xml {} +.dp-xml .cdata { color: #ff1493; } +.dp-xml .comments { color: green; } +.dp-xml .tag { color: blue; } +.dp-xml .tag-name { color: black; font-weight: bold; } +.dp-xml .attribute { color: red; } +.dp-xml .attribute-value { color: blue; } +/* +.dp-delphi {} +.dp-delphi .comment { color: #008200; font-style: italic; } +.dp-delphi .string { color: blue; } +.dp-delphi .number { color: blue; } +.dp-delphi .directive { color: #008284; } +.dp-delphi .keyword { font-weight: bold; color: navy; } +.dp-delphi .vars { color: #000; } + +.dp-py {} +.dp-py .comment { color: green; } +.dp-py .string { color: red; } +.dp-py .docstring { color: brown; } +.dp-py .keyword { color: blue; font-weight: bold;} +.dp-py .builtins { color: #ff1493; } +.dp-py .magicmethods { color: #808080; } +.dp-py .exceptions { color: brown; } +.dp-py .types { color: brown; font-style: italic; } +.dp-py .commonlibs { color: #8A2BE2; font-style: italic; }*/ + + +.dp-css .keyword { color: red; } +.dp-css .value { color: #ff1493; } +.dp-css .comment { color: green; } +.dp-css .string { color: blue; } +.dp-css .preprocessor { color: gray; } +.dp-css .keyword { color: blue; } +.dp-css .vars { color: #d00; } +.dp-css .colors { font-weight: bold; } diff --git a/public/css/yui/assets/dpSyntaxHighlighter.js b/public/css/yui/assets/dpSyntaxHighlighter.js new file mode 100644 index 000000000..94ad09818 --- /dev/null +++ b/public/css/yui/assets/dpSyntaxHighlighter.js @@ -0,0 +1,805 @@ +/** + * Code Syntax Highlighter. + * Version 1.3.0 + * Copyright (C) 2004 Alex Gorbatchev. + * http://www.dreamprojections.com/syntaxhighlighter/ + * + * This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General + * Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) + * any later version. + * + * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + * details. + * + * You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to + * the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +// +// create namespaces +// +var dp = { + sh : // dp.sh + { + Utils : {}, // dp.sh.Utils + Brushes : {}, // dp.sh.Brushes + Strings : {}, + Version : '1.3.0' + } +}; + +dp.sh.Strings = { + AboutDialog : 'About...

    dp.SyntaxHighlighter

    Version: {V}

    http://www.dreamprojections.com/SyntaxHighlighter

    ©2004-2005 Alex Gorbatchev. All right reserved.
    ', + + // tools + ExpandCode : '+ expand code', + ViewPlain : 'view plain', + Print : 'print', + CopyToClipboard : 'copy to clipboard', + About : '?', + + CopiedToClipboard : 'The code is in your clipboard now.' +}; + +dp.SyntaxHighlighter = dp.sh; + +// +// Dialog and toolbar functions +// + +dp.sh.Utils.Expand = function(sender) +{ + var table = sender; + var span = sender; + + // find the span in which the text label and pipe contained so we can hide it + while(span != null && span.tagName != 'SPAN') + span = span.parentNode; + + // find the table + while(table != null && table.tagName != 'TABLE') + table = table.parentNode; + + // remove the 'expand code' button + span.parentNode.removeChild(span); + + table.tBodies[0].className = 'show'; + table.parentNode.style.height = '100%'; // containing div isn't getting updated properly when the TBODY is shown +} + +// opens a new windows and puts the original unformatted source code inside. +dp.sh.Utils.ViewSource = function(sender) +{ + var code = sender.parentNode.originalCode; + var wnd = window.open('', '_blank', 'width=750, height=400, location=0, resizable=1, menubar=0, scrollbars=1'); + + code = code.replace(/' + code + '
    '); + wnd.document.close(); +} + +// copies the original source code in to the clipboard (IE only) +dp.sh.Utils.ToClipboard = function(sender) +{ + var code = sender.parentNode.originalCode; + + // This works only for IE. There's a way to make it work with Mozilla as well, + // but it requires security settings changed on the client, which isn't by + // default, so 99% of users won't have it working anyways. + if(window.clipboardData) + { + window.clipboardData.setData('text', code); + + alert(dp.sh.Strings.CopiedToClipboard); + } +} + +// creates an invisible iframe, puts the original source code inside and prints it +dp.sh.Utils.PrintSource = function(sender) +{ + var td = sender.parentNode; + var code = td.processedCode; + var iframe = document.createElement('IFRAME'); + var doc = null; + var wnd = + + // this hides the iframe + iframe.style.cssText = 'position:absolute; width:0px; height:0px; left:-5px; top:-5px;'; + + td.appendChild(iframe); + + doc = iframe.contentWindow.document; + code = code.replace(/' + code + '
    '); + doc.close(); + + iframe.contentWindow.focus(); + iframe.contentWindow.print(); + + td.removeChild(iframe); +} + +dp.sh.Utils.About = function() +{ + var wnd = window.open('', '_blank', 'dialog,width=320,height=150,scrollbars=0'); + var doc = wnd.document; + + var styles = document.getElementsByTagName('style'); + var links = document.getElementsByTagName('link'); + + doc.write(dp.sh.Strings.AboutDialog.replace('{V}', dp.sh.Version)); + + // copy over ALL the styles from the parent page + for(var i = 0; i < styles.length; i++) + doc.write(''); + + for(var i = 0; i < links.length; i++) + if(links[i].rel.toLowerCase() == 'stylesheet') + doc.write(''); + + doc.close(); + wnd.focus(); +} + +// +// Match object +// +dp.sh.Match = function(value, index, css) +{ + this.value = value; + this.index = index; + this.length = value.length; + this.css = css; +} + +// +// Highlighter object +// +dp.sh.Highlighter = function() +{ + this.addGutter = true; + this.addControls = true; + this.collapse = false; + this.tabsToSpaces = true; +} + +// static callback for the match sorting +dp.sh.Highlighter.SortCallback = function(m1, m2) +{ + // sort matches by index first + if(m1.index < m2.index) + return -1; + else if(m1.index > m2.index) + return 1; + else + { + // if index is the same, sort by length + if(m1.length < m2.length) + return -1; + else if(m1.length > m2.length) + return 1; + } + return 0; +} + +// gets a list of all matches for a given regular expression +dp.sh.Highlighter.prototype.GetMatches = function(regex, css) +{ + var index = 0; + var match = null; + + while((match = regex.exec(this.code)) != null) + { + this.matches[this.matches.length] = new dp.sh.Match(match[0], match.index, css); + } +} + +dp.sh.Highlighter.prototype.AddBit = function(str, css) +{ + var span = document.createElement('span'); + + str = str.replace(/&/g, '&'); + str = str.replace(/ /g, ' '); + str = str.replace(/'); + + // when adding a piece of code, check to see if it has line breaks in it + // and if it does, wrap individual line breaks with span tags + if(css != null) + { + var regex = new RegExp('
    ', 'gi'); + + if(regex.test(str)) + { + var lines = str.split(' 
    '); + + str = ''; + + for(var i = 0; i < lines.length; i++) + { + span = document.createElement('SPAN'); + span.className = css; + span.innerHTML = lines[i]; + + this.div.appendChild(span); + + // don't add a
    for the last line + if(i + 1 < lines.length) + this.div.appendChild(document.createElement('BR')); + } + } + else + { + span.className = css; + span.innerHTML = str; + this.div.appendChild(span); + } + } + else + { + span.innerHTML = str; + this.div.appendChild(span); + } +} + +// checks if one match is inside any other match +dp.sh.Highlighter.prototype.IsInside = function(match) +{ + if(match == null || match.length == 0) + return; + + for(var i = 0; i < this.matches.length; i++) + { + var c = this.matches[i]; + + if(c == null) + continue; + + if((match.index > c.index) && (match.index <= c.index + c.length)) + return true; + } + + return false; +} + +dp.sh.Highlighter.prototype.ProcessRegexList = function() +{ + for(var i = 0; i < this.regexList.length; i++) + this.GetMatches(this.regexList[i].regex, this.regexList[i].css); +} + +dp.sh.Highlighter.prototype.ProcessSmartTabs = function(code) +{ + var lines = code.split('\n'); + var result = ''; + var tabSize = 4; + var tab = '\t'; + + // This function inserts specified amount of spaces in the string + // where a tab is while removing that given tab. + function InsertSpaces(line, pos, count) + { + var left = line.substr(0, pos); + var right = line.substr(pos + 1, line.length); // pos + 1 will get rid of the tab + var spaces = ''; + + for(var i = 0; i < count; i++) + spaces += ' '; + + return left + spaces + right; + } + + // This function process one line for 'smart tabs' + function ProcessLine(line, tabSize) + { + if(line.indexOf(tab) == -1) + return line; + + var pos = 0; + + while((pos = line.indexOf(tab)) != -1) + { + // This is pretty much all there is to the 'smart tabs' logic. + // Based on the position within the line and size of a tab, + // calculate the amount of spaces we need to insert. + var spaces = tabSize - pos % tabSize; + + line = InsertSpaces(line, pos, spaces); + } + + return line; + } + + // Go through all the lines and do the 'smart tabs' magic. + for(var i = 0; i < lines.length; i++) + result += ProcessLine(lines[i], tabSize) + '\n'; + + return result; +} + +dp.sh.Highlighter.prototype.SwitchToTable = function() +{ + // thanks to Lachlan Donald from SitePoint.com for this
    tag fix. + var html = this.div.innerHTML.replace(/<(br)\/?>/gi, '\n'); + var lines = html.split('\n'); + var row = null; + var cell = null; + var tBody = null; + var html = ''; + var pipe = ' | '; + + // creates an anchor to a utility + function UtilHref(util, text) + { + return '' + text + ''; + } + + tBody = document.createElement('TBODY'); // can be created and all others go to tBodies collection. + + this.table.appendChild(tBody); + + if(this.addGutter == true) + { + row = tBody.insertRow(-1); + cell = row.insertCell(-1); + cell.className = 'tools-corner'; + } + + if(this.addControls == true) + { + var tHead = document.createElement('THEAD'); // controls will be placed in here + this.table.appendChild(tHead); + + row = tHead.insertRow(-1); + + // add corner if there's a gutter + if(this.addGutter == true) + { + cell = row.insertCell(-1); + cell.className = 'tools-corner'; + } + + cell = row.insertCell(-1); + + // preserve some variables for the controls + cell.originalCode = this.originalCode; + cell.processedCode = this.code; + cell.className = 'tools'; + + if(this.collapse == true) + { + tBody.className = 'hide'; + cell.innerHTML += '' + UtilHref('Expand', dp.sh.Strings.ExpandCode) + '' + pipe + ''; + } + + cell.innerHTML += UtilHref('ViewSource', dp.sh.Strings.ViewPlain) + pipe + UtilHref('PrintSource', dp.sh.Strings.Print); + + // IE has this clipboard object which is easy enough to use + if(window.clipboardData) + cell.innerHTML += pipe + UtilHref('ToClipboard', dp.sh.Strings.CopyToClipboard); + + cell.innerHTML += pipe + UtilHref('About', dp.sh.Strings.About); + } + + for(var i = 0, lineIndex = this.firstLine; i < lines.length - 1; i++, lineIndex++) + { + row = tBody.insertRow(-1); + + if(this.addGutter == true) + { + cell = row.insertCell(-1); + cell.className = 'gutter'; + cell.innerHTML = lineIndex; + } + + cell = row.insertCell(-1); + cell.className = 'line' + (i % 2 + 1); // uses .line1 and .line2 css styles for alternating lines + cell.innerHTML = lines[i]; + } + + this.div.innerHTML = ''; +} + +dp.sh.Highlighter.prototype.Highlight = function(code) +{ + function Trim(str) + { + return str.replace(/^\s*(.*?)[\s\n]*$/g, '$1'); + } + + function Chop(str) + { + return str.replace(/\n*$/, '').replace(/^\n*/, ''); + } + + function Unindent(str) + { + var lines = str.split('\n'); + var indents = new Array(); + var regex = new RegExp('^\\s*', 'g'); + var min = 1000; + + // go through every line and check for common number of indents + for(var i = 0; i < lines.length && min > 0; i++) + { + if(Trim(lines[i]).length == 0) + continue; + + var matches = regex.exec(lines[i]); + + if(matches != null && matches.length > 0) + min = Math.min(matches[0].length, min); + } + + // trim minimum common number of white space from the begining of every line + if(min > 0) + for(var i = 0; i < lines.length; i++) + lines[i] = lines[i].substr(min); + + return lines.join('\n'); + } + + // This function returns a portions of the string from pos1 to pos2 inclusive + function Copy(string, pos1, pos2) + { + return string.substr(pos1, pos2 - pos1); + } + + var pos = 0; + + this.originalCode = code; + this.code = Chop(Unindent(code)); + this.div = document.createElement('DIV'); + this.table = document.createElement('TABLE'); + this.matches = new Array(); + + if(this.CssClass != null) + this.table.className = this.CssClass; + + // replace tabs with spaces + if(this.tabsToSpaces == true) + this.code = this.ProcessSmartTabs(this.code); + + this.table.border = 0; + this.table.cellSpacing = 0; + this.table.cellPadding = 0; + + this.ProcessRegexList(); + + // if no matches found, add entire code as plain text + if(this.matches.length == 0) + { + this.AddBit(this.code, null); + this.SwitchToTable(); + return; + } + + // sort the matches + this.matches = this.matches.sort(dp.sh.Highlighter.SortCallback); + + // The following loop checks to see if any of the matches are inside + // of other matches. This process would get rid of highligting strings + // inside comments, keywords inside strings and so on. + for(var i = 0; i < this.matches.length; i++) + if(this.IsInside(this.matches[i])) + this.matches[i] = null; + + // Finally, go through the final list of matches and pull the all + // together adding everything in between that isn't a match. + for(var i = 0; i < this.matches.length; i++) + { + var match = this.matches[i]; + + if(match == null || match.length == 0) + continue; + + this.AddBit(Copy(this.code, pos, match.index), null); + this.AddBit(match.value, match.css); + + pos = match.index + match.length; + } + + this.AddBit(this.code.substr(pos), null); + + this.SwitchToTable(); +} + +dp.sh.Highlighter.prototype.GetKeywords = function(str) +{ + return '\\b' + str.replace(/ /g, '\\b|\\b') + '\\b'; +} + +// highlightes all elements identified by name and gets source code from specified property +dp.sh.HighlightAll = function(name, showGutter /* optional */, showControls /* optional */, collapseAll /* optional */, firstLine /* optional */) +{ + function FindValue() + { + var a = arguments; + + for(var i = 0; i < a.length; i++) + { + if(a[i] == null) + continue; + + if(typeof(a[i]) == 'string' && a[i] != '') + return a[i] + ''; + + if(typeof(a[i]) == 'object' && a[i].value != '') + return a[i].value + ''; + } + + return null; + } + + function IsOptionSet(value, list) + { + for(var i = 0; i < list.length; i++) + if(list[i] == value) + return true; + + return false; + } + + function GetOptionValue(name, list, defaultValue) + { + var regex = new RegExp('^' + name + '\\[(\\w+)\\]$', 'gi'); + var matches = null; + + for(var i = 0; i < list.length; i++) + if((matches = regex.exec(list[i])) != null) + return matches[1]; + + return defaultValue; + } + + var elements = document.getElementsByName(name); + var highlighter = null; + var registered = new Object(); + var propertyName = 'value'; + + // if no code blocks found, leave + if(elements == null) + return; + + // register all brushes + for(var brush in dp.sh.Brushes) + { + var aliases = dp.sh.Brushes[brush].Aliases; + + if(aliases == null) + continue; + + for(var i = 0; i < aliases.length; i++) + registered[aliases[i]] = brush; + } + + for(var i = 0; i < elements.length; i++) + { + var element = elements[i]; + var options = FindValue( + element.attributes['class'], element.className, + element.attributes['language'], element.language + ); + var language = ''; + + if(options == null) + continue; + + options = options.split(':'); + + language = options[0].toLowerCase(); + + if(registered[language] == null) + continue; + + // instantiate a brush + highlighter = new dp.sh.Brushes[registered[language]](); + + // hide the original element + element.style.display = 'none'; + + highlighter.addGutter = (showGutter == null) ? !IsOptionSet('nogutter', options) : showGutter; + highlighter.addControls = (showControls == null) ? !IsOptionSet('nocontrols', options) : showControls; + highlighter.collapse = (collapseAll == null) ? IsOptionSet('collapse', options) : collapseAll; + + // first line idea comes from Andrew Collington, thanks! + highlighter.firstLine = (firstLine == null) ? parseInt(GetOptionValue('firstline', options, 1)) : firstLine; + + highlighter.Highlight(element[propertyName]); + + // place the result table inside a div + var div = document.createElement('DIV'); + + div.className = 'dp-highlighter'; + div.appendChild(highlighter.table); + + element.parentNode.insertBefore(div, element); + } +} + + +dp.sh.Brushes.Xml = function() +{ + this.CssClass = 'dp-xml'; +} + +dp.sh.Brushes.Xml.prototype = new dp.sh.Highlighter(); +dp.sh.Brushes.Xml.Aliases = ['xml', 'xhtml', 'xslt', 'html', 'xhtml']; + +dp.sh.Brushes.Xml.prototype.ProcessRegexList = function() +{ + function push(array, value) + { + array[array.length] = value; + } + + /* If only there was a way to get index of a group within a match, the whole XML + could be matched with the expression looking something like that: + + () + | () + | (<)*(\w+)*\s*(\w+)\s*=\s*(".*?"|'.*?'|\w+)(/*>)* + | () + */ + var index = 0; + var match = null; + var regex = null; + + // Match CDATA in the following format + // <\!\[[\w\s]*?\[(.|\s)*?\]\]> + this.GetMatches(new RegExp('<\\!\\[[\\w\\s]*?\\[(.|\\s)*?\\]\\]>', 'gm'), 'cdata'); + + // Match comments + // + this.GetMatches(new RegExp('', 'gm'), 'comments'); + + // Match attributes and their values + // (\w+)\s*=\s*(".*?"|\'.*?\'|\w+)* + regex = new RegExp('([\\w-\.]+)\\s*=\\s*(".*?"|\'.*?\'|\\w+)*', 'gm'); + while((match = regex.exec(this.code)) != null) + { + push(this.matches, new dp.sh.Match(match[1], match.index, 'attribute')); + + // if xml is invalid and attribute has no property value, ignore it + if(match[2] != undefined) + { + push(this.matches, new dp.sh.Match(match[2], match.index + match[0].indexOf(match[2]), 'attribute-value')); + } + } + + // Match opening and closing tag brackets + // + this.GetMatches(new RegExp('', 'gm'), 'tag'); + + // Match tag names + // 2DMT7{-^frOVv~QkPP&Ewq->nsP|D1x-16aL6T+fS1y->At;?rCzDB|UT?Kn!l4k)^P(uaoX&VWPDLVS z3^V9-9LI%%!9*fqvszIE(P_0zD&=vzEoQSQ2rh>sl}cr^+0oI_$ml469m^7AOPfd(=_d{J75s9+iVaBkbZwW7K_qR%xHAj zZA^+0cp;Nc8x49<6f&7K%Vrbt1j8^{Hj8K=L<8$}Xgn5AC6gKeKwua}V6zDW0ky+n zPoiu?Rem84SSyDdxl|Me9*rCY$wnJQ@)2dcAg=HN`NnMuR|* zD2N=->(D$dS0plOHDk$SLWdv_09wr!r`?{fnB8U%1p_?KN&d%Fyp;aus(YhvenKL9 zEqOgl(J`p%+jYPBy@S-_&Etzpk|12+#`W#@(A zhTf0QpWXgq#MHZ=n9i*1S=FSyQZ&77VCc`5O}C1cxkIuU-T0K!2kk|dPt*-6I)~0* zlB4$nhWdWPi^}cyCsppkmsLccPjtVtW8L+i`<&LMi^Y*uYp2V*&V6w(iB9iyet-Ji zE^gtL*CQ=opLw|!>3FcY`%3@H8CC0#Ty`w{r0UeSCC481Kat;Ruc|?1ibbS9pwe&aT#R+%DO!J$i(uMa1rzv{|hT2OWx6~*_%5`JYm*@H#8hc!=^BT9m z+%&J7E#ACn?_jQQp?`4SYGp~Ms(0dE;PK_cq|z;$f2jHTPb(&=Mx1xf)WWVGo*X$> z*l@N>?i$%zR=R4|rAGz6xmzUTqzg_;#`$Eox|(stz^sBx^0xAdCkjR}PF8-fVWfY? z#2S~h^p|R&Tn)6wYt_;jHNEOO?9t)N6)U8{56g}{Rdu}G+fh+CC3FX^oA8yYynezC z+3NZgJ9al*D`EHc1PT{3@-?QnZqD&cuDSQBz+7{08!`Ee%vn@c&|TRww})9IX)1XB z>b&Gvnd;oK35u~c7pf?C7VjDBl2q-PvbcZT9;piP-Q0a-@m%tS+}ZfYi)XEp6Oyq) gN%dXecuDQ}@=FVLc0apP+!WuqblxeMyjZg0UuMopT>t<8 literal 0 HcmV?d00001 diff --git a/public/css/yui/assets/title_h_bg.gif b/public/css/yui/assets/title_h_bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..1378700ce6fe158f8824f9142d77a81896030d85 GIT binary patch literal 91 zcmZ?wbhEHbe8#j0_A+3_2hlNS=X7hoxoZ>9_og=WMyv qz4_jr-~4TlJf=PCT=wde9-F|HPd?Yb^*;Y~?)yJ}7ZwIq25SJJ&?G7V literal 0 HcmV?d00001 diff --git a/public/css/yui/assets/yui-candy.jpg b/public/css/yui/assets/yui-candy.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6c61b9522df7f1501a4d35af9b00f14e0f5c0cd0 GIT binary patch literal 11389 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

    o4*iCTX#cpkB*1T=RwTZA*)0#g41(`Q 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 literal 0 HcmV?d00001 diff --git a/public/css/yui/assets/yui.css b/public/css/yui/assets/yui.css new file mode 100644 index 000000000..a727254d4 --- /dev/null +++ b/public/css/yui/assets/yui.css @@ -0,0 +1,322 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.4.0 +*/ +html{color:#000;background:#FFF;}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%;font-weight:normal;}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;}legend{color:#000;} + +body {font:13px/1.231 arial,helvetica,clean,sans-serif;*font-size:small;*font:x-small;}table {font-size:inherit;font:100%;}pre,code,kbd,samp,tt{font-family:monospace;*font-size:108%;line-height:100%;} + +body{text-align:center;}#ft{clear:both;}#doc,#doc2,#doc3,#doc4,.yui-t1,.yui-t2,.yui-t3,.yui-t4,.yui-t5,.yui-t6,.yui-t7{margin:auto;text-align:left;width:57.69em;*width:56.301em;min-width:750px;}#doc2{width:73.074em;*width:71.313em;}#doc3{margin:auto 10px;width:auto;}#doc4{width:74.923em;*width:73.117em;}.yui-b{position:relative;}.yui-b{_position:static;}#yui-main .yui-b{position:static;}#yui-main{width:100%;}.yui-t1 #yui-main,.yui-t2 #yui-main,.yui-t3 #yui-main{float:right;margin-left:-25em;}.yui-t4 #yui-main,.yui-t5 #yui-main,.yui-t6 #yui-main{float:left;margin-right:-25em;}.yui-t1 .yui-b{float:left;width:12.3207em;*width:12.0106em;}.yui-t1 #yui-main .yui-b{margin-left:13.3207em;*margin-left:13.0106em;}.yui-t2 .yui-b{float:left;width:13.8456em;*width:13.512em;}.yui-t2 #yui-main .yui-b{margin-left:14.8456em;*margin-left:14.512em;}.yui-t3 .yui-b{float:left;width:23.0759em;*width:22.52em;}.yui-t3 #yui-main .yui-b{margin-left:24.0759em;*margin-left:23.52em;}.yui-t4 .yui-b{float:right;width:13.8456em;*width:13.512em;}.yui-t4 #yui-main .yui-b{margin-right:14.8456em;*margin-right:14.512em;}.yui-t5 .yui-b{float:right;width:18.4608em;*width:18.016em;}.yui-t5 #yui-main .yui-b{margin-right:19.4608em;*margin-right:19.016em;}.yui-t6 .yui-b{float:right;width:23.0759em;*width:22.52em;}.yui-t6 #yui-main .yui-b{margin-right:24.0759em;*margin-right:23.52em;}.yui-t7 #yui-main .yui-b{display:block;margin:0 0 1em 0;}#yui-main .yui-b{float:none;width:auto;}.yui-g .yui-gb .yui-u,.yui-gb .yui-g,.yui-gb .yui-gb,.yui-gb .yui-gc,.yui-gb .yui-gd,.yui-gb .yui-ge,.yui-gb .yui-gf,.yui-gb .yui-u,.yui-gc .yui-u,.yui-gc .yui-g,.yui-gd .yui-u{float:left;margin-left:2%;width:32%;}.yui-gb .yui-gb .yui-u,.yui-gb .yui-gc .yui-u{*margin-left:1.8%;_margin-left:4%;}.yui-g .yui-gb .yui-u{_margin-left:.8%;}.yui-gb .yui-u{float:right;}.yui-gb div.first{margin-left:0;float:left;}.yui-g .yui-gb div.first,.yui-gb .yui-gb div.first{*margin-right:0;*width:32%;_width:31.7%;}.yui-gb .yui-gc div.first,.yui-gb .yui-gd div.first{*margin-right:0;}.yui-gb .yui-gd .yui-u{*width:66%;_width:61.2%;}.yui-gb .yui-gd div.first{*width:31%;_width:29.5%;}.yui-g .yui-gc .yui-u,.yui-gb .yui-gc .yui-u{width:32%;_float:right;margin-right:0;_margin-left:0;}.yui-gb .yui-gc div.first{width:66%;*float:left;*margin-left:0;}.yui-gb .yui-ge .yui-u,.yui-gb .yui-gf .yui-u{margin:0;}.yui-g .yui-u,.yui-g .yui-g,.yui-g .yui-gb,.yui-g .yui-gc,.yui-g .yui-gd,.yui-g .yui-ge,.yui-g .yui-gf,.yui-gc .yui-u,.yui-gd .yui-g,.yui-g .yui-gc .yui-u,.yui-ge .yui-u,.yui-ge .yui-g,.yui-gf .yui-g,.yui-gf .yui-u{float:right;}.yui-g .yui-gc div.first,.yui-g .yui-ge div.first,.yui-g div.first,.yui-gc div.first,.yui-gc div.first div.first,.yui-gd div.first,.yui-ge div.first,.yui-gf div.first{float:left;}.yui-g .yui-g .yui-u,.yui-gb .yui-g .yui-u,.yui-gc .yui-g .yui-u,.yui-gd .yui-g .yui-u,.yui-ge .yui-g .yui-u,.yui-gf .yui-g .yui-u{width:49%;*width:48.1%;*margin-left:0;}.yui-g .yui-g div.first{*margin:0;}.yui-gb .yui-g div.first{*margin-right:4%;_margin-right:1.3%;}.yui-gb .yui-gb .yui-u{_margin-left:.7%;}.yui-gb .yui-g div.first,.yui-gb .yui-gb div.first{*margin-left:0;}.yui-gc .yui-g .yui-u,.yui-gd .yui-g .yui-u{*width:48.1%;*margin-left:0;}.yui-g .yui-u,.yui-g .yui-g,.yui-g .yui-gb,.yui-g .yui-gc,.yui-g .yui-gd,.yui-g .yui-ge,.yui-g .yui-gf{width:49.1%;}.yui-g .yui-gb div.first,.yui-gb div.first,.yui-gc div.first,.yui-gd div.first{margin-left:0;}.yui-g .yui-gc div.first,.yui-gc div.first,.yui-gd .yui-g,.yui-gd .yui-u{width:66%;}.yui-gd div.first,.yui-gb .yui-gd div.first{width:32%;}.yui-g .yui-gd div.first{_width:29.9%;}.yui-ge .yui-u,.yui-ge .yui-g,.yui-gf div.first{width:24%;}.yui-gb .yui-ge div.yui-u,.yui-gb .yui-gf div.yui-u{float:right;}.yui-gb .yui-ge div.first,.yui-gb .yui-gf div.first {float:left;}.yui-ge div.first,.yui-gf .yui-g,.yui-gf .yui-u{width:74.2%;}.yui-gb .yui-ge .yui-u,.yui-gb .yui-gf div.first{*width:24%;_width:20%;}.yui-gb .yui-ge div.first,.yui-gb .yui-gf .yui-u{*width:73.5%;_width:65.5%;}#bd:after,.yui-g:after,.yui-gb:after,.yui-gc:after,.yui-gd:after,.yui-ge:after,.yui-gf:after{content:".";display:block;height:0;clear:both;visibility:hidden;}#bd,.yui-g,.yui-gb,.yui-gc,.yui-gd,.yui-ge,.yui-gf{zoom:1;}.yui-gb .yui-u{float:left;} + +blockquote,ul,ol,dl { + margin:1em; +} +ol,ul,dl { + margin-left:2em; +} +ol li { + list-style: decimal outside; +} +ul li { + list-style: disc outside; +} + +/* +AutoComplete Control CSS: +Copyright (c) 2008, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.6.0 +*/ +.yui-skin-sam .yui-ac{position:relative;font-family:arial;font-size:100%;}.yui-skin-sam .yui-ac-input{position:absolute;width:100%;}.yui-skin-sam .yui-ac-container{position:absolute;top:1.6em;width:100%;}.yui-skin-sam .yui-ac-content{position:absolute;width:100%;border:1px solid #808080;background:#fff;overflow:hidden;z-index:9050;}.yui-skin-sam .yui-ac-shadow{position:absolute;margin:.3em;width:100%;background:#000;-moz-opacity:0.10;opacity:.10;filter:alpha(opacity=10);z-index:9049;}.yui-skin-sam .yui-ac iframe{opacity:0;filter:alpha(opacity=0);padding-right:.3em;padding-bottom:.3em;}.yui-skin-sam .yui-ac-content ul{margin:0;padding:0;width:100%;}.yui-skin-sam .yui-ac-content li{margin:0;padding:2px 5px;cursor:default;white-space:nowrap;list-style:none;zoom:1;}.yui-skin-sam .yui-ac-content li.yui-ac-prehighlight{background:#B3D4FF;}.yui-skin-sam .yui-ac-content li.yui-ac-highlight{background:#426FD9;color:#FFF;} + +/*begin YDN/YUI styles*/ +#bd {padding-top:1em;} +.yui-gb:after{clear:none;} +#doc3 {min-width:950px;} +h1, h2, h3, h4, h5, h6 {font-weight:bold; color:#E76300;} +h1, h2, h3, h4, h5, h6, p {line-height:1.2em; font-size:100%; margin:1em 0 0 0;} +h1.first-content, h2.first-content, h3.first-content {margin-top:0; padding-top:0; border:none;} /*if an h is the first thing on the page or in a section, it should be flush with the top border of its content area; otherwise, its content area should be padded to create space.*/ +p { margin-bottom:1em } +h1 { font-size: 136%; padding:0; padding-top:18px} +.wiki h1 { font-size: 120%; padding:0; margin-bottom:1em} +h2 { font-size: 110%; margin-top:1.5em; margin-bottom:.2em; padding:1em 0 0 0; border-top:1px dashed #C3D2DC;} +h2.first { border-top:none; margin-top:0; margin-bottom:.2em;} +#doc3 h2.first { float:none; /*float specified to resolve conflict on generic float declaration for .first in grids*/} +h4 {margin-top:1em; color: #000;} +ul, ol, dl, dd {margin-left:30px;} +dt { font-weight:bold; } +ul, ol {margin-bottom:.7em;} +ul {list-style:disc;} +ol {list-style:decimal;} +strong {font-weight:bold;} +em {font-style:italic;} + +a, a code {color:#0000de;} +a:visited, a:visited code {color:#639;} +a:active, a:active code {color: #f00;} + +h1 a { color:#E76300; } +h1 a:visited {color:#E76300} + +#logo_pane { display: none; } + +#ygma { margin:.5em auto 1em auto; } + +#bd ol {} +#bd ol li p { margin-left:0} +#bd ol li ol {list-style:lower-alpha} +#bd ol li ol li {margin-bottom:1em} +#bd ol li ol li ol{list-style:lower-roman} +#bd ol li ol li ol li {margin-bottom:1em} + +#bd p.errormessage {background:url(http://us.i1.yimg.com/us.yimg.com/i/us/search/gr/alertbubble.gif) 0 0 no-repeat; padding-left:30px; margin:2em 2em 2em 1em; font-weight:bold} + +/*formerly #bd targeting*/ +ul {margin-top:2px; } +ul.topspace { margin-top:1em } +ul li { margin:0 17px 0 7px; } +ul li ul { margin-top:0em } +ul.plain {margin-top: 0; list-style: none;} +ul.plain ul {margin-top: 0; list-style: none;} +ul.jump {list-style: none; margin-top: 1em;} +ul.jump li {margin-top: .5em;} + +/*#bd table { margin:10px 17px; width:720px; }*/ +/*#bd th { background:#B6CDE1; padding:2px; color:#fff; vertical-align:top} +#bd td { padding:2px; vertical-align:top} +#bd td.even { background:red; }*/ + +h2.classname { border-top:none; margin-top:0; margin-bottom:.2em; font-size: 130%; color:#000000} +h3.breadcrumb { border-top:none; margin-top:0; margin-bottom:.2em; font-size: 80%; color:#000000} +h3.methods { border-top:none; margin-top:0; margin-bottom:.2em; font-size: 100%; color:#000000} + +.screenshot {border:thin solid #999999; margin:8px;} + +#toc {background-color:#ecf5fa; padding:0; border:1px solid #89d } +#toc ul {margin:0; padding:0;} +#toc ul li {list-style:none; padding:0; margin:0; font-size:85%; } +#toc ul li.selected { font-weight:bold; color:#fff; background:#f82; padding:0; } +#toc ul li.selected a { color:#fff; } +#toc ul li a { display:block; padding:2px 2px 2px 10px; text-decoration:none; } +#toc ul li a:hover { color:#fff; background:#e60; } +#toc ul li em { display:none; } +#toc ul li.sect { font-weight:bold; color:#fff; background:#89d; padding:2px 0; text-indent:2px; margin-top:2px;} +#toc ul li.first {margin-top:0;} + +#ft { margin-top:4em } +#ft p { padding-bottom:2em; margin:0; text-align:center; font-size:80%; line-height:1.4em} +#ft p.first { padding:1em 0 0 0; margin:0; } + +#pagetitle {background: url(http://us.i1.yimg.com/us.yimg.com/i/ydn/bg_hd.gif) 0 0 repeat-x #B6CDE1; border: 1px solid #93B2CC; } +#pagetitle h1 {text-indent:15px; padding:4px 0 2px 0; background: url(http://us.i1.yimg.com/us.yimg.com/i/ydn/title_h_bg.gif) 0 0 no-repeat; margin:0; color:#000; font-size:120%; font-weight:bold; position:relative; left:-1px; top:-1px; margin-right:-2px;} +#pagetitle h1 em {color:#FF9933; font-size:60%; font-weight:bold; font-style:normal; position:relative; top:-6px} + +#ygunav {background:#eee; border-bottom:2px solid #ccc; padding:0 10px;font-size:78%;text-align:right;margin-bottom:6px;height:2.5em;line-height:2.5em;} +html>body #ygunav {overflow:hidden;} +#ygunav strong {font-family:verdana;} +#ygunav p {display:inline;margin:0;padding:0;} +#ygunav p em {float:left;text-align:left;font-style:normal; padding-top:.7em} +* html #ygunav p em {margin-top:1px;} +#ygunav p em i {visibility:hidden;} +#ygunav a {color:#000;} +#ygunav form {display:inline;margin:0 0 0 1em;} +#ygsp {width:8em;font-size:110%;padding:0;vertical-align:middle;} +#ygunav .ygbt {background:#dcdcdc;font:110% verdana;position:relative;top:1px;} +* html #ygunav .ygbt {top:4px;} +* html>body #ygunav .ygbt {line-height:0;top:-4px;} +#ygunav label {color:#666;font-family:tahoma;top:1px;} + +#bd ol.getstarted { margin:0; padding:0; } +#bd ol.getstarted li { font-weight:bold; color:#668AA8; margin-bottom:1em; padding-left:20px; list-style-type:none;} +#bd ol.getstarted li p { color:#000; font-weight:normal; margin:0 0 0 20px; padding:0 } + +/* removing +#bd p {margin-bottom:8px;} +*/ + +#promo {zoom:1;border: 1px solid #B6CDE1; padding:1em; /*position:relative;*/ background-color:#FFF5DF;} +/*#promo ul {margin-bottom:0;}*/ +#promo h1 {margin-top:0; padding-top:0} +#promo h2 {line-height:1.2em; color:#668AA8; margin-top:0; padding-top:0; border:none; font-size:100%} +#promo p {line-height:1.2em; font-weight:400;} +#promo h1 em {float:right; top:0; right:0; font-style:normal; font-size:80%} +#promo h4 { color:#E76300; } +#promo.component div {width:48%; float:left;} +#promo:after {content:'.';visibility:hidden;clear:left;height:0;display:block;} +#promo p#api {margin-top:.2em;} +#promo #download img {float:left; padding:0 0.5em 0.5em 0;} +#promo #blog {clear:left;} + + +code {font-family:"Courier New"; font-size: 100%; font-weight:bolder;} + +div.apisummary {height:auto; margin:10px 0; width:auto; zoom:1;} +div.apisummary table {font-size:inherit;font:100%; border-collapse:separate; border:1px solid #666666; border-left:none;} +#doc3 div.apisummary table td, #doc3 div.apisummary table th {padding:.35em; vertical-align:top;} +div.apisummary table th { background:#B6CDE1; color:#fff; vertical-align:top; font-weight:bold;} +div.apisummary table td { border-top:1px solid #666666;} +div.apisummary table td, div.apisummary table th { border-left:1px solid #666666;} +div.apisummary table tr { background-color:#ddd;} +div.apisummary table tr.odd { background-color:#fff; } +div.apisummary table tfoot tr { background-color:#fff; } + +dl#menuwidgets dt {font-weight:bold;} +dl#menuwidgets {margin:0 0 0 1.5em;} +img.example {clear:right;margin-bottom:10px;margin-left:10px;border:0;float:right;border:1px solid #999;} + +/*YUI theater box on main page top right corner*/ +#yui-theater {width:316px; overflow:hidden;} +#yui-theater h3 {margin:0; padding:0; color:#E76300; font-size:100%; font-weight:bold; font-stretch:expanded;} +#yui-theater h2 {margin:0 0 10px 0; padding:0; border:none; color:#000; font-size:122%; font-weight:bold;} +#yui-theater p {margin:7px 0 0 0;} +#yui-theater div {float:right; font-size:85%;} + +/*rss reader styles*/ +p.loading-content {background-image:url(http://us.i1.yimg.com/us.yimg.com/i/ydn/yuiweb/img/busy_arrow.gif); background-position:top left; background-repeat:no-repeat; height:20px;padding:4px 0 0 25px; margin:0;} +#doc3 ul.yuirssreader {margin:0; padding:0;} +#doc3 ul.yuirssreader li {list-style-type:none;padding:5px 0 0 12px; margin:0;} +#doc3 ul.yuirssreader li p {margin:0; padding:0;} +ul.yuirssreader cite {color:#666666; margin:0;} +span.yuirssreader-date {font-size:77%; color:#E76300;} +img.rssbadge {display:inline;border:none !important;} + +#index-secondary {width:316px;float:right;margin-left:10px;} +#index-main {margin-right:331px;} +#index-main #promo li {list-style-type:none;font-size:92%;margin-top:2px;} +#index-main #promo ul {margin:0;} + +/*styles for right gutter on component pages*/ +#cheatsheet h3 {margin-top:0;} +#cheatsheet img, #componentvideo img {margin:.5em 0 .2em 0; border:1px solid #999;} +#cheatsheet p {margin:0; font-size:77%;} +#cheatsheet h4, .example-container h4, #examples h4 {margin:0.2em 0 .1em 0; color:#668AA8; font-size:92%;} +#examples ul, #morereading ul, #module ul {font-size:85%; list-style:circle; margin:0 0 1em 10px;} +#examples p, #componentvideo p {font-size:85%; margin:0 0 .2em 0;} +#examples li.selected {font-weight:bold;} + +/*styles for example pages*/ +.example .promo {background-color:#89d;border-color:#666666; padding:1em;} +.example .promo h1, .example .promo h2, .example .promo h3 {color:#FFCC66;} +.example .promo h1 {font-size:159%; padding-top:0; margin-top:0;} +.exampleIntro, .exampleIntro p, .exampleIntro a, .exampleIntro a code {color:#fff;} +.example .promo p {margin-top:.7em;} + +.example cite.byline {display:block; padding:0.5em; background-color:#eee; border:1px solid #000;margin-bottom:5px} + +firstContent {margin-top:0; padding-top:0;} +#logger {margin-top:1em;} +.example-container {background-color:#F1F6F7;} + +.example-container .bd {padding:1em; position:relative; z-index:1; zoom:1;} +.example-container .bd .bd {padding:0; position:static;} /* Reset to defaults to ensure styles are only applied to the top-level .bd of .example-container */ +.example-container>.bd:after {content:'.';visibility:hidden;clear:left;height:0;display:block;} +.example-container .exampleHd {background: url(example-hd-bg.gif) 0 0 repeat-x #4E4D4C; } +.example-container h3 {margin:.2em 0 .4em 0;} +.example .example-container h1, .example .example-container h2, .example .example-container h3, .example .example-container h4, .example .example-container h5, .example .example-container h6 {color:#E76300; font-weight:bold;} +.example-container a {color:#000;} +.example-container a:visited, .example-container a:visited code {color:#000;} +.example-container a:active, .example-container a:active code {color: #000;} + +#loggerGloss {margin-top:.5em; font-size:85%;} +#loggerDiv {font-size:77%;text-align:left;margin-top:.5em; visibility:hidden; height:280px; } /*gets turned on by script when loaded */ +#loggerDiv.yui-log {padding:.4em;width:96%;background-color:#FBE7D9;border:1px solid #666;font-family:monospace;z-index:9000;} +#loggerDiv.yui-log p {margin:1px;padding:.1em;} +#loggerDiv.yui-log .yui-log-hd {margin:0; padding:0; background-color:#CECCCC;} +#loggerDiv.yui-log .yui-log-hd h4 {display:none;} +#loggerDiv.yui-log .yui-log-bd {width:100%;height:20em;background-color:#FFF;border:1px solid #ECECEC;overflow-y:auto;overflow-x:hidden;} +#loggerDiv.yui-log .yui-log-bd pre {border-top:1px solid #ECECEC;} +#loggerDiv.yui-log .yui-log-bd code p {margin:1px 0;} +#loggerDiv.yui-log .yui-log-ft .yui-log-categoryfilters {margin-top:.5em;clear:right;} +#loggerDiv.yui-log .yui-log-ft .yui-log-sourcefilters {margin-top:.5em;border:none; clear:both;} +#loggerDiv.yui-log .yui-log-btns {margin-top:.2em;padding:.2em;background: url(bg_hd.gif) 0 0 repeat-x #CECCCC; text-align:right; float:none; position:static;} +#loggerDiv.yui-log .yui-log-filtergrp {margin-right:.3em; float:left; display:block} +#loggerDiv.yui-log .yui-log-ft {margin-top:.3em;margin-bottom:.3em; font-family:verdana; zoom:1;} +/*bug in Safari when this is applied to .yui-log-ft:*/ +#loggerDiv.yui-log:after {content:'.';visibility:hidden;clear:both;height:0;display:block;} +.example-container.newWindow {text-align:center;} +p.newWindowButton {text-align:right; margin-top:0; padding:.5em;} +.bd p.newWindowButton {text-align:center;} /*when new window is required and button appears in middle of example body*/ +p.loggerButton {text-align:center;} +#loggerLink a, #newWindowLink a {font-size:115%; font-weight:bold; color:#000099;} +#newWindowLink a {font-size:107%;} +#loggerModule {padding-bottom:.2em;} + +/*right column navigation on example rosters*/ +#exampleToc {background-color:#ecf5fa; padding:0; border:1px solid #89d; margin-top:.5em;} +#exampleToc ul {margin:0; padding:0; font-size:85%; } +#exampleToc ul li {list-style:none; padding:0; margin:0; } +#exampleToc ul li.selected { font-weight:bold; color:#fff; background:#000099; padding:0; } +#exampleToc ul li.selected a { color:#fff; } +#exampleToc ul li a { display:block; padding:2px 2px 2px 10px; text-decoration:none; } +#exampleToc ul li a:hover { color:#fff; background:#e60; } +#exampleToc ul li.selected a code { color:#fff; } + +/*theater page styles*/ +.theater h1 {border-bottom:1px dashed #CCC; margin-bottom:1em;padding-bottom:.2em;} +.theater img {border:1px solid #666;} +.theater img.last {border:1px solid #666;} +.theater p.details {font-size:77%; color:#666; margin:.2em 0 0 0; padding:0;} +.theater p.description, #doc3 .theater ul li {font-size:85%; margin:0; padding:0; color:#333;} + +#readmePanel .hd { font-weight:bold; font-size:129%; color:#fff; background:#89d; } +#readmePanel .bd {text-align:left; overflow:auto;} +#readmePanel .ft {text-align:right; background-color:#E7E7E7; font-size:85%;} +/* Browser specific (not valid) styles to make preformatted text wrap */ +#readmePanel .bd pre { + white-space: pre-wrap; /* css-3 */ + white-space: -moz-pre-wrap; /* Mozilla, since 1999 */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + word-wrap: break-word; /* Internet Explorer 5.5+ */ + font-size: 100%; + color:#000033;} + +/*ed eliot's server-side delicious badge css*/ + #delicious-badge {margin-top:.6em; font: 85% Arial, sans-serif; border: 1px solid #b1b1b1; } +#delicious-badge .bookmark { background: url(http://images.del.icio.us/static/img/delicious.small.gif) no-repeat left center; padding-left: 15px; font-weight: bold; } +#delicious-badge p, #delicious-badge div { padding: 7px; margin: 0; text-align: center; } +#delicious-badge a { color: #00f; text-decoration: none; } +#delicious-badge div { background: #eee; } +#delicious-badge div span { font-weight: bold; color: #000; } +#delicious-badge ul, #delicious-badge li { display: inline; list-style: none; padding: 0; margin: 0; } +#delicious-badge li { margin-left: 5px; } +#delicious-badge li span { position: absolute; left: -999px; width: 999px; } +#delicious-badge .saved-by { color: #999; } +#delicious-badge .saved-by span { background: #00f; padding: 3px; color: #fff; } +#delicious-badge .be-first { font-size: 85%; color: #999; } +#delicious-badge .tag-size-1 { font-size: 100%; } +#delicious-badge .tag-size-2 { font-size: 107%; } +#delicious-badge .tag-size-3 { font-size: 114%; } +#delicious-badge .tag-size-4 { font-size: 122%; } +#delicious-badge .tag-size-5 { font-size: 129%; } + +/*faq page:*/ +.yui-ge .yui-g {width:98%;} +.yui-ge .yui-g .yui-u {width:48.1%;} +#questions {margin:1em 0 2em 0; padding:0.5em; border:1px solid #838383; background-color:#E6E6E6;} +#questions ul {margin:0; list-style:none;} +#yui-main #questions li {padding-bottom:.2em; font-size:85%; margin:0;} +#questions li a {display:block; padding:.6em; text-decoration:none;} +#questions li a:hover {background-color:#F6F6F6;} + +/*for notes on file includes*/ +#configuratorBadge {display:block; float:left; margin:0 .5em .5em 0;} +.include-notice {clear:left; border:1px solid #6F7EA1; background:#eee; font:77% verdana; padding:.7em;} +.include-notice p.firstP {margin-top:0;} +.include-notice p.lastP {margin-bottom:0;} +.include-notice strong {color:#990000;} +.configurator-notice p {font-size:85%;} + +/*for site search suggest via autocomplete*/ +#ygunav {overflow:visible !important;} +#sitesearch {float:right; width:40em; position:relative; text-align:right;} +#searchinput {width:15em; font-size:11px; font-weight:bold; position:relative; top:2px;} +#searchcontainer {text-align:left; width:40em; overflow:hidden; line-height:normal; position:absolute;} +#searchcontainer .yui-ac-bd {font-size:10px; color:#666; background-color:#EAEFF2; text-align:left;} +#searchcontainer li {overflow:hidden; text-overflow:ellipsis; -o-text-overflow:ellipsis; cursor:pointer; padding-top:2px; } +#searchcontainer em {font-style:normal; font-weight:bold; color:#000033;} +.yui-ac-ft {padding:3px; font-size:10px; text-align:right;} +#searchcontainer .yui-ac-highlight {background-color:#87A4D6;} diff --git a/public/css/yui/assets/yui.gif b/public/css/yui/assets/yui.gif new file mode 100644 index 0000000000000000000000000000000000000000..5033ff576c02636bc8bbe69addcf7751861bab20 GIT binary patch literal 5901 zcmV+o7xL&wNk%w1VaNbo0M!5hgR{ii?D6#Z`u+a?=IigO%-PlF>$B3^%H-?q_4wrR z^_|4hyw~CS{Qc|h@Y3n+eXqiy$kg%k^`ynt-0AL-xybGD_3-!k=kM|0?D50gzTmL&EVYV=uT=~K3GI5j z3kC*D#uiE6v^u#s@XAC6U|!->?yjAF&+q&He=Zev2UKua6bp2CfQ^oTf`fAl8HZ*E z0Cta?n=X+YC3ABOWf(4^b`^OG6EOt`3?V(Uw6(UkxU(S)F*~3(mQ|RUstXG-u(G+! z%so821rrN9k^l$6LpCK93k4cH&EdB^8V3b2($k-!E@M_0qIIe}tgZ(d6cjqOI{p6t z00ROvkWa&c3MDE9BQZzQu>&D8P;e&BmcV}oBr=G$K+qf#*fOXpz$1eJeiu`wq>!P9 zIgZora1aH+oe&TeP|d6NDg=f9XCZh9o#oGf(W6L{=39ESUj`mA5GJrR%po!z6hdg# zDs(6=l}Qck(~%(rM~~JlB^ar1tJfYy!^&Ms0qH)149un5A!z2D3Wk0ZfY5MftDaf8 zdhKU)X@WeKP=G<%-$ZpZ&IcO< z1|R50sJCE&2K)CGG;=<%1Asy@inh66D!HGBj9Bc%bhn^4WjWA+@CK8~}N#>xV&LE*kH`M{x*`b|1aB(Qy zhXsn5V0$N`=bi)>_>ch#`y3QQ8P*X)4>BkH2H=j46&RwACbsvU1S81TLsquU1i@5f zL{-3dr~xP3fRbT30+H>}Am@-0NZE41e+;vVzIRT(S8362{foY0y%41}15*ezf z7SyR3Rw1+~4PVs&P{9w^Wk=6;u=uywnyt}#9*H9?%4nnP9ZA6fr`Tl0FvV<#&uPng zIAD*@u1CYPKFG=cAPOZ#IAK~?z>{GQI*Qw@vkBUYt`F>ufagBGz6eU6#4b_{rVPNk zDYN%t3FN*bvWEc*5Y~5}75R1R&4&NU%I1|nKD_V5?Mg@ug=Ac~fHU=WiZ8VKLR_Q` z`snb|uYJV`LBZJJVGObfw><01(Vh#jkdIPKpMCiCyq~umZyF$vO;6|49CH|XOv z+`HMbE1fvXUpKD1+^=u%{PR8pe>q3Qv(5S2uLLbNvynG{HS`syens_AD^DEJ(JCE! zf(N1REiQa38z1({_oMUeOMS!3+2#zkAJ6%(e&)Jgd!nZ|)j7?27bI8j9EdIgc<)`e zvqJ7d2*Alf41$J(QujWcv+VOZbl;7^mI7(dFX_ua49Vn-{${h}KjmAV^Di_#I z7w)T>lC0t#XKBGuVlaT#bO1Iz$hRSKGnn4I8Zi}lKt?*zouX3@;UM|SbjEU>G_+(b z6@!5~acO8D0D(k504h!9N}iph=O=&pr8<3pqUDjmL@!`YbYXyY25jRH-nhFAeDtIL z{;Cxc8HG+N9u%4im8MW4uz{ZXi%mS}X-~N{f|;TxR}#Re^s)&;u^B+92ryEQc)9@y zfS{z)I%zQ%slrBTF#u4FY3~NwN)!~-rq9GbpyJSA18#-D1&aDRAM7)w$86aG>N)@nKvAH1Eny_l>OOX65j6&& z>k2l|0P+w3v2XoAHD#u&dHS`Ufb|Lh+`0h}uxSK!Ex=-pIwH-0ldEp@>f=H~TMz&+ zW`^5r9Xp#)TIv)WI~XhmC?EmUt^fwAU9A^eo6*;96g(6_Ee9mPrnb8EO^oIL;ew8| z)qZyMpN}JeXm=oi<6<>Pbd;eio4eMbgrKf4kN^fCP*)CQSG&_f>InD>MC$!@n?s>M zT{SS>W|e@p4OovRNktZZs#FLp4Od;GYTwK@Dt*e;FG4Hn+#80sxY1242xLk*1>3;2 zL4+-Y!7I5@pl!Y0|Jk>0aUB&0f-7ubj?g6h+`s?b@bvl2Nbh2Jr~W= zX3(^H_LB1xZCy!wTsYy%p+w36nj0*}2Vai@qFulUcys{DnrN9Lx)lNcOp@nQ?sOvu`V>0X}!>ebsE>&c2@7+1nG8jDL%qpsz!_b zn;!odQ9hWjoyI(;AVHfsJ(%{A{W(sec-hAw0FjS)?d(v0yGu!4-*RUi%{}Vi+Qm^g z^GZ}AV1o+U`WUu@b$q>pZ(sn3n!$)iuyKy}RymuQ4Yg0bsXhZh0t8aG4oegyo@-ky z5?3)!TdX6K+cxJ$47H=)gJkB2ywW89jmd#L91NiL$71%ka$*zz^OEVA;7vAwoPBUF zx~0*wbs;ooDW20kKGm%^AD5H`C%6OI-Ljj}TAD|`X4D+~x*xEt1a2K*x(UuWh0TXp zoYCG7{~*M`5$t&-f^@^v-8=_6{HSXd^hxeF%b)E^Y2;kt{~hP_%Sro}ujKk=#un7G+a zOG1H5D8W}-0)l=7h<>`qcm=?HgY;M4@qY#&ev5V|tRWZw>gNwEQyRVZUa#_h$L3ZV zfG62gfFf8Ii^l_|A#0yUYp~!Spn$#fSNBjTX;K>b5D*nH3tjOH+Sejq_gpI#$b>EtFrK$!$YT!> zp($wsAaRHbT@evx(F;46hOo7QY&eJGFo&3!iF3#mv|)#)=1;HS8&dKXi)agth!qF$ z5-u``ICU(p@Cp#o5~uMWnplgqs1*;=E75QYyu?5MhWI7AGm5h~jKnyMWKj;16i)u+ z3g3r_iD-+^*oaz@4|$o)1=o1bCj_e2y z-B^w1APs^5Tq{)qJAf>1z#Q$!j^gnYsi=y3v3$j1BiVQu+n5ZBSc`<(izL~SF8Pu$Ns`>b zJ~`2gG^CO<8IwA>lP<{}F7hJu2x7uw46n$OM!AzSi4G=tl5~&?tMD^1u#z)5l~h@k zR(X{^nGPOdlf>|ptss?H8J1!>l}af?j+X)d!g4GIIhJfGmSs5&z!EG7MGUI&l&mlT zU)h#=nUrry4Ku-&PFaw68I^mvmr;qA#-Im%F$pP?30|3(h1r&eiI|D$34Ag`*x{6R zd6#(EnV$KXpc$H?X$(LK0J(t$6VQ}(nT?z&ny&epp-GyGc?U7FB#7WNtO=XCxtr+# zmzEhzR)msxkO!z4XhFmsW6-r+Mymgp%!YO000NW zAP?;Mp(u)?7Fs-g@&+IP0Sj6O8@iq}TBA04qd1DAcJ!QB5SZ=k^sk%C>#2Tj%&;kzNPy_G*NksxMdaK16 zt;X5{1mFNP;BMIJ0635Xr7Er7YOFbc0@#YJ0#IKq(5>J4t066dh z&swkcdawAJulicAFQ5W7AQ_fn8A&Cu@md2Uz^(h5unL>7IdA{~8?X>-8RhB#@@fJL zd$AbHuQ<@I?n(fm`T^xSuqr?TEl{#8U;-$cvMOr=FVM0s`?4?#vnxvi{`#-gS{c_0 zX(3xD0syjgQW-U%0w!y+D_gWF8?!HKv?<#HDu4qwi?ibjX`;HbG|($i83RL`wOYHi zT)VY28?n|Z0g_6nqKX3l)yM$V2$LkRwrtzBZu_=w`;R2x1{MITuqvw`C97oH03Of- zGk~^edz5kuw`*&Z_|UU<8>@=@sf8-48PEZM8@Z7yxPlwGJ@Be`TLlX6w=>YWp8L6= z8@i%9x}?hhe`^4fTBu`7s6)^I4-mQ?5W5|q0km7YwtKs{o4dLDxgC%Ishhe(AOaoW zxw1RFyc@f^o4m;zyP+EZpsKn;5CAh!ywqF0)_c9!o4v7%01bc*0)PP2ivZ#~zT{iJ z=6k;ATfWun0od>ZDG zoWKgazzD3q9dH8w!Jq)!E4~a|!4_=6<{P^Y(7n|$!RC9xARNLO%u7}90Of1IR+z#n zd=v*wF`JjP#4#pBz=WMIMwfWlyg$g=#!4{!rz@WmM*$iAG+%ACr;T*(D20C)VwH_*xoP|enS z&DfmH+PuvQu*#qu01qGlWN-qT+{M$p%G{jJ>YUEr48~Q%heG8$ZX9gozgJ< z(?IRgGR@G|Y}06b1p$x()x6L?9n?+@)I&|wMNQG)oB&>&0sg$yJ^j>N9n>gI(+ZFQ zIQ;|v32@9jebQZ>);~SdVBO82Tm~7S)hD3VbRE-dE!8#6&jFACgKW}FEdncj0fK!2 z0x;Nyeb|Vd*oR%%g00ds-OXct0ZOd^Ck@ytE!YCU*owW`oK4t_z0xAU*49kSnM~Q1 zJ=mJv*{W^WnLXH`9ol&9){^bd4L#R^joBBF01PbxyxrTr{oBAD+#ZkshMfS99odx4 z)VEF8xxL%L{oK&q+r!P=jcwebodRW`0JdG+&K=#}?b{1Y+^N0NQSAXWeF10f0ldB3 znVkT?UDrUp-mWbI3V_@TZP~=_+3xMz@cq;4-P*am-!xqY>Yd*g0Nniz)Bmm6EX~{h zQjOl#jMDgx+O5sft9{{!tUXk<8pozgDwD?PUIKh1C?m=sao#g#GA2PU^{;>a>pOjt=YpHNNIi ze(OZO=5k^ImHw;3KJ1@L={#Q8o&E!BF65yuKPe(#n(fYmYiUs)2?$a*tmA`iA-?(v)^Nrv1aIpHMj|IHn_<7&B5f%K8&-|=A z{BcjKk{_x+|M9n923UXfdRzH=yZw{ezN>4f*gyE*pZm$*zLr1!mY@8Dk>`av-BKHOdMPnm@jbs zZusxs5ZVDoDxi>roQ#AKAY~*WV1qnb&MNLCX0+5oD z{k@e~K}LRt;#cE2fRu!cjFg;|f|87QA@wIAC1WH9&hRivT{osU@5t*L$}F8!NXb&I z&evfw@>Pb_=?A~xvpsavDM@#kKNmW-br9Mwh4r!>DO4u!pB=YQ3tn z7&8~Xh+5wNFurmCe)v4Cq`rG%_3-Yai1gA13_TF@iT)L;5o&XdkVH*g*8&wzq(3vdwX_^>e`S0p~bMpVL5LENr`$wn~n~CqTHaCTC z>BnoWap>6DJh>IR?t76<^xC5`iN`c_+yKJvX8>uN zCjcb~90wGMPFPh=#QVuwqLy_CKto<5PTdxq*<24^K}ROoEzdSBHS8!>v?PdnFUS1v zKlDN+r|<#8V$fN;E_{)5hlD}#pz7z}*kV@UDR@6IOVs))wlpHPIdD^R-P#H|Bf;KK zt|dX12yS$C6kdY1%J^BmxHZg6t@e1EPuc3qHy0=R^>&x?w=3V+TdP*qQ+KR{>yu%4 ziIm-IU--#;qKbP~?xir8CAW?0XfJi~^sIbte=?QWn<$tcEs2dw!FzP{tQ624H4*?3 z?mhyr+l=_KLIAS&_DGLSc75<>3aOw)Q)maVNp5-R%#V_VBuEa5?WVp$!HsMkp?F=I zmG|6-Vdjy8m*CRsYSpP=ZiPsDE8C4mf2##8r>4*toycnL_Md$w&kzQqJBLrcJvd=L zln|6P{zNif%hi7NqimSS6V@=aOtGwMcC0?cZ+VF)PKN=_6L9iTFpPv3A}xoFM}bxO zlUtAbc(|cFFP2bVUsSdTz^W!%1}#7Ul9HiAj}@^QT`JoIpg$VrMgSfT5CBRc>{KFm za*)izG&T|i+2CCK;YWONuPWlnxHptfxtxhLftoYEA5%kSl=qJh57YnC}A_B6=QC9vR_DeOmY7Fzm?%H}dks1H`82VH+vuy02X;y=FE zia_7O8xerup?|=QV(V1dApmJ-i6S_f`xEeSXwa2_vbhi~h#rgB3!Q^a6>Aa#5bb#W z3{!ZdS@u3Eu|GeD-}fdhS2F)w9ng0)LzmdgQSfEdumVJBw|`3SExtAP1BQ*cunZS@ zDKkWo>K^;-rR8T?HciX=o?*ST1mN0YI&{0rkpLJ=eR(lm6FR3l@mn{e*5EmKzsr`W zt-t9eq;4H!FY7y)?JGX#TT=Jvxz8nJBg|$HUX;E`o@DgUjhXStiIn>DLEcLaM{#49 z_pYQAeB~n4Kj&6W)>dyMJ6~Y8_M~c>;a#yd^An|{T#i6!pcW=kATT*M%^Z8Z6q040|}-L~GE z!Br(}u^-yUq(R?HYi9;jO^4D#2>4NMb{T{QGooeO&LUD?rpuA)LS*CT(vuL+LSN)4 z2Mvrkvm1L;H9alWsErX&BO`NgZ+hL=?oy#}=SPI}N>@Fzc~UzEsrH;duW~N?K4fam z3vPlo+0njTCr+1CKp`z+i9eHIRBRRki`?tDIZ52zGtd>HF6V6x*#DfYCIDrbDCrez zHB8txH^znlj5K0>GQFSlgVuR8p%MoLC$6*5adG6GupF)8ji9L>>GG~dUu622q(l|= z`$bDElGvwjqMQ6XMr5q4-Kr-=a162Fzt3H^D!sPSmF&o+)INSh+wF?-zqkWzGGw#k3<^mcV<^(7z7zBp{+8|%Eh;9W<+}718bMupmWGV0w5&=?L+px zWc#$3dJQ5ywn_kG`1{v~YS}D;xlC+2r6t06t-H@DIe2=o*hn6Ep*qi5g}`v%3%0nY zvKUvs4Cf3(rMiP)A)sYSY(b*fS-zaE&_f6^yMq;Guy`X_x+D4AdMeINc!pG5bn z{r(GeL`Jp|uFeaw$+|4raj1wXfGwe062N26y_e&~OI7Xck3b~^U=WPJ=GorT|K?#> zeAz-dOFj?3UyzB@zLKFJ$eE1OAFSQravGCuiG7UFcIUtRULZV{$0>CS8DmX7TiDlg zE>(B)A}qJ-ax_<#C?sd7s>s%6L&>}eF!43kgF z$LJ@PKRBPG6Mr1<-5;jZH84gWAOepT%oAO_l4duT+iOpco$wRO&N!)h6#`dh5E``4 zRc~_+!~X#tL=H})9>TJB`;GNmwQ)KKo3CQ}a|eIQ%2a{xVnNp7Pt-!fOq}nlnk**a z;$*nK{2E*b1h(O{I$qTo&gqJW{Y>fgbZBlhk1(at_j_YU)lH_z`P#MFEaHGOO5efA z&vKH`Kyr z@r2v+Rb%*@z6EgezVs#=gAb?tqp>KjOIKNa_gE!+lWxJ4=+SqB)L9nBNEr!5-529+tYUfi3)c-7q>f3~wkQf}t2I>mLwCxy%r~Scvl>XQ}O6rl0d- zmcB;M<*%)Kvt=)4$i_xc zd#LofeU2wNGonyc?Sqi$sB^KsWB>Yo^r~mraQ6ERJDWB)j^{&5^>C_3ccp`*O>t)Y zt4fc34Io#Q26GjMA=(h3n@ZYg2V2^9(sd#5_V19vU_FKR5wr&`{=+fgMqPS3HKA8! zyQ$4IY)tgzbeE-)9N+&#w9w6qi!n>hxp;Qb%09uQC zZ60}Vh|z~?q~rij7&_Crh%bZ<#w$$x@O=n1>fWz{Wz}tMFXYQMWV&9t>3VLWQK-E}O9HdK$vawi*@I%xP6tpVH(EK%#KG-2g&Em=#`rR$H!|V*F9=WA(j^kmL;9@gk%rT#`ND zpVeuJf%e-{LW>MESv-O{>C;wBACwQi1+_j1-&qqd^5eI_-4I7AxMe}KOEOIFw2Tr1 zC4_*s(N##$vHK$^Dp;DG^3_R>6t~q;s z$Z;L|Dy>oMqBDfb%|aidJsUrgY594aWzavakvbf*&zcLGCjdXHaDUuqwe^BV%MKqA z0IVnhFyK6+e2UVoV3z0C*MxP^x_9@jRYy%+1~&&p3?rhI*Y;K8@;3^hqD=Z_>9NyCKl z(20YM@3-4yL?6ZU^I46Q_vOF@VPB-DH4@_eE+6VMu{oNAb2d?=Tt;keW1Aiuf5=5E zQE>Tux~b%DaSyLwYMHJYwj-kdXpbPgQgZ$lZs>$MISc~R!MU^{jzQ@ll&N7*iA1VqH z&zHYZ8k99WpRlK6&M*(6kga_En4#sOrMWWYe7xxEHnNLmD&tZ{>=vYmngvS!vr;^~ zyy4FjI5_LerN+dU`KEkLZwu95Tj96M1g9!k*;FS#J~e^rX7vp=o>Y z^k|*lu~WHs2|3u{8{qh}d=8u>?niz1vpoGQi=lFf(Vks2(Vfy75v{77Pm$fyJPeOg z-8*W__)XNyz zI0UXY>REfT>e>0SV3ABH*u|+5(~C@7w7xLfvc-4NlH=)#xZFE! zR{Vuh);N@SJkG_zGT6mg-<#MYef}^hUc6-sIO?{j!yn%=f!Ng$J-;v>{!VTb3|6?n zY}s?TA~2L|%x%riYWTMvd>3tees#;j{dmo_=H9tHOXXnl(OO=1$Erez%h(4!D+@Yt zoq_hP^zR2#&e_~&SkPYJz6l*&#K$9+gFdy2ek1@_hm;dbxzWKy7g7ePmC+>Hp3oW4 zd?Iw~v8D2i4GiXwoXikQbqGev*TtM)G1ZSpUb#I*P7@YW#l}HgGg4&tty87Kh1aZ0 zc1HG|m#cX`>31gxsA&W{d(vflBnva|_*%5R+iI4(@ESHr(tYPJ&K$YSQc}9i%yUt% zT6JB(^_7OqUL4(-%Mu=8JcuC?F3clIdzVF4$W)% z@^!grm94dTD(DPy3~y9wnTcU&YH;9&6BYmEZ+R96D&&Sd;!@Qd9mXPvnd-Rg=Zs>^ zaC7Grj%*RLK)ZRje_r$2IC3(Vf05(1rb_FaMUs8rdGWV{eat=IYb9sMR>Pw1NPm%Y z=W657R2;ffT@Rz~-Hor{_3_$$@L7XxM3$*0(#*TWrVuO5tA;XosVxhtiWo7JS@zI< zUK(1tc}sjgKDD-ef|i%&nc1hKz24j;&HBPda=LA7AQzozX1& zGG5!{utdq}E@>1~*rBuqGH=t_Lw7jEuFdC@Hty|P0?)$2m4&OVJ z0+~uQWCxVTSIB^PRjS97yAB5;>l-m}yOIwM8Q1$7Zz=Tq<#mOe6P{_zEln66$TrOJ zkezw{YG=yV-T&g0Q(Mdt^Qr|Ut}qT0ZD?#vmP2tUed4>ZP%2+n?wveu#8OB5(Jjw8 zUi*==nktq;kI(0hhl*6iY~NP-?Ld$zYq?u*;Nl&NLlt*uMXSvDs702mbG%JHuo)D4 zx<2GpW0s!&dFCXBTm7!rG5(U#9a7etj`gs>%$c$26@9jSS<{}fIebz>oh~wst+Q4{ z`zK50a{;&v{V;=g?k1=0(GEngIM7Fq_Dw^a`q&VEDbEOPwKqu9Ez8;AtG>T0)bwmo z+S}b7F^Qtq`jGSOUzZ)H<0yS~IXLJRKL!pOyRp83*~FTzow32Gm7iz;eG?eeWIt5E>Kh4HlaF92M9DS0!dh|2T;+ z5AgW|d+e>MHkyb<5dH7CEIO$a(?%~*_3gOr@u7^;{KHe(pN^-q$Hm26duE+4D&zO!k#6z@3Bz{~Bla|H`-oN<8ed>^Oj z(^_PLxh;KYyR74W_qB$Z_~qLbv9>y1jLjv@kEAH%j-OdZT|4XnFO=UHM~ zM(LY;Lo#*Az52=t`Z7{-0?~6R5hMC4e=S4~H_@qi=>tmdg(Q{v+&c}t89A13+9}0d zwNyUlbabIMo#eI$s2>ENz9a*uA$Wu5puk`G#-z$_CG>ahd#P&x1WM!{*yblDL#Mg# zy@3M)V47Ht36acgH5hCp{mVf7(%{yA%zi4X(>eZ<`>)M?s^b59FBCx7x7K|m7*1|a z6ID*#MKD+(Uy7KbP22wt_;*HDLHjT67Gwkx4|?k3e|?6TzFOz5nlY5SFEXbTpzP%~ zw^x7acJqdbfd5Y)K`6edVJ;i)pY^Aw!Qs7w->uaG!@gJj?Km?Qa?}e&y@OXd7U7@= z0fov6A&BCwsc>oSuE=s0(ap*F?Ue8)ed?|#Q{o4PZ&nPro7_i|1fVvz7Kw7lB61La zuM6@K_;=MWcK*%8UwZP3iEPky;^*84N?a|aTlPyJ`-6vbY$1{3kNpq$trh(-UB0Wx sw8D0OtCgf@@w3y2ziffY0@Bygsj~Y{Obg2+k?-cyZ>s-ikA%k literal 0 HcmV?d00001 diff --git a/public/css/yui/build/animation/animation-debug.js b/public/css/yui/build/animation/animation-debug.js new file mode 100644 index 000000000..7bcb96d6b --- /dev/null +++ b/public/css/yui/build/animation/animation-debug.js @@ -0,0 +1,1394 @@ +/* +Copyright (c) 2009, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.7.0 +*/ +(function() { + +var Y = YAHOO.util; + +/* +Copyright (c) 2006, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +*/ + +/** + * The animation module provides allows effects to be added to HTMLElements. + * @module animation + * @requires yahoo, event, dom + */ + +/** + * + * Base animation class that provides the interface for building animated effects. + *

    Usage: var myAnim = new YAHOO.util.Anim(el, { width: { from: 10, to: 100 } }, 1, YAHOO.util.Easing.easeOut);

    + * @class Anim + * @namespace YAHOO.util + * @requires YAHOO.util.AnimMgr + * @requires YAHOO.util.Easing + * @requires YAHOO.util.Dom + * @requires YAHOO.util.Event + * @requires YAHOO.util.CustomEvent + * @constructor + * @param {String | HTMLElement} el Reference to the element that will be animated + * @param {Object} attributes The attribute(s) to be animated. + * Each attribute is an object with at minimum a "to" or "by" member defined. + * Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). + * All attribute names use camelCase. + * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based + * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method) + */ + +var Anim = function(el, attributes, duration, method) { + if (!el) { + YAHOO.log('element required to create Anim instance', 'error', 'Anim'); + } + this.init(el, attributes, duration, method); +}; + +Anim.NAME = 'Anim'; + +Anim.prototype = { + /** + * Provides a readable name for the Anim instance. + * @method toString + * @return {String} + */ + toString: function() { + var el = this.getEl() || {}; + var id = el.id || el.tagName; + return (this.constructor.NAME + ': ' + id); + }, + + patterns: { // cached for performance + noNegatives: /width|height|opacity|padding/i, // keep at zero or above + offsetAttribute: /^((width|height)|(top|left))$/, // use offsetValue as default + defaultUnit: /width|height|top$|bottom$|left$|right$/i, // use 'px' by default + offsetUnit: /\d+(em|%|en|ex|pt|in|cm|mm|pc)$/i // IE may return these, so convert these to offset + }, + + /** + * Returns the value computed by the animation's "method". + * @method doMethod + * @param {String} attr The name of the attribute. + * @param {Number} start The value this attribute should start from for this animation. + * @param {Number} end The value this attribute should end at for this animation. + * @return {Number} The Value to be applied to the attribute. + */ + doMethod: function(attr, start, end) { + return this.method(this.currentFrame, start, end - start, this.totalFrames); + }, + + /** + * Applies a value to an attribute. + * @method setAttribute + * @param {String} attr The name of the attribute. + * @param {Number} val The value to be applied to the attribute. + * @param {String} unit The unit ('px', '%', etc.) of the value. + */ + setAttribute: function(attr, val, unit) { + var el = this.getEl(); + if ( this.patterns.noNegatives.test(attr) ) { + val = (val > 0) ? val : 0; + } + + if ('style' in el) { + Y.Dom.setStyle(el, attr, val + unit); + } else if (attr in el) { + el[attr] = val; + } + }, + + /** + * Returns current value of the attribute. + * @method getAttribute + * @param {String} attr The name of the attribute. + * @return {Number} val The current value of the attribute. + */ + getAttribute: function(attr) { + var el = this.getEl(); + var val = Y.Dom.getStyle(el, attr); + + if (val !== 'auto' && !this.patterns.offsetUnit.test(val)) { + return parseFloat(val); + } + + var a = this.patterns.offsetAttribute.exec(attr) || []; + var pos = !!( a[3] ); // top or left + var box = !!( a[2] ); // width or height + + if ('style' in el) { + // use offsets for width/height and abs pos top/left + if ( box || (Y.Dom.getStyle(el, 'position') == 'absolute' && pos) ) { + val = el['offset' + a[0].charAt(0).toUpperCase() + a[0].substr(1)]; + } else { // default to zero for other 'auto' + val = 0; + } + } else if (attr in el) { + val = el[attr]; + } + + return val; + }, + + /** + * Returns the unit to use when none is supplied. + * @method getDefaultUnit + * @param {attr} attr The name of the attribute. + * @return {String} The default unit to be used. + */ + getDefaultUnit: function(attr) { + if ( this.patterns.defaultUnit.test(attr) ) { + return 'px'; + } + + return ''; + }, + + /** + * Sets the actual values to be used during the animation. Should only be needed for subclass use. + * @method setRuntimeAttribute + * @param {Object} attr The attribute object + * @private + */ + setRuntimeAttribute: function(attr) { + var start; + var end; + var attributes = this.attributes; + + this.runtimeAttributes[attr] = {}; + + var isset = function(prop) { + return (typeof prop !== 'undefined'); + }; + + if ( !isset(attributes[attr]['to']) && !isset(attributes[attr]['by']) ) { + return false; // note return; nothing to animate to + } + + start = ( isset(attributes[attr]['from']) ) ? attributes[attr]['from'] : this.getAttribute(attr); + + // To beats by, per SMIL 2.1 spec + if ( isset(attributes[attr]['to']) ) { + end = attributes[attr]['to']; + } else if ( isset(attributes[attr]['by']) ) { + if (start.constructor == Array) { + end = []; + for (var i = 0, len = start.length; i < len; ++i) { + end[i] = start[i] + attributes[attr]['by'][i] * 1; // times 1 to cast "by" + } + } else { + end = start + attributes[attr]['by'] * 1; + } + } + + this.runtimeAttributes[attr].start = start; + this.runtimeAttributes[attr].end = end; + + // set units if needed + this.runtimeAttributes[attr].unit = ( isset(attributes[attr].unit) ) ? + attributes[attr]['unit'] : this.getDefaultUnit(attr); + return true; + }, + + /** + * Constructor for Anim instance. + * @method init + * @param {String | HTMLElement} el Reference to the element that will be animated + * @param {Object} attributes The attribute(s) to be animated. + * Each attribute is an object with at minimum a "to" or "by" member defined. + * Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). + * All attribute names use camelCase. + * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based + * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method) + */ + init: function(el, attributes, duration, method) { + /** + * Whether or not the animation is running. + * @property isAnimated + * @private + * @type Boolean + */ + var isAnimated = false; + + /** + * A Date object that is created when the animation begins. + * @property startTime + * @private + * @type Date + */ + var startTime = null; + + /** + * The number of frames this animation was able to execute. + * @property actualFrames + * @private + * @type Int + */ + var actualFrames = 0; + + /** + * The element to be animated. + * @property el + * @private + * @type HTMLElement + */ + el = Y.Dom.get(el); + + /** + * The collection of attributes to be animated. + * Each attribute must have at least a "to" or "by" defined in order to animate. + * If "to" is supplied, the animation will end with the attribute at that value. + * If "by" is supplied, the animation will end at that value plus its starting value. + * If both are supplied, "to" is used, and "by" is ignored. + * Optional additional member include "from" (the value the attribute should start animating from, defaults to current value), and "unit" (the units to apply to the values). + * @property attributes + * @type Object + */ + this.attributes = attributes || {}; + + /** + * The length of the animation. Defaults to "1" (second). + * @property duration + * @type Number + */ + this.duration = !YAHOO.lang.isUndefined(duration) ? duration : 1; + + /** + * The method that will provide values to the attribute(s) during the animation. + * Defaults to "YAHOO.util.Easing.easeNone". + * @property method + * @type Function + */ + this.method = method || Y.Easing.easeNone; + + /** + * Whether or not the duration should be treated as seconds. + * Defaults to true. + * @property useSeconds + * @type Boolean + */ + this.useSeconds = true; // default to seconds + + /** + * The location of the current animation on the timeline. + * In time-based animations, this is used by AnimMgr to ensure the animation finishes on time. + * @property currentFrame + * @type Int + */ + this.currentFrame = 0; + + /** + * The total number of frames to be executed. + * In time-based animations, this is used by AnimMgr to ensure the animation finishes on time. + * @property totalFrames + * @type Int + */ + this.totalFrames = Y.AnimMgr.fps; + + /** + * Changes the animated element + * @method setEl + */ + this.setEl = function(element) { + el = Y.Dom.get(element); + }; + + /** + * Returns a reference to the animated element. + * @method getEl + * @return {HTMLElement} + */ + this.getEl = function() { return el; }; + + /** + * Checks whether the element is currently animated. + * @method isAnimated + * @return {Boolean} current value of isAnimated. + */ + this.isAnimated = function() { + return isAnimated; + }; + + /** + * Returns the animation start time. + * @method getStartTime + * @return {Date} current value of startTime. + */ + this.getStartTime = function() { + return startTime; + }; + + this.runtimeAttributes = {}; + + var logger = {}; + logger.log = function() {YAHOO.log.apply(window, arguments)}; + + logger.log('creating new instance of ' + this); + + /** + * Starts the animation by registering it with the animation manager. + * @method animate + */ + this.animate = function() { + if ( this.isAnimated() ) { + return false; + } + + this.currentFrame = 0; + + this.totalFrames = ( this.useSeconds ) ? Math.ceil(Y.AnimMgr.fps * this.duration) : this.duration; + + if (this.duration === 0 && this.useSeconds) { // jump to last frame if zero second duration + this.totalFrames = 1; + } + Y.AnimMgr.registerElement(this); + return true; + }; + + /** + * Stops the animation. Normally called by AnimMgr when animation completes. + * @method stop + * @param {Boolean} finish (optional) If true, animation will jump to final frame. + */ + this.stop = function(finish) { + if (!this.isAnimated()) { // nothing to stop + return false; + } + + if (finish) { + this.currentFrame = this.totalFrames; + this._onTween.fire(); + } + Y.AnimMgr.stop(this); + }; + + var onStart = function() { + this.onStart.fire(); + + this.runtimeAttributes = {}; + for (var attr in this.attributes) { + this.setRuntimeAttribute(attr); + } + + isAnimated = true; + actualFrames = 0; + startTime = new Date(); + }; + + /** + * Feeds the starting and ending values for each animated attribute to doMethod once per frame, then applies the resulting value to the attribute(s). + * @private + */ + + var onTween = function() { + var data = { + duration: new Date() - this.getStartTime(), + currentFrame: this.currentFrame + }; + + data.toString = function() { + return ( + 'duration: ' + data.duration + + ', currentFrame: ' + data.currentFrame + ); + }; + + this.onTween.fire(data); + + var runtimeAttributes = this.runtimeAttributes; + + for (var attr in runtimeAttributes) { + this.setAttribute(attr, this.doMethod(attr, runtimeAttributes[attr].start, runtimeAttributes[attr].end), runtimeAttributes[attr].unit); + } + + actualFrames += 1; + }; + + var onComplete = function() { + var actual_duration = (new Date() - startTime) / 1000 ; + + var data = { + duration: actual_duration, + frames: actualFrames, + fps: actualFrames / actual_duration + }; + + data.toString = function() { + return ( + 'duration: ' + data.duration + + ', frames: ' + data.frames + + ', fps: ' + data.fps + ); + }; + + isAnimated = false; + actualFrames = 0; + this.onComplete.fire(data); + }; + + /** + * Custom event that fires after onStart, useful in subclassing + * @private + */ + this._onStart = new Y.CustomEvent('_start', this, true); + + /** + * Custom event that fires when animation begins + * Listen via subscribe method (e.g. myAnim.onStart.subscribe(someFunction) + * @event onStart + */ + this.onStart = new Y.CustomEvent('start', this); + + /** + * Custom event that fires between each frame + * Listen via subscribe method (e.g. myAnim.onTween.subscribe(someFunction) + * @event onTween + */ + this.onTween = new Y.CustomEvent('tween', this); + + /** + * Custom event that fires after onTween + * @private + */ + this._onTween = new Y.CustomEvent('_tween', this, true); + + /** + * Custom event that fires when animation ends + * Listen via subscribe method (e.g. myAnim.onComplete.subscribe(someFunction) + * @event onComplete + */ + this.onComplete = new Y.CustomEvent('complete', this); + /** + * Custom event that fires after onComplete + * @private + */ + this._onComplete = new Y.CustomEvent('_complete', this, true); + + this._onStart.subscribe(onStart); + this._onTween.subscribe(onTween); + this._onComplete.subscribe(onComplete); + } +}; + + Y.Anim = Anim; +})(); +/** + * Handles animation queueing and threading. + * Used by Anim and subclasses. + * @class AnimMgr + * @namespace YAHOO.util + */ +YAHOO.util.AnimMgr = new function() { + /** + * Reference to the animation Interval. + * @property thread + * @private + * @type Int + */ + var thread = null; + + /** + * The current queue of registered animation objects. + * @property queue + * @private + * @type Array + */ + var queue = []; + + /** + * The number of active animations. + * @property tweenCount + * @private + * @type Int + */ + var tweenCount = 0; + + /** + * Base frame rate (frames per second). + * Arbitrarily high for better x-browser calibration (slower browsers drop more frames). + * @property fps + * @type Int + * + */ + this.fps = 1000; + + /** + * Interval delay in milliseconds, defaults to fastest possible. + * @property delay + * @type Int + * + */ + this.delay = 1; + + /** + * Adds an animation instance to the animation queue. + * All animation instances must be registered in order to animate. + * @method registerElement + * @param {object} tween The Anim instance to be be registered + */ + this.registerElement = function(tween) { + queue[queue.length] = tween; + tweenCount += 1; + tween._onStart.fire(); + this.start(); + }; + + /** + * removes an animation instance from the animation queue. + * All animation instances must be registered in order to animate. + * @method unRegister + * @param {object} tween The Anim instance to be be registered + * @param {Int} index The index of the Anim instance + * @private + */ + this.unRegister = function(tween, index) { + index = index || getIndex(tween); + if (!tween.isAnimated() || index == -1) { + return false; + } + + tween._onComplete.fire(); + queue.splice(index, 1); + + tweenCount -= 1; + if (tweenCount <= 0) { + this.stop(); + } + + return true; + }; + + /** + * Starts the animation thread. + * Only one thread can run at a time. + * @method start + */ + this.start = function() { + if (thread === null) { + thread = setInterval(this.run, this.delay); + } + }; + + /** + * Stops the animation thread or a specific animation instance. + * @method stop + * @param {object} tween A specific Anim instance to stop (optional) + * If no instance given, Manager stops thread and all animations. + */ + this.stop = function(tween) { + if (!tween) { + clearInterval(thread); + + for (var i = 0, len = queue.length; i < len; ++i) { + this.unRegister(queue[0], 0); + } + + queue = []; + thread = null; + tweenCount = 0; + } + else { + this.unRegister(tween); + } + }; + + /** + * Called per Interval to handle each animation frame. + * @method run + */ + this.run = function() { + for (var i = 0, len = queue.length; i < len; ++i) { + var tween = queue[i]; + if ( !tween || !tween.isAnimated() ) { continue; } + + if (tween.currentFrame < tween.totalFrames || tween.totalFrames === null) + { + tween.currentFrame += 1; + + if (tween.useSeconds) { + correctFrame(tween); + } + tween._onTween.fire(); + } + else { YAHOO.util.AnimMgr.stop(tween, i); } + } + }; + + var getIndex = function(anim) { + for (var i = 0, len = queue.length; i < len; ++i) { + if (queue[i] == anim) { + return i; // note return; + } + } + return -1; + }; + + /** + * On the fly frame correction to keep animation on time. + * @method correctFrame + * @private + * @param {Object} tween The Anim instance being corrected. + */ + var correctFrame = function(tween) { + var frames = tween.totalFrames; + var frame = tween.currentFrame; + var expected = (tween.currentFrame * tween.duration * 1000 / tween.totalFrames); + var elapsed = (new Date() - tween.getStartTime()); + var tweak = 0; + + if (elapsed < tween.duration * 1000) { // check if falling behind + tweak = Math.round((elapsed / expected - 1) * tween.currentFrame); + } else { // went over duration, so jump to end + tweak = frames - (frame + 1); + } + if (tweak > 0 && isFinite(tweak)) { // adjust if needed + if (tween.currentFrame + tweak >= frames) {// dont go past last frame + tweak = frames - (frame + 1); + } + + tween.currentFrame += tweak; + } + }; +}; +/** + * Used to calculate Bezier splines for any number of control points. + * @class Bezier + * @namespace YAHOO.util + * + */ +YAHOO.util.Bezier = new function() { + /** + * Get the current position of the animated element based on t. + * Each point is an array of "x" and "y" values (0 = x, 1 = y) + * At least 2 points are required (start and end). + * First point is start. Last point is end. + * Additional control points are optional. + * @method getPosition + * @param {Array} points An array containing Bezier points + * @param {Number} t A number between 0 and 1 which is the basis for determining current position + * @return {Array} An array containing int x and y member data + */ + this.getPosition = function(points, t) { + var n = points.length; + var tmp = []; + + for (var i = 0; i < n; ++i){ + tmp[i] = [points[i][0], points[i][1]]; // save input + } + + for (var j = 1; j < n; ++j) { + for (i = 0; i < n - j; ++i) { + tmp[i][0] = (1 - t) * tmp[i][0] + t * tmp[parseInt(i + 1, 10)][0]; + tmp[i][1] = (1 - t) * tmp[i][1] + t * tmp[parseInt(i + 1, 10)][1]; + } + } + + return [ tmp[0][0], tmp[0][1] ]; + + }; +}; +(function() { +/** + * Anim subclass for color transitions. + *

    Usage: var myAnim = new Y.ColorAnim(el, { backgroundColor: { from: '#FF0000', to: '#FFFFFF' } }, 1, Y.Easing.easeOut); Color values can be specified with either 112233, #112233, + * [255,255,255], or rgb(255,255,255)

    + * @class ColorAnim + * @namespace YAHOO.util + * @requires YAHOO.util.Anim + * @requires YAHOO.util.AnimMgr + * @requires YAHOO.util.Easing + * @requires YAHOO.util.Bezier + * @requires YAHOO.util.Dom + * @requires YAHOO.util.Event + * @constructor + * @extends YAHOO.util.Anim + * @param {HTMLElement | String} el Reference to the element that will be animated + * @param {Object} attributes The attribute(s) to be animated. + * Each attribute is an object with at minimum a "to" or "by" member defined. + * Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). + * All attribute names use camelCase. + * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based + * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method) + */ + var ColorAnim = function(el, attributes, duration, method) { + ColorAnim.superclass.constructor.call(this, el, attributes, duration, method); + }; + + ColorAnim.NAME = 'ColorAnim'; + + ColorAnim.DEFAULT_BGCOLOR = '#fff'; + // shorthand + var Y = YAHOO.util; + YAHOO.extend(ColorAnim, Y.Anim); + + var superclass = ColorAnim.superclass; + var proto = ColorAnim.prototype; + + proto.patterns.color = /color$/i; + proto.patterns.rgb = /^rgb\(([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\)$/i; + proto.patterns.hex = /^#?([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})$/i; + proto.patterns.hex3 = /^#?([0-9A-F]{1})([0-9A-F]{1})([0-9A-F]{1})$/i; + proto.patterns.transparent = /^transparent|rgba\(0, 0, 0, 0\)$/; // need rgba for safari + + /** + * Attempts to parse the given string and return a 3-tuple. + * @method parseColor + * @param {String} s The string to parse. + * @return {Array} The 3-tuple of rgb values. + */ + proto.parseColor = function(s) { + if (s.length == 3) { return s; } + + var c = this.patterns.hex.exec(s); + if (c && c.length == 4) { + return [ parseInt(c[1], 16), parseInt(c[2], 16), parseInt(c[3], 16) ]; + } + + c = this.patterns.rgb.exec(s); + if (c && c.length == 4) { + return [ parseInt(c[1], 10), parseInt(c[2], 10), parseInt(c[3], 10) ]; + } + + c = this.patterns.hex3.exec(s); + if (c && c.length == 4) { + return [ parseInt(c[1] + c[1], 16), parseInt(c[2] + c[2], 16), parseInt(c[3] + c[3], 16) ]; + } + + return null; + }; + + proto.getAttribute = function(attr) { + var el = this.getEl(); + if (this.patterns.color.test(attr) ) { + var val = YAHOO.util.Dom.getStyle(el, attr); + + var that = this; + if (this.patterns.transparent.test(val)) { // bgcolor default + var parent = YAHOO.util.Dom.getAncestorBy(el, function(node) { + return !that.patterns.transparent.test(val); + }); + + if (parent) { + val = Y.Dom.getStyle(parent, attr); + } else { + val = ColorAnim.DEFAULT_BGCOLOR; + } + } + } else { + val = superclass.getAttribute.call(this, attr); + } + + return val; + }; + + proto.doMethod = function(attr, start, end) { + var val; + + if ( this.patterns.color.test(attr) ) { + val = []; + for (var i = 0, len = start.length; i < len; ++i) { + val[i] = superclass.doMethod.call(this, attr, start[i], end[i]); + } + + val = 'rgb('+Math.floor(val[0])+','+Math.floor(val[1])+','+Math.floor(val[2])+')'; + } + else { + val = superclass.doMethod.call(this, attr, start, end); + } + + return val; + }; + + proto.setRuntimeAttribute = function(attr) { + superclass.setRuntimeAttribute.call(this, attr); + + if ( this.patterns.color.test(attr) ) { + var attributes = this.attributes; + var start = this.parseColor(this.runtimeAttributes[attr].start); + var end = this.parseColor(this.runtimeAttributes[attr].end); + // fix colors if going "by" + if ( typeof attributes[attr]['to'] === 'undefined' && typeof attributes[attr]['by'] !== 'undefined' ) { + end = this.parseColor(attributes[attr].by); + + for (var i = 0, len = start.length; i < len; ++i) { + end[i] = start[i] + end[i]; + } + } + + this.runtimeAttributes[attr].start = start; + this.runtimeAttributes[attr].end = end; + } + }; + + Y.ColorAnim = ColorAnim; +})(); +/*! +TERMS OF USE - EASING EQUATIONS +Open source under the BSD License. +Copyright 2001 Robert Penner All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + * Neither the name of the author nor the names of contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/** + * Singleton that determines how an animation proceeds from start to end. + * @class Easing + * @namespace YAHOO.util +*/ + +YAHOO.util.Easing = { + + /** + * Uniform speed between points. + * @method easeNone + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeNone: function (t, b, c, d) { + return c*t/d + b; + }, + + /** + * Begins slowly and accelerates towards end. + * @method easeIn + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeIn: function (t, b, c, d) { + return c*(t/=d)*t + b; + }, + + /** + * Begins quickly and decelerates towards end. + * @method easeOut + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeOut: function (t, b, c, d) { + return -c *(t/=d)*(t-2) + b; + }, + + /** + * Begins slowly and decelerates towards end. + * @method easeBoth + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeBoth: function (t, b, c, d) { + if ((t/=d/2) < 1) { + return c/2*t*t + b; + } + + return -c/2 * ((--t)*(t-2) - 1) + b; + }, + + /** + * Begins slowly and accelerates towards end. + * @method easeInStrong + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeInStrong: function (t, b, c, d) { + return c*(t/=d)*t*t*t + b; + }, + + /** + * Begins quickly and decelerates towards end. + * @method easeOutStrong + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeOutStrong: function (t, b, c, d) { + return -c * ((t=t/d-1)*t*t*t - 1) + b; + }, + + /** + * Begins slowly and decelerates towards end. + * @method easeBothStrong + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeBothStrong: function (t, b, c, d) { + if ((t/=d/2) < 1) { + return c/2*t*t*t*t + b; + } + + return -c/2 * ((t-=2)*t*t*t - 2) + b; + }, + + /** + * Snap in elastic effect. + * @method elasticIn + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} a Amplitude (optional) + * @param {Number} p Period (optional) + * @return {Number} The computed value for the current animation frame + */ + + elasticIn: function (t, b, c, d, a, p) { + if (t == 0) { + return b; + } + if ( (t /= d) == 1 ) { + return b+c; + } + if (!p) { + p=d*.3; + } + + if (!a || a < Math.abs(c)) { + a = c; + var s = p/4; + } + else { + var s = p/(2*Math.PI) * Math.asin (c/a); + } + + return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; + }, + + /** + * Snap out elastic effect. + * @method elasticOut + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} a Amplitude (optional) + * @param {Number} p Period (optional) + * @return {Number} The computed value for the current animation frame + */ + elasticOut: function (t, b, c, d, a, p) { + if (t == 0) { + return b; + } + if ( (t /= d) == 1 ) { + return b+c; + } + if (!p) { + p=d*.3; + } + + if (!a || a < Math.abs(c)) { + a = c; + var s = p / 4; + } + else { + var s = p/(2*Math.PI) * Math.asin (c/a); + } + + return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b; + }, + + /** + * Snap both elastic effect. + * @method elasticBoth + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} a Amplitude (optional) + * @param {Number} p Period (optional) + * @return {Number} The computed value for the current animation frame + */ + elasticBoth: function (t, b, c, d, a, p) { + if (t == 0) { + return b; + } + + if ( (t /= d/2) == 2 ) { + return b+c; + } + + if (!p) { + p = d*(.3*1.5); + } + + if ( !a || a < Math.abs(c) ) { + a = c; + var s = p/4; + } + else { + var s = p/(2*Math.PI) * Math.asin (c/a); + } + + if (t < 1) { + return -.5*(a*Math.pow(2,10*(t-=1)) * + Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; + } + return a*Math.pow(2,-10*(t-=1)) * + Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b; + }, + + + /** + * Backtracks slightly, then reverses direction and moves to end. + * @method backIn + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} s Overshoot (optional) + * @return {Number} The computed value for the current animation frame + */ + backIn: function (t, b, c, d, s) { + if (typeof s == 'undefined') { + s = 1.70158; + } + return c*(t/=d)*t*((s+1)*t - s) + b; + }, + + /** + * Overshoots end, then reverses and comes back to end. + * @method backOut + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} s Overshoot (optional) + * @return {Number} The computed value for the current animation frame + */ + backOut: function (t, b, c, d, s) { + if (typeof s == 'undefined') { + s = 1.70158; + } + return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b; + }, + + /** + * Backtracks slightly, then reverses direction, overshoots end, + * then reverses and comes back to end. + * @method backBoth + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} s Overshoot (optional) + * @return {Number} The computed value for the current animation frame + */ + backBoth: function (t, b, c, d, s) { + if (typeof s == 'undefined') { + s = 1.70158; + } + + if ((t /= d/2 ) < 1) { + return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b; + } + return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b; + }, + + /** + * Bounce off of start. + * @method bounceIn + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + bounceIn: function (t, b, c, d) { + return c - YAHOO.util.Easing.bounceOut(d-t, 0, c, d) + b; + }, + + /** + * Bounces off end. + * @method bounceOut + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + bounceOut: function (t, b, c, d) { + if ((t/=d) < (1/2.75)) { + return c*(7.5625*t*t) + b; + } else if (t < (2/2.75)) { + return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b; + } else if (t < (2.5/2.75)) { + return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b; + } + return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b; + }, + + /** + * Bounces off start and end. + * @method bounceBoth + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + bounceBoth: function (t, b, c, d) { + if (t < d/2) { + return YAHOO.util.Easing.bounceIn(t*2, 0, c, d) * .5 + b; + } + return YAHOO.util.Easing.bounceOut(t*2-d, 0, c, d) * .5 + c*.5 + b; + } +}; + +(function() { +/** + * Anim subclass for moving elements along a path defined by the "points" + * member of "attributes". All "points" are arrays with x, y coordinates. + *

    Usage: var myAnim = new YAHOO.util.Motion(el, { points: { to: [800, 800] } }, 1, YAHOO.util.Easing.easeOut);

    + * @class Motion + * @namespace YAHOO.util + * @requires YAHOO.util.Anim + * @requires YAHOO.util.AnimMgr + * @requires YAHOO.util.Easing + * @requires YAHOO.util.Bezier + * @requires YAHOO.util.Dom + * @requires YAHOO.util.Event + * @requires YAHOO.util.CustomEvent + * @constructor + * @extends YAHOO.util.ColorAnim + * @param {String | HTMLElement} el Reference to the element that will be animated + * @param {Object} attributes The attribute(s) to be animated. + * Each attribute is an object with at minimum a "to" or "by" member defined. + * Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). + * All attribute names use camelCase. + * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based + * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method) + */ + var Motion = function(el, attributes, duration, method) { + if (el) { // dont break existing subclasses not using YAHOO.extend + Motion.superclass.constructor.call(this, el, attributes, duration, method); + } + }; + + + Motion.NAME = 'Motion'; + + // shorthand + var Y = YAHOO.util; + YAHOO.extend(Motion, Y.ColorAnim); + + var superclass = Motion.superclass; + var proto = Motion.prototype; + + proto.patterns.points = /^points$/i; + + proto.setAttribute = function(attr, val, unit) { + if ( this.patterns.points.test(attr) ) { + unit = unit || 'px'; + superclass.setAttribute.call(this, 'left', val[0], unit); + superclass.setAttribute.call(this, 'top', val[1], unit); + } else { + superclass.setAttribute.call(this, attr, val, unit); + } + }; + + proto.getAttribute = function(attr) { + if ( this.patterns.points.test(attr) ) { + var val = [ + superclass.getAttribute.call(this, 'left'), + superclass.getAttribute.call(this, 'top') + ]; + } else { + val = superclass.getAttribute.call(this, attr); + } + + return val; + }; + + proto.doMethod = function(attr, start, end) { + var val = null; + + if ( this.patterns.points.test(attr) ) { + var t = this.method(this.currentFrame, 0, 100, this.totalFrames) / 100; + val = Y.Bezier.getPosition(this.runtimeAttributes[attr], t); + } else { + val = superclass.doMethod.call(this, attr, start, end); + } + return val; + }; + + proto.setRuntimeAttribute = function(attr) { + if ( this.patterns.points.test(attr) ) { + var el = this.getEl(); + var attributes = this.attributes; + var start; + var control = attributes['points']['control'] || []; + var end; + var i, len; + + if (control.length > 0 && !(control[0] instanceof Array) ) { // could be single point or array of points + control = [control]; + } else { // break reference to attributes.points.control + var tmp = []; + for (i = 0, len = control.length; i< len; ++i) { + tmp[i] = control[i]; + } + control = tmp; + } + + if (Y.Dom.getStyle(el, 'position') == 'static') { // default to relative + Y.Dom.setStyle(el, 'position', 'relative'); + } + + if ( isset(attributes['points']['from']) ) { + Y.Dom.setXY(el, attributes['points']['from']); // set position to from point + } + else { Y.Dom.setXY( el, Y.Dom.getXY(el) ); } // set it to current position + + start = this.getAttribute('points'); // get actual top & left + + // TO beats BY, per SMIL 2.1 spec + if ( isset(attributes['points']['to']) ) { + end = translateValues.call(this, attributes['points']['to'], start); + + var pageXY = Y.Dom.getXY(this.getEl()); + for (i = 0, len = control.length; i < len; ++i) { + control[i] = translateValues.call(this, control[i], start); + } + + + } else if ( isset(attributes['points']['by']) ) { + end = [ start[0] + attributes['points']['by'][0], start[1] + attributes['points']['by'][1] ]; + + for (i = 0, len = control.length; i < len; ++i) { + control[i] = [ start[0] + control[i][0], start[1] + control[i][1] ]; + } + } + + this.runtimeAttributes[attr] = [start]; + + if (control.length > 0) { + this.runtimeAttributes[attr] = this.runtimeAttributes[attr].concat(control); + } + + this.runtimeAttributes[attr][this.runtimeAttributes[attr].length] = end; + } + else { + superclass.setRuntimeAttribute.call(this, attr); + } + }; + + var translateValues = function(val, start) { + var pageXY = Y.Dom.getXY(this.getEl()); + val = [ val[0] - pageXY[0] + start[0], val[1] - pageXY[1] + start[1] ]; + + return val; + }; + + var isset = function(prop) { + return (typeof prop !== 'undefined'); + }; + + Y.Motion = Motion; +})(); +(function() { +/** + * Anim subclass for scrolling elements to a position defined by the "scroll" + * member of "attributes". All "scroll" members are arrays with x, y scroll positions. + *

    Usage: var myAnim = new YAHOO.util.Scroll(el, { scroll: { to: [0, 800] } }, 1, YAHOO.util.Easing.easeOut);

    + * @class Scroll + * @namespace YAHOO.util + * @requires YAHOO.util.Anim + * @requires YAHOO.util.AnimMgr + * @requires YAHOO.util.Easing + * @requires YAHOO.util.Bezier + * @requires YAHOO.util.Dom + * @requires YAHOO.util.Event + * @requires YAHOO.util.CustomEvent + * @extends YAHOO.util.ColorAnim + * @constructor + * @param {String or HTMLElement} el Reference to the element that will be animated + * @param {Object} attributes The attribute(s) to be animated. + * Each attribute is an object with at minimum a "to" or "by" member defined. + * Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). + * All attribute names use camelCase. + * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based + * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method) + */ + var Scroll = function(el, attributes, duration, method) { + if (el) { // dont break existing subclasses not using YAHOO.extend + Scroll.superclass.constructor.call(this, el, attributes, duration, method); + } + }; + + Scroll.NAME = 'Scroll'; + + // shorthand + var Y = YAHOO.util; + YAHOO.extend(Scroll, Y.ColorAnim); + + var superclass = Scroll.superclass; + var proto = Scroll.prototype; + + proto.doMethod = function(attr, start, end) { + var val = null; + + if (attr == 'scroll') { + val = [ + this.method(this.currentFrame, start[0], end[0] - start[0], this.totalFrames), + this.method(this.currentFrame, start[1], end[1] - start[1], this.totalFrames) + ]; + + } else { + val = superclass.doMethod.call(this, attr, start, end); + } + return val; + }; + + proto.getAttribute = function(attr) { + var val = null; + var el = this.getEl(); + + if (attr == 'scroll') { + val = [ el.scrollLeft, el.scrollTop ]; + } else { + val = superclass.getAttribute.call(this, attr); + } + + return val; + }; + + proto.setAttribute = function(attr, val, unit) { + var el = this.getEl(); + + if (attr == 'scroll') { + el.scrollLeft = val[0]; + el.scrollTop = val[1]; + } else { + superclass.setAttribute.call(this, attr, val, unit); + } + }; + + Y.Scroll = Scroll; +})(); +YAHOO.register("animation", YAHOO.util.Anim, {version: "2.7.0", build: "1799"}); diff --git a/public/css/yui/build/animation/animation-min.js b/public/css/yui/build/animation/animation-min.js new file mode 100644 index 000000000..d8ab43ced --- /dev/null +++ b/public/css/yui/build/animation/animation-min.js @@ -0,0 +1,23 @@ +/* +Copyright (c) 2009, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.7.0 +*/ +(function(){var B=YAHOO.util;var A=function(D,C,E,F){if(!D){}this.init(D,C,E,F);};A.NAME="Anim";A.prototype={toString:function(){var C=this.getEl()||{};var D=C.id||C.tagName;return(this.constructor.NAME+": "+D);},patterns:{noNegatives:/width|height|opacity|padding/i,offsetAttribute:/^((width|height)|(top|left))$/,defaultUnit:/width|height|top$|bottom$|left$|right$/i,offsetUnit:/\d+(em|%|en|ex|pt|in|cm|mm|pc)$/i},doMethod:function(C,E,D){return this.method(this.currentFrame,E,D-E,this.totalFrames);},setAttribute:function(C,F,E){var D=this.getEl();if(this.patterns.noNegatives.test(C)){F=(F>0)?F:0;}if("style" in D){B.Dom.setStyle(D,C,F+E);}else{if(C in D){D[C]=F;}}},getAttribute:function(C){var E=this.getEl();var G=B.Dom.getStyle(E,C);if(G!=="auto"&&!this.patterns.offsetUnit.test(G)){return parseFloat(G);}var D=this.patterns.offsetAttribute.exec(C)||[];var H=!!(D[3]);var F=!!(D[2]);if("style" in E){if(F||(B.Dom.getStyle(E,"position")=="absolute"&&H)){G=E["offset"+D[0].charAt(0).toUpperCase()+D[0].substr(1)];}else{G=0;}}else{if(C in E){G=E[C];}}return G;},getDefaultUnit:function(C){if(this.patterns.defaultUnit.test(C)){return"px";}return"";},setRuntimeAttribute:function(D){var I;var E;var F=this.attributes;this.runtimeAttributes[D]={};var H=function(J){return(typeof J!=="undefined");};if(!H(F[D]["to"])&&!H(F[D]["by"])){return false;}I=(H(F[D]["from"]))?F[D]["from"]:this.getAttribute(D);if(H(F[D]["to"])){E=F[D]["to"];}else{if(H(F[D]["by"])){if(I.constructor==Array){E=[];for(var G=0,C=I.length;G0&&isFinite(K)){if(G.currentFrame+K>=J){K=J-(I+1);}G.currentFrame+=K;}};};YAHOO.util.Bezier=new function(){this.getPosition=function(E,D){var F=E.length;var C=[];for(var B=0;B0&&!(L[0] instanceof Array)){L=[L];}else{var K=[];for(M=0,O=L.length;M0){this.runtimeAttributes[P]=this.runtimeAttributes[P].concat(L);}this.runtimeAttributes[P][this.runtimeAttributes[P].length]=I;}else{F.setRuntimeAttribute.call(this,P);}};var B=function(G,I){var H=E.Dom.getXY(this.getEl());G=[G[0]-H[0]+I[0],G[1]-H[1]+I[1]];return G;};var D=function(G){return(typeof G!=="undefined");};E.Motion=A;})();(function(){var D=function(F,E,G,H){if(F){D.superclass.constructor.call(this,F,E,G,H);}};D.NAME="Scroll";var B=YAHOO.util;YAHOO.extend(D,B.ColorAnim);var C=D.superclass;var A=D.prototype;A.doMethod=function(E,H,F){var G=null;if(E=="scroll"){G=[this.method(this.currentFrame,H[0],F[0]-H[0],this.totalFrames),this.method(this.currentFrame,H[1],F[1]-H[1],this.totalFrames)];}else{G=C.doMethod.call(this,E,H,F);}return G;};A.getAttribute=function(E){var G=null;var F=this.getEl();if(E=="scroll"){G=[F.scrollLeft,F.scrollTop];}else{G=C.getAttribute.call(this,E);}return G;};A.setAttribute=function(E,H,G){var F=this.getEl();if(E=="scroll"){F.scrollLeft=H[0];F.scrollTop=H[1];}else{C.setAttribute.call(this,E,H,G);}};B.Scroll=D;})();YAHOO.register("animation",YAHOO.util.Anim,{version:"2.7.0",build:"1799"}); \ No newline at end of file diff --git a/public/css/yui/build/animation/animation.js b/public/css/yui/build/animation/animation.js new file mode 100644 index 000000000..1477faa28 --- /dev/null +++ b/public/css/yui/build/animation/animation.js @@ -0,0 +1,1390 @@ +/* +Copyright (c) 2009, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.7.0 +*/ +(function() { + +var Y = YAHOO.util; + +/* +Copyright (c) 2006, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +*/ + +/** + * The animation module provides allows effects to be added to HTMLElements. + * @module animation + * @requires yahoo, event, dom + */ + +/** + * + * Base animation class that provides the interface for building animated effects. + *

    Usage: var myAnim = new YAHOO.util.Anim(el, { width: { from: 10, to: 100 } }, 1, YAHOO.util.Easing.easeOut);

    + * @class Anim + * @namespace YAHOO.util + * @requires YAHOO.util.AnimMgr + * @requires YAHOO.util.Easing + * @requires YAHOO.util.Dom + * @requires YAHOO.util.Event + * @requires YAHOO.util.CustomEvent + * @constructor + * @param {String | HTMLElement} el Reference to the element that will be animated + * @param {Object} attributes The attribute(s) to be animated. + * Each attribute is an object with at minimum a "to" or "by" member defined. + * Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). + * All attribute names use camelCase. + * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based + * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method) + */ + +var Anim = function(el, attributes, duration, method) { + if (!el) { + } + this.init(el, attributes, duration, method); +}; + +Anim.NAME = 'Anim'; + +Anim.prototype = { + /** + * Provides a readable name for the Anim instance. + * @method toString + * @return {String} + */ + toString: function() { + var el = this.getEl() || {}; + var id = el.id || el.tagName; + return (this.constructor.NAME + ': ' + id); + }, + + patterns: { // cached for performance + noNegatives: /width|height|opacity|padding/i, // keep at zero or above + offsetAttribute: /^((width|height)|(top|left))$/, // use offsetValue as default + defaultUnit: /width|height|top$|bottom$|left$|right$/i, // use 'px' by default + offsetUnit: /\d+(em|%|en|ex|pt|in|cm|mm|pc)$/i // IE may return these, so convert these to offset + }, + + /** + * Returns the value computed by the animation's "method". + * @method doMethod + * @param {String} attr The name of the attribute. + * @param {Number} start The value this attribute should start from for this animation. + * @param {Number} end The value this attribute should end at for this animation. + * @return {Number} The Value to be applied to the attribute. + */ + doMethod: function(attr, start, end) { + return this.method(this.currentFrame, start, end - start, this.totalFrames); + }, + + /** + * Applies a value to an attribute. + * @method setAttribute + * @param {String} attr The name of the attribute. + * @param {Number} val The value to be applied to the attribute. + * @param {String} unit The unit ('px', '%', etc.) of the value. + */ + setAttribute: function(attr, val, unit) { + var el = this.getEl(); + if ( this.patterns.noNegatives.test(attr) ) { + val = (val > 0) ? val : 0; + } + + if ('style' in el) { + Y.Dom.setStyle(el, attr, val + unit); + } else if (attr in el) { + el[attr] = val; + } + }, + + /** + * Returns current value of the attribute. + * @method getAttribute + * @param {String} attr The name of the attribute. + * @return {Number} val The current value of the attribute. + */ + getAttribute: function(attr) { + var el = this.getEl(); + var val = Y.Dom.getStyle(el, attr); + + if (val !== 'auto' && !this.patterns.offsetUnit.test(val)) { + return parseFloat(val); + } + + var a = this.patterns.offsetAttribute.exec(attr) || []; + var pos = !!( a[3] ); // top or left + var box = !!( a[2] ); // width or height + + if ('style' in el) { + // use offsets for width/height and abs pos top/left + if ( box || (Y.Dom.getStyle(el, 'position') == 'absolute' && pos) ) { + val = el['offset' + a[0].charAt(0).toUpperCase() + a[0].substr(1)]; + } else { // default to zero for other 'auto' + val = 0; + } + } else if (attr in el) { + val = el[attr]; + } + + return val; + }, + + /** + * Returns the unit to use when none is supplied. + * @method getDefaultUnit + * @param {attr} attr The name of the attribute. + * @return {String} The default unit to be used. + */ + getDefaultUnit: function(attr) { + if ( this.patterns.defaultUnit.test(attr) ) { + return 'px'; + } + + return ''; + }, + + /** + * Sets the actual values to be used during the animation. Should only be needed for subclass use. + * @method setRuntimeAttribute + * @param {Object} attr The attribute object + * @private + */ + setRuntimeAttribute: function(attr) { + var start; + var end; + var attributes = this.attributes; + + this.runtimeAttributes[attr] = {}; + + var isset = function(prop) { + return (typeof prop !== 'undefined'); + }; + + if ( !isset(attributes[attr]['to']) && !isset(attributes[attr]['by']) ) { + return false; // note return; nothing to animate to + } + + start = ( isset(attributes[attr]['from']) ) ? attributes[attr]['from'] : this.getAttribute(attr); + + // To beats by, per SMIL 2.1 spec + if ( isset(attributes[attr]['to']) ) { + end = attributes[attr]['to']; + } else if ( isset(attributes[attr]['by']) ) { + if (start.constructor == Array) { + end = []; + for (var i = 0, len = start.length; i < len; ++i) { + end[i] = start[i] + attributes[attr]['by'][i] * 1; // times 1 to cast "by" + } + } else { + end = start + attributes[attr]['by'] * 1; + } + } + + this.runtimeAttributes[attr].start = start; + this.runtimeAttributes[attr].end = end; + + // set units if needed + this.runtimeAttributes[attr].unit = ( isset(attributes[attr].unit) ) ? + attributes[attr]['unit'] : this.getDefaultUnit(attr); + return true; + }, + + /** + * Constructor for Anim instance. + * @method init + * @param {String | HTMLElement} el Reference to the element that will be animated + * @param {Object} attributes The attribute(s) to be animated. + * Each attribute is an object with at minimum a "to" or "by" member defined. + * Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). + * All attribute names use camelCase. + * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based + * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method) + */ + init: function(el, attributes, duration, method) { + /** + * Whether or not the animation is running. + * @property isAnimated + * @private + * @type Boolean + */ + var isAnimated = false; + + /** + * A Date object that is created when the animation begins. + * @property startTime + * @private + * @type Date + */ + var startTime = null; + + /** + * The number of frames this animation was able to execute. + * @property actualFrames + * @private + * @type Int + */ + var actualFrames = 0; + + /** + * The element to be animated. + * @property el + * @private + * @type HTMLElement + */ + el = Y.Dom.get(el); + + /** + * The collection of attributes to be animated. + * Each attribute must have at least a "to" or "by" defined in order to animate. + * If "to" is supplied, the animation will end with the attribute at that value. + * If "by" is supplied, the animation will end at that value plus its starting value. + * If both are supplied, "to" is used, and "by" is ignored. + * Optional additional member include "from" (the value the attribute should start animating from, defaults to current value), and "unit" (the units to apply to the values). + * @property attributes + * @type Object + */ + this.attributes = attributes || {}; + + /** + * The length of the animation. Defaults to "1" (second). + * @property duration + * @type Number + */ + this.duration = !YAHOO.lang.isUndefined(duration) ? duration : 1; + + /** + * The method that will provide values to the attribute(s) during the animation. + * Defaults to "YAHOO.util.Easing.easeNone". + * @property method + * @type Function + */ + this.method = method || Y.Easing.easeNone; + + /** + * Whether or not the duration should be treated as seconds. + * Defaults to true. + * @property useSeconds + * @type Boolean + */ + this.useSeconds = true; // default to seconds + + /** + * The location of the current animation on the timeline. + * In time-based animations, this is used by AnimMgr to ensure the animation finishes on time. + * @property currentFrame + * @type Int + */ + this.currentFrame = 0; + + /** + * The total number of frames to be executed. + * In time-based animations, this is used by AnimMgr to ensure the animation finishes on time. + * @property totalFrames + * @type Int + */ + this.totalFrames = Y.AnimMgr.fps; + + /** + * Changes the animated element + * @method setEl + */ + this.setEl = function(element) { + el = Y.Dom.get(element); + }; + + /** + * Returns a reference to the animated element. + * @method getEl + * @return {HTMLElement} + */ + this.getEl = function() { return el; }; + + /** + * Checks whether the element is currently animated. + * @method isAnimated + * @return {Boolean} current value of isAnimated. + */ + this.isAnimated = function() { + return isAnimated; + }; + + /** + * Returns the animation start time. + * @method getStartTime + * @return {Date} current value of startTime. + */ + this.getStartTime = function() { + return startTime; + }; + + this.runtimeAttributes = {}; + + + + /** + * Starts the animation by registering it with the animation manager. + * @method animate + */ + this.animate = function() { + if ( this.isAnimated() ) { + return false; + } + + this.currentFrame = 0; + + this.totalFrames = ( this.useSeconds ) ? Math.ceil(Y.AnimMgr.fps * this.duration) : this.duration; + + if (this.duration === 0 && this.useSeconds) { // jump to last frame if zero second duration + this.totalFrames = 1; + } + Y.AnimMgr.registerElement(this); + return true; + }; + + /** + * Stops the animation. Normally called by AnimMgr when animation completes. + * @method stop + * @param {Boolean} finish (optional) If true, animation will jump to final frame. + */ + this.stop = function(finish) { + if (!this.isAnimated()) { // nothing to stop + return false; + } + + if (finish) { + this.currentFrame = this.totalFrames; + this._onTween.fire(); + } + Y.AnimMgr.stop(this); + }; + + var onStart = function() { + this.onStart.fire(); + + this.runtimeAttributes = {}; + for (var attr in this.attributes) { + this.setRuntimeAttribute(attr); + } + + isAnimated = true; + actualFrames = 0; + startTime = new Date(); + }; + + /** + * Feeds the starting and ending values for each animated attribute to doMethod once per frame, then applies the resulting value to the attribute(s). + * @private + */ + + var onTween = function() { + var data = { + duration: new Date() - this.getStartTime(), + currentFrame: this.currentFrame + }; + + data.toString = function() { + return ( + 'duration: ' + data.duration + + ', currentFrame: ' + data.currentFrame + ); + }; + + this.onTween.fire(data); + + var runtimeAttributes = this.runtimeAttributes; + + for (var attr in runtimeAttributes) { + this.setAttribute(attr, this.doMethod(attr, runtimeAttributes[attr].start, runtimeAttributes[attr].end), runtimeAttributes[attr].unit); + } + + actualFrames += 1; + }; + + var onComplete = function() { + var actual_duration = (new Date() - startTime) / 1000 ; + + var data = { + duration: actual_duration, + frames: actualFrames, + fps: actualFrames / actual_duration + }; + + data.toString = function() { + return ( + 'duration: ' + data.duration + + ', frames: ' + data.frames + + ', fps: ' + data.fps + ); + }; + + isAnimated = false; + actualFrames = 0; + this.onComplete.fire(data); + }; + + /** + * Custom event that fires after onStart, useful in subclassing + * @private + */ + this._onStart = new Y.CustomEvent('_start', this, true); + + /** + * Custom event that fires when animation begins + * Listen via subscribe method (e.g. myAnim.onStart.subscribe(someFunction) + * @event onStart + */ + this.onStart = new Y.CustomEvent('start', this); + + /** + * Custom event that fires between each frame + * Listen via subscribe method (e.g. myAnim.onTween.subscribe(someFunction) + * @event onTween + */ + this.onTween = new Y.CustomEvent('tween', this); + + /** + * Custom event that fires after onTween + * @private + */ + this._onTween = new Y.CustomEvent('_tween', this, true); + + /** + * Custom event that fires when animation ends + * Listen via subscribe method (e.g. myAnim.onComplete.subscribe(someFunction) + * @event onComplete + */ + this.onComplete = new Y.CustomEvent('complete', this); + /** + * Custom event that fires after onComplete + * @private + */ + this._onComplete = new Y.CustomEvent('_complete', this, true); + + this._onStart.subscribe(onStart); + this._onTween.subscribe(onTween); + this._onComplete.subscribe(onComplete); + } +}; + + Y.Anim = Anim; +})(); +/** + * Handles animation queueing and threading. + * Used by Anim and subclasses. + * @class AnimMgr + * @namespace YAHOO.util + */ +YAHOO.util.AnimMgr = new function() { + /** + * Reference to the animation Interval. + * @property thread + * @private + * @type Int + */ + var thread = null; + + /** + * The current queue of registered animation objects. + * @property queue + * @private + * @type Array + */ + var queue = []; + + /** + * The number of active animations. + * @property tweenCount + * @private + * @type Int + */ + var tweenCount = 0; + + /** + * Base frame rate (frames per second). + * Arbitrarily high for better x-browser calibration (slower browsers drop more frames). + * @property fps + * @type Int + * + */ + this.fps = 1000; + + /** + * Interval delay in milliseconds, defaults to fastest possible. + * @property delay + * @type Int + * + */ + this.delay = 1; + + /** + * Adds an animation instance to the animation queue. + * All animation instances must be registered in order to animate. + * @method registerElement + * @param {object} tween The Anim instance to be be registered + */ + this.registerElement = function(tween) { + queue[queue.length] = tween; + tweenCount += 1; + tween._onStart.fire(); + this.start(); + }; + + /** + * removes an animation instance from the animation queue. + * All animation instances must be registered in order to animate. + * @method unRegister + * @param {object} tween The Anim instance to be be registered + * @param {Int} index The index of the Anim instance + * @private + */ + this.unRegister = function(tween, index) { + index = index || getIndex(tween); + if (!tween.isAnimated() || index == -1) { + return false; + } + + tween._onComplete.fire(); + queue.splice(index, 1); + + tweenCount -= 1; + if (tweenCount <= 0) { + this.stop(); + } + + return true; + }; + + /** + * Starts the animation thread. + * Only one thread can run at a time. + * @method start + */ + this.start = function() { + if (thread === null) { + thread = setInterval(this.run, this.delay); + } + }; + + /** + * Stops the animation thread or a specific animation instance. + * @method stop + * @param {object} tween A specific Anim instance to stop (optional) + * If no instance given, Manager stops thread and all animations. + */ + this.stop = function(tween) { + if (!tween) { + clearInterval(thread); + + for (var i = 0, len = queue.length; i < len; ++i) { + this.unRegister(queue[0], 0); + } + + queue = []; + thread = null; + tweenCount = 0; + } + else { + this.unRegister(tween); + } + }; + + /** + * Called per Interval to handle each animation frame. + * @method run + */ + this.run = function() { + for (var i = 0, len = queue.length; i < len; ++i) { + var tween = queue[i]; + if ( !tween || !tween.isAnimated() ) { continue; } + + if (tween.currentFrame < tween.totalFrames || tween.totalFrames === null) + { + tween.currentFrame += 1; + + if (tween.useSeconds) { + correctFrame(tween); + } + tween._onTween.fire(); + } + else { YAHOO.util.AnimMgr.stop(tween, i); } + } + }; + + var getIndex = function(anim) { + for (var i = 0, len = queue.length; i < len; ++i) { + if (queue[i] == anim) { + return i; // note return; + } + } + return -1; + }; + + /** + * On the fly frame correction to keep animation on time. + * @method correctFrame + * @private + * @param {Object} tween The Anim instance being corrected. + */ + var correctFrame = function(tween) { + var frames = tween.totalFrames; + var frame = tween.currentFrame; + var expected = (tween.currentFrame * tween.duration * 1000 / tween.totalFrames); + var elapsed = (new Date() - tween.getStartTime()); + var tweak = 0; + + if (elapsed < tween.duration * 1000) { // check if falling behind + tweak = Math.round((elapsed / expected - 1) * tween.currentFrame); + } else { // went over duration, so jump to end + tweak = frames - (frame + 1); + } + if (tweak > 0 && isFinite(tweak)) { // adjust if needed + if (tween.currentFrame + tweak >= frames) {// dont go past last frame + tweak = frames - (frame + 1); + } + + tween.currentFrame += tweak; + } + }; +}; +/** + * Used to calculate Bezier splines for any number of control points. + * @class Bezier + * @namespace YAHOO.util + * + */ +YAHOO.util.Bezier = new function() { + /** + * Get the current position of the animated element based on t. + * Each point is an array of "x" and "y" values (0 = x, 1 = y) + * At least 2 points are required (start and end). + * First point is start. Last point is end. + * Additional control points are optional. + * @method getPosition + * @param {Array} points An array containing Bezier points + * @param {Number} t A number between 0 and 1 which is the basis for determining current position + * @return {Array} An array containing int x and y member data + */ + this.getPosition = function(points, t) { + var n = points.length; + var tmp = []; + + for (var i = 0; i < n; ++i){ + tmp[i] = [points[i][0], points[i][1]]; // save input + } + + for (var j = 1; j < n; ++j) { + for (i = 0; i < n - j; ++i) { + tmp[i][0] = (1 - t) * tmp[i][0] + t * tmp[parseInt(i + 1, 10)][0]; + tmp[i][1] = (1 - t) * tmp[i][1] + t * tmp[parseInt(i + 1, 10)][1]; + } + } + + return [ tmp[0][0], tmp[0][1] ]; + + }; +}; +(function() { +/** + * Anim subclass for color transitions. + *

    Usage: var myAnim = new Y.ColorAnim(el, { backgroundColor: { from: '#FF0000', to: '#FFFFFF' } }, 1, Y.Easing.easeOut); Color values can be specified with either 112233, #112233, + * [255,255,255], or rgb(255,255,255)

    + * @class ColorAnim + * @namespace YAHOO.util + * @requires YAHOO.util.Anim + * @requires YAHOO.util.AnimMgr + * @requires YAHOO.util.Easing + * @requires YAHOO.util.Bezier + * @requires YAHOO.util.Dom + * @requires YAHOO.util.Event + * @constructor + * @extends YAHOO.util.Anim + * @param {HTMLElement | String} el Reference to the element that will be animated + * @param {Object} attributes The attribute(s) to be animated. + * Each attribute is an object with at minimum a "to" or "by" member defined. + * Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). + * All attribute names use camelCase. + * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based + * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method) + */ + var ColorAnim = function(el, attributes, duration, method) { + ColorAnim.superclass.constructor.call(this, el, attributes, duration, method); + }; + + ColorAnim.NAME = 'ColorAnim'; + + ColorAnim.DEFAULT_BGCOLOR = '#fff'; + // shorthand + var Y = YAHOO.util; + YAHOO.extend(ColorAnim, Y.Anim); + + var superclass = ColorAnim.superclass; + var proto = ColorAnim.prototype; + + proto.patterns.color = /color$/i; + proto.patterns.rgb = /^rgb\(([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\)$/i; + proto.patterns.hex = /^#?([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})$/i; + proto.patterns.hex3 = /^#?([0-9A-F]{1})([0-9A-F]{1})([0-9A-F]{1})$/i; + proto.patterns.transparent = /^transparent|rgba\(0, 0, 0, 0\)$/; // need rgba for safari + + /** + * Attempts to parse the given string and return a 3-tuple. + * @method parseColor + * @param {String} s The string to parse. + * @return {Array} The 3-tuple of rgb values. + */ + proto.parseColor = function(s) { + if (s.length == 3) { return s; } + + var c = this.patterns.hex.exec(s); + if (c && c.length == 4) { + return [ parseInt(c[1], 16), parseInt(c[2], 16), parseInt(c[3], 16) ]; + } + + c = this.patterns.rgb.exec(s); + if (c && c.length == 4) { + return [ parseInt(c[1], 10), parseInt(c[2], 10), parseInt(c[3], 10) ]; + } + + c = this.patterns.hex3.exec(s); + if (c && c.length == 4) { + return [ parseInt(c[1] + c[1], 16), parseInt(c[2] + c[2], 16), parseInt(c[3] + c[3], 16) ]; + } + + return null; + }; + + proto.getAttribute = function(attr) { + var el = this.getEl(); + if (this.patterns.color.test(attr) ) { + var val = YAHOO.util.Dom.getStyle(el, attr); + + var that = this; + if (this.patterns.transparent.test(val)) { // bgcolor default + var parent = YAHOO.util.Dom.getAncestorBy(el, function(node) { + return !that.patterns.transparent.test(val); + }); + + if (parent) { + val = Y.Dom.getStyle(parent, attr); + } else { + val = ColorAnim.DEFAULT_BGCOLOR; + } + } + } else { + val = superclass.getAttribute.call(this, attr); + } + + return val; + }; + + proto.doMethod = function(attr, start, end) { + var val; + + if ( this.patterns.color.test(attr) ) { + val = []; + for (var i = 0, len = start.length; i < len; ++i) { + val[i] = superclass.doMethod.call(this, attr, start[i], end[i]); + } + + val = 'rgb('+Math.floor(val[0])+','+Math.floor(val[1])+','+Math.floor(val[2])+')'; + } + else { + val = superclass.doMethod.call(this, attr, start, end); + } + + return val; + }; + + proto.setRuntimeAttribute = function(attr) { + superclass.setRuntimeAttribute.call(this, attr); + + if ( this.patterns.color.test(attr) ) { + var attributes = this.attributes; + var start = this.parseColor(this.runtimeAttributes[attr].start); + var end = this.parseColor(this.runtimeAttributes[attr].end); + // fix colors if going "by" + if ( typeof attributes[attr]['to'] === 'undefined' && typeof attributes[attr]['by'] !== 'undefined' ) { + end = this.parseColor(attributes[attr].by); + + for (var i = 0, len = start.length; i < len; ++i) { + end[i] = start[i] + end[i]; + } + } + + this.runtimeAttributes[attr].start = start; + this.runtimeAttributes[attr].end = end; + } + }; + + Y.ColorAnim = ColorAnim; +})(); +/*! +TERMS OF USE - EASING EQUATIONS +Open source under the BSD License. +Copyright 2001 Robert Penner All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + * Neither the name of the author nor the names of contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/** + * Singleton that determines how an animation proceeds from start to end. + * @class Easing + * @namespace YAHOO.util +*/ + +YAHOO.util.Easing = { + + /** + * Uniform speed between points. + * @method easeNone + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeNone: function (t, b, c, d) { + return c*t/d + b; + }, + + /** + * Begins slowly and accelerates towards end. + * @method easeIn + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeIn: function (t, b, c, d) { + return c*(t/=d)*t + b; + }, + + /** + * Begins quickly and decelerates towards end. + * @method easeOut + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeOut: function (t, b, c, d) { + return -c *(t/=d)*(t-2) + b; + }, + + /** + * Begins slowly and decelerates towards end. + * @method easeBoth + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeBoth: function (t, b, c, d) { + if ((t/=d/2) < 1) { + return c/2*t*t + b; + } + + return -c/2 * ((--t)*(t-2) - 1) + b; + }, + + /** + * Begins slowly and accelerates towards end. + * @method easeInStrong + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeInStrong: function (t, b, c, d) { + return c*(t/=d)*t*t*t + b; + }, + + /** + * Begins quickly and decelerates towards end. + * @method easeOutStrong + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeOutStrong: function (t, b, c, d) { + return -c * ((t=t/d-1)*t*t*t - 1) + b; + }, + + /** + * Begins slowly and decelerates towards end. + * @method easeBothStrong + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeBothStrong: function (t, b, c, d) { + if ((t/=d/2) < 1) { + return c/2*t*t*t*t + b; + } + + return -c/2 * ((t-=2)*t*t*t - 2) + b; + }, + + /** + * Snap in elastic effect. + * @method elasticIn + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} a Amplitude (optional) + * @param {Number} p Period (optional) + * @return {Number} The computed value for the current animation frame + */ + + elasticIn: function (t, b, c, d, a, p) { + if (t == 0) { + return b; + } + if ( (t /= d) == 1 ) { + return b+c; + } + if (!p) { + p=d*.3; + } + + if (!a || a < Math.abs(c)) { + a = c; + var s = p/4; + } + else { + var s = p/(2*Math.PI) * Math.asin (c/a); + } + + return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; + }, + + /** + * Snap out elastic effect. + * @method elasticOut + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} a Amplitude (optional) + * @param {Number} p Period (optional) + * @return {Number} The computed value for the current animation frame + */ + elasticOut: function (t, b, c, d, a, p) { + if (t == 0) { + return b; + } + if ( (t /= d) == 1 ) { + return b+c; + } + if (!p) { + p=d*.3; + } + + if (!a || a < Math.abs(c)) { + a = c; + var s = p / 4; + } + else { + var s = p/(2*Math.PI) * Math.asin (c/a); + } + + return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b; + }, + + /** + * Snap both elastic effect. + * @method elasticBoth + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} a Amplitude (optional) + * @param {Number} p Period (optional) + * @return {Number} The computed value for the current animation frame + */ + elasticBoth: function (t, b, c, d, a, p) { + if (t == 0) { + return b; + } + + if ( (t /= d/2) == 2 ) { + return b+c; + } + + if (!p) { + p = d*(.3*1.5); + } + + if ( !a || a < Math.abs(c) ) { + a = c; + var s = p/4; + } + else { + var s = p/(2*Math.PI) * Math.asin (c/a); + } + + if (t < 1) { + return -.5*(a*Math.pow(2,10*(t-=1)) * + Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; + } + return a*Math.pow(2,-10*(t-=1)) * + Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b; + }, + + + /** + * Backtracks slightly, then reverses direction and moves to end. + * @method backIn + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} s Overshoot (optional) + * @return {Number} The computed value for the current animation frame + */ + backIn: function (t, b, c, d, s) { + if (typeof s == 'undefined') { + s = 1.70158; + } + return c*(t/=d)*t*((s+1)*t - s) + b; + }, + + /** + * Overshoots end, then reverses and comes back to end. + * @method backOut + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} s Overshoot (optional) + * @return {Number} The computed value for the current animation frame + */ + backOut: function (t, b, c, d, s) { + if (typeof s == 'undefined') { + s = 1.70158; + } + return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b; + }, + + /** + * Backtracks slightly, then reverses direction, overshoots end, + * then reverses and comes back to end. + * @method backBoth + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} s Overshoot (optional) + * @return {Number} The computed value for the current animation frame + */ + backBoth: function (t, b, c, d, s) { + if (typeof s == 'undefined') { + s = 1.70158; + } + + if ((t /= d/2 ) < 1) { + return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b; + } + return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b; + }, + + /** + * Bounce off of start. + * @method bounceIn + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + bounceIn: function (t, b, c, d) { + return c - YAHOO.util.Easing.bounceOut(d-t, 0, c, d) + b; + }, + + /** + * Bounces off end. + * @method bounceOut + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + bounceOut: function (t, b, c, d) { + if ((t/=d) < (1/2.75)) { + return c*(7.5625*t*t) + b; + } else if (t < (2/2.75)) { + return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b; + } else if (t < (2.5/2.75)) { + return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b; + } + return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b; + }, + + /** + * Bounces off start and end. + * @method bounceBoth + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + bounceBoth: function (t, b, c, d) { + if (t < d/2) { + return YAHOO.util.Easing.bounceIn(t*2, 0, c, d) * .5 + b; + } + return YAHOO.util.Easing.bounceOut(t*2-d, 0, c, d) * .5 + c*.5 + b; + } +}; + +(function() { +/** + * Anim subclass for moving elements along a path defined by the "points" + * member of "attributes". All "points" are arrays with x, y coordinates. + *

    Usage: var myAnim = new YAHOO.util.Motion(el, { points: { to: [800, 800] } }, 1, YAHOO.util.Easing.easeOut);

    + * @class Motion + * @namespace YAHOO.util + * @requires YAHOO.util.Anim + * @requires YAHOO.util.AnimMgr + * @requires YAHOO.util.Easing + * @requires YAHOO.util.Bezier + * @requires YAHOO.util.Dom + * @requires YAHOO.util.Event + * @requires YAHOO.util.CustomEvent + * @constructor + * @extends YAHOO.util.ColorAnim + * @param {String | HTMLElement} el Reference to the element that will be animated + * @param {Object} attributes The attribute(s) to be animated. + * Each attribute is an object with at minimum a "to" or "by" member defined. + * Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). + * All attribute names use camelCase. + * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based + * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method) + */ + var Motion = function(el, attributes, duration, method) { + if (el) { // dont break existing subclasses not using YAHOO.extend + Motion.superclass.constructor.call(this, el, attributes, duration, method); + } + }; + + + Motion.NAME = 'Motion'; + + // shorthand + var Y = YAHOO.util; + YAHOO.extend(Motion, Y.ColorAnim); + + var superclass = Motion.superclass; + var proto = Motion.prototype; + + proto.patterns.points = /^points$/i; + + proto.setAttribute = function(attr, val, unit) { + if ( this.patterns.points.test(attr) ) { + unit = unit || 'px'; + superclass.setAttribute.call(this, 'left', val[0], unit); + superclass.setAttribute.call(this, 'top', val[1], unit); + } else { + superclass.setAttribute.call(this, attr, val, unit); + } + }; + + proto.getAttribute = function(attr) { + if ( this.patterns.points.test(attr) ) { + var val = [ + superclass.getAttribute.call(this, 'left'), + superclass.getAttribute.call(this, 'top') + ]; + } else { + val = superclass.getAttribute.call(this, attr); + } + + return val; + }; + + proto.doMethod = function(attr, start, end) { + var val = null; + + if ( this.patterns.points.test(attr) ) { + var t = this.method(this.currentFrame, 0, 100, this.totalFrames) / 100; + val = Y.Bezier.getPosition(this.runtimeAttributes[attr], t); + } else { + val = superclass.doMethod.call(this, attr, start, end); + } + return val; + }; + + proto.setRuntimeAttribute = function(attr) { + if ( this.patterns.points.test(attr) ) { + var el = this.getEl(); + var attributes = this.attributes; + var start; + var control = attributes['points']['control'] || []; + var end; + var i, len; + + if (control.length > 0 && !(control[0] instanceof Array) ) { // could be single point or array of points + control = [control]; + } else { // break reference to attributes.points.control + var tmp = []; + for (i = 0, len = control.length; i< len; ++i) { + tmp[i] = control[i]; + } + control = tmp; + } + + if (Y.Dom.getStyle(el, 'position') == 'static') { // default to relative + Y.Dom.setStyle(el, 'position', 'relative'); + } + + if ( isset(attributes['points']['from']) ) { + Y.Dom.setXY(el, attributes['points']['from']); // set position to from point + } + else { Y.Dom.setXY( el, Y.Dom.getXY(el) ); } // set it to current position + + start = this.getAttribute('points'); // get actual top & left + + // TO beats BY, per SMIL 2.1 spec + if ( isset(attributes['points']['to']) ) { + end = translateValues.call(this, attributes['points']['to'], start); + + var pageXY = Y.Dom.getXY(this.getEl()); + for (i = 0, len = control.length; i < len; ++i) { + control[i] = translateValues.call(this, control[i], start); + } + + + } else if ( isset(attributes['points']['by']) ) { + end = [ start[0] + attributes['points']['by'][0], start[1] + attributes['points']['by'][1] ]; + + for (i = 0, len = control.length; i < len; ++i) { + control[i] = [ start[0] + control[i][0], start[1] + control[i][1] ]; + } + } + + this.runtimeAttributes[attr] = [start]; + + if (control.length > 0) { + this.runtimeAttributes[attr] = this.runtimeAttributes[attr].concat(control); + } + + this.runtimeAttributes[attr][this.runtimeAttributes[attr].length] = end; + } + else { + superclass.setRuntimeAttribute.call(this, attr); + } + }; + + var translateValues = function(val, start) { + var pageXY = Y.Dom.getXY(this.getEl()); + val = [ val[0] - pageXY[0] + start[0], val[1] - pageXY[1] + start[1] ]; + + return val; + }; + + var isset = function(prop) { + return (typeof prop !== 'undefined'); + }; + + Y.Motion = Motion; +})(); +(function() { +/** + * Anim subclass for scrolling elements to a position defined by the "scroll" + * member of "attributes". All "scroll" members are arrays with x, y scroll positions. + *

    Usage: var myAnim = new YAHOO.util.Scroll(el, { scroll: { to: [0, 800] } }, 1, YAHOO.util.Easing.easeOut);

    + * @class Scroll + * @namespace YAHOO.util + * @requires YAHOO.util.Anim + * @requires YAHOO.util.AnimMgr + * @requires YAHOO.util.Easing + * @requires YAHOO.util.Bezier + * @requires YAHOO.util.Dom + * @requires YAHOO.util.Event + * @requires YAHOO.util.CustomEvent + * @extends YAHOO.util.ColorAnim + * @constructor + * @param {String or HTMLElement} el Reference to the element that will be animated + * @param {Object} attributes The attribute(s) to be animated. + * Each attribute is an object with at minimum a "to" or "by" member defined. + * Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). + * All attribute names use camelCase. + * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based + * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method) + */ + var Scroll = function(el, attributes, duration, method) { + if (el) { // dont break existing subclasses not using YAHOO.extend + Scroll.superclass.constructor.call(this, el, attributes, duration, method); + } + }; + + Scroll.NAME = 'Scroll'; + + // shorthand + var Y = YAHOO.util; + YAHOO.extend(Scroll, Y.ColorAnim); + + var superclass = Scroll.superclass; + var proto = Scroll.prototype; + + proto.doMethod = function(attr, start, end) { + var val = null; + + if (attr == 'scroll') { + val = [ + this.method(this.currentFrame, start[0], end[0] - start[0], this.totalFrames), + this.method(this.currentFrame, start[1], end[1] - start[1], this.totalFrames) + ]; + + } else { + val = superclass.doMethod.call(this, attr, start, end); + } + return val; + }; + + proto.getAttribute = function(attr) { + var val = null; + var el = this.getEl(); + + if (attr == 'scroll') { + val = [ el.scrollLeft, el.scrollTop ]; + } else { + val = superclass.getAttribute.call(this, attr); + } + + return val; + }; + + proto.setAttribute = function(attr, val, unit) { + var el = this.getEl(); + + if (attr == 'scroll') { + el.scrollLeft = val[0]; + el.scrollTop = val[1]; + } else { + superclass.setAttribute.call(this, attr, val, unit); + } + }; + + Y.Scroll = Scroll; +})(); +YAHOO.register("animation", YAHOO.util.Anim, {version: "2.7.0", build: "1799"}); diff --git a/public/css/yui/build/assets/skins/sam/ajax-loader.gif b/public/css/yui/build/assets/skins/sam/ajax-loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..fe2cd23b3a3c017ae6acfd291135a998e2f8ee74 GIT binary patch literal 3208 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 C|Ftdv literal 0 HcmV?d00001 diff --git a/public/css/yui/build/assets/skins/sam/asc.gif b/public/css/yui/build/assets/skins/sam/asc.gif new file mode 100644 index 0000000000000000000000000000000000000000..a1fe7385d5ac940629233f0dc4bbd61f20959c3b GIT binary patch literal 177 zcmZ?wbhEHbU}|FG@8_44nAqLjosyCg9vmZ){{V zVZwy=_I7V?@1UTd{Jgy0-d;-!i@3Nr8*A&jy1Ge|CjI~ap8*F@{K>+|z#z_`1Cj^X z$-t`jKsD}w@w|)+IvTGc!Y=lCF}Yu=Q8eH=%k0e0mLc1=fuZY=!y%64o~d4Qx%?Cv FtO0P~GlKvC literal 0 HcmV?d00001 diff --git a/public/css/yui/build/assets/skins/sam/autocomplete.css b/public/css/yui/build/assets/skins/sam/autocomplete.css new file mode 100644 index 000000000..ad029b5d4 --- /dev/null +++ b/public/css/yui/build/assets/skins/sam/autocomplete.css @@ -0,0 +1,7 @@ +/* +Copyright (c) 2009, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.7.0 +*/ +.yui-skin-sam .yui-ac{position:relative;font-family:arial;font-size:100%;}.yui-skin-sam .yui-ac-input{position:absolute;width:100%;}.yui-skin-sam .yui-ac-container{position:absolute;top:1.6em;width:100%;}.yui-skin-sam .yui-ac-content{position:absolute;width:100%;border:1px solid #808080;background:#fff;overflow:hidden;z-index:9050;}.yui-skin-sam .yui-ac-shadow{position:absolute;margin:.3em;width:100%;background:#000;-moz-opacity:.10;opacity:.10;filter:alpha(opacity=10);z-index:9049;}.yui-skin-sam .yui-ac iframe{opacity:0;filter:alpha(opacity=0);padding-right:.3em;padding-bottom:.3em;}.yui-skin-sam .yui-ac-content ul{margin:0;padding:0;width:100%;}.yui-skin-sam .yui-ac-content li{margin:0;padding:2px 5px;cursor:default;white-space:nowrap;list-style:none;zoom:1;}.yui-skin-sam .yui-ac-content li.yui-ac-prehighlight{background:#B3D4FF;}.yui-skin-sam .yui-ac-content li.yui-ac-highlight{background:#426FD9;color:#FFF;} diff --git a/public/css/yui/build/assets/skins/sam/bg-h.gif b/public/css/yui/build/assets/skins/sam/bg-h.gif new file mode 100644 index 0000000000000000000000000000000000000000..996288916e82bf2972bb4b8097f1b4a0869955d2 GIT binary patch literal 212 zcmV;_04x7TNk%w1VbK5_0HOu};o;%Q$;qdur-_M)x3{;~*Vq65{{R30A^8LW000I6 zEC2ui0MP&(000A-Xu90~Fv>}*y*TU5yZ>M)j$~<`XsWJk>%MR-&vb3yc&_h!@BhG{ za7Zi~kI1BQ$!t1BgQ#>$ty-_xtai)odcWYXI4gJ*&gisy&2GEj@VIs;jK6uCK7M Ova__cwzs%A2>?48g>Yp6 literal 0 HcmV?d00001 diff --git a/public/css/yui/build/assets/skins/sam/bg-v.gif b/public/css/yui/build/assets/skins/sam/bg-v.gif new file mode 100644 index 0000000000000000000000000000000000000000..8e287cd52222c75c8f921cfdd4b4ae02b783c0e4 GIT binary patch literal 481 zcmV<70UrKGNk%w1VI%+9?F_4V!T?c3Yi)6>)G>FKw(x2LD4*Voto|Nj60 z00000000000000000000A^8LW000R9EC2ui03-n5000F4Fv&@)y*TU5yZ>M)1%db# z2qKu>ks2)LB5`naUe$Rb%^?jF5?t^_yflh-^g;Ix9iB^kPjarXfkzSKvm137eG4lFF3Kmd=>a zn$n!qo;kDDqu96FtKO~LyW+j%zvjW{!|KKC$L`7S%ks_i&-T&y)B4r?*Pu#pof4P| zTr7Xv0HRt$kfFg^2){)Pr?BA>i=iIons~6H#(^J>3vz_$apcC5C`(}s7}B9hkS|51 zeAV(|&5SW!&diq6W>1_uyZvN2bfM3n002t}0{{R350Hx300004XF*Lt007q5 z)K6G40000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUzfKW_SMepzL z*?5)vnXr^-@mq~v#Is<_TJv!tH9IQe$@Xx30Dl4m?CIp{=H9&7-_qpj z@$&Na_V>}=-P_s8t;X5r<>9oxu=V))t;fI5&dBfV=di}q&Ctl)z^}#1!s6l2^YQNR z_4fPy{pIZK+vn}2t)%$)_toO#;n%^Nt);HK#<#b(?d|Q^-PrN-^x)*+!OF_W$Hdm! z)7aL|?e6dH@9^Q?*SNj5^z`$uytMfH`|DE_v7Q^$@+uYl) zwyn<6!SC?!+19@4>g)FN@VIM;P5=N05J^NqRCwC#*lSzbSQiFhNFotI4oL6_;vuC{b=qK$I+Xz#Vv+gl@7g<|P-q!D?T7b6AA7YNE^pUbd+%Us zvHiGMY?dFDpVm+7|H0xQ7NY(A7RQyM(T<>!bm{vn3=x8=(rL;Q{SFI3)s8?qX$u8u zH@N?3nH4ckx}#Azn*N_G4oMxo<@6I6%H5fJK~aq=_stfD8jQ*iH3XfEFQlfX+!}Qx ze4~YjL@+!_3T(FWE&nOEIN%yOC)PU~H4MJ1yg;_~-0+z22Q16&6NVKzRfjwP1ed_zA3i zg*8U*O1&IMRBp?=xVZQmEHTY-U$r_!L!g-&bz+X`4t(d)WtnwhDFsip&8{Fwn?C$Y-BAJXOA#XK`_RhKI zdKm{RiY;3Snxy>@I2z;yA7(lgGa&E3x|;RV@bB*M9w! z+hA1ns)v#B*^{x*P0SkNT`$lbbO1 zME0ERVyeQj0n}Jv{oq}t;(WYbiBc-f4zs z%YX#}iTOaK;&}X+uf*nSwGJ!E(%mmvP#Eld++;eN$nw9l&R$elfpTnqJ`jt=_)zHh zEEWjIGmI!o&9${JSS8e?pJ6B}4r^%JRure>NuS5FsBIQf4$MD%o3GdOr9Z`r)$Fow z_7)3VDR7fVlvd3Kp3iKn%Jc0jXMc6DrhK_F|4%-@l8@I9{bf-Uea+=ztJ|c9(jI1G zjt{S#Wi`}ip(Oz5kGJ*uO1}QgL#nr|KKb+-)^Zv0xdlz4EyieCK9N;l&1@?$nkRkI zSpY%x{7TzHPCj@rJzbDxabu|&{B_W>aAuQjDtG_l{MF3NbN(t6a;hq(proTr9lj3V zFq0r5Yr-dqvS?jj9=41o8G*_@Oz2l1W@es%^_*o@Cx4b`zeP~{jbE9ZeqdyJV#4Q> zcK=@cLS3bf(PX@q&t4#FW;+xLIh6BCDV)h*M_W5O-6I^ zL?8rB&V;tNuN?bn1f}hMwYen95?IsymMq;u*q~)LN$27Z%ZlT}hgTuT?)!Qs9B$j` zgJRKfeJYExuV7lxqE&?1e{`%aFGmI}i`gU@j)%|Al&f{!0waQoXeKxtSzcSc=lJLY zYXVg^ZH!*rXx>|0jYJ~1;VRVWv$_`xBA>}7|7fET?R99Lt{%b>#H8%gO_B=Uv2 zEZr;OVLH8+?g$J?!XH~++cT_UbLr`l3|9xAPn1NT3|sX&7z{>cA%k_9O)_L-@4W|< zR;$G@Dz;|L6tAUISrR2!1W~qb$W})LQ?s{UYyQtI+$4M+`FW=0_tP{y=53kUUc{s# zj)J%$iGRI26*pvgbU}c}Bv|dpn337yda&vH^B^dlvL7Yi z@mSG(V{GAdZNNf>0fr$@qv3(QOWMNm!`ZQ3CJP5+#k*3l*t}Kjy}A=0vY@brM-Tu) zpX+wmyQJ-?{;c0BBEdO{9*y-|@c|18>k#HI2%TyNO^>vt!|h)Na{HGz1Fvj_hb{D5 zJ%*wsV*087z%uTCq5yIDOd+dU>g5^AA;fan9>~#P zUFIDp*E^prm1K-f+YNrkz>AFelrhp8wtB(G0M676;-~cnG0H;6K!E*vgTNlL6VXu? z+HC^fZvPTp7aBxoqy?Xu1lqCx9<&{!C2rKcXsJrvG#yNhy03)|QoT{41~uw_oBM|R k{QsPv*4L~bm;VVc0HT!-jb!e$TmS$707*qoM6N<$g7zKgCjbBd literal 0 HcmV?d00001 diff --git a/public/css/yui/build/assets/skins/sam/button.css b/public/css/yui/build/assets/skins/sam/button.css new file mode 100644 index 000000000..cdac306a0 --- /dev/null +++ b/public/css/yui/build/assets/skins/sam/button.css @@ -0,0 +1,7 @@ +/* +Copyright (c) 2009, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.7.0 +*/ +.yui-button{display:-moz-inline-box;display:inline-block;vertical-align:text-bottom;}.yui-button .first-child{display:block;*display:inline-block;}.yui-button button,.yui-button a{display:block;*display:inline-block;border:none;margin:0;}.yui-button button{background-color:transparent;*overflow:visible;cursor:pointer;}.yui-button a{text-decoration:none;}.yui-skin-sam .yui-button{border-width:1px 0;border-style:solid;border-color:#808080;background:url(sprite.png) repeat-x 0 0;margin:auto .25em;}.yui-skin-sam .yui-button .first-child{border-width:0 1px;border-style:solid;border-color:#808080;margin:0 -1px;_margin:0;}.yui-skin-sam .yui-button button,.yui-skin-sam .yui-button a{padding:0 10px;font-size:93%;line-height:2;*line-height:1.7;min-height:2em;*min-height:auto;color:#000;}.yui-skin-sam .yui-button a{*line-height:1.875;*padding-bottom:1px;}.yui-skin-sam .yui-split-button button,.yui-skin-sam .yui-menu-button button{padding-right:20px;background-position:right center;background-repeat:no-repeat;}.yui-skin-sam .yui-menu-button button{background-image:url(menu-button-arrow.png);}.yui-skin-sam .yui-split-button button{background-image:url(split-button-arrow.png);}.yui-skin-sam .yui-button-focus{border-color:#7D98B8;background-position:0 -1300px;}.yui-skin-sam .yui-button-focus .first-child{border-color:#7D98B8;}.yui-skin-sam .yui-button-focus button,.yui-skin-sam .yui-button-focus a{color:#000;}.yui-skin-sam .yui-split-button-focus button{background-image:url(split-button-arrow-focus.png);}.yui-skin-sam .yui-button-hover{border-color:#7D98B8;background-position:0 -1300px;}.yui-skin-sam .yui-button-hover .first-child{border-color:#7D98B8;}.yui-skin-sam .yui-button-hover button,.yui-skin-sam .yui-button-hover a{color:#000;}.yui-skin-sam .yui-split-button-hover button{background-image:url(split-button-arrow-hover.png);}.yui-skin-sam .yui-button-active{border-color:#7D98B8;background-position:0 -1700px;}.yui-skin-sam .yui-button-active .first-child{border-color:#7D98B8;}.yui-skin-sam .yui-button-active button,.yui-skin-sam .yui-button-active a{color:#000;}.yui-skin-sam .yui-split-button-activeoption{border-color:#808080;background-position:0 0;}.yui-skin-sam .yui-split-button-activeoption .first-child{border-color:#808080;}.yui-skin-sam .yui-split-button-activeoption button{background-image:url(split-button-arrow-active.png);}.yui-skin-sam .yui-radio-button-checked,.yui-skin-sam .yui-checkbox-button-checked{border-color:#304369;background-position:0 -1400px;}.yui-skin-sam .yui-radio-button-checked .first-child,.yui-skin-sam .yui-checkbox-button-checked .first-child{border-color:#304369;}.yui-skin-sam .yui-radio-button-checked button,.yui-skin-sam .yui-checkbox-button-checked button{color:#fff;}.yui-skin-sam .yui-button-disabled{border-color:#ccc;background-position:0 -1500px;}.yui-skin-sam .yui-button-disabled .first-child{border-color:#ccc;}.yui-skin-sam .yui-button-disabled button,.yui-skin-sam .yui-button-disabled a{color:#A6A6A6;cursor:default;}.yui-skin-sam .yui-menu-button-disabled button{background-image:url(menu-button-arrow-disabled.png);}.yui-skin-sam .yui-split-button-disabled button{background-image:url(split-button-arrow-disabled.png);} diff --git a/public/css/yui/build/assets/skins/sam/calendar.css b/public/css/yui/build/assets/skins/sam/calendar.css new file mode 100644 index 000000000..f2a9c0e42 --- /dev/null +++ b/public/css/yui/build/assets/skins/sam/calendar.css @@ -0,0 +1,8 @@ +/* +Copyright (c) 2009, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.7.0 +*/ +.yui-calcontainer{position:relative;float:left;_overflow:hidden;}.yui-calcontainer iframe{position:absolute;border:none;margin:0;padding:0;z-index:0;width:100%;height:100%;left:0;top:0;}.yui-calcontainer iframe.fixedsize{width:50em;height:50em;top:-1px;left:-1px;}.yui-calcontainer.multi .groupcal{z-index:1;float:left;position:relative;}.yui-calcontainer .title{position:relative;z-index:1;}.yui-calcontainer .close-icon{position:absolute;z-index:1;text-indent:-10000em;overflow:hidden;}.yui-calendar{position:relative;}.yui-calendar .calnavleft{position:absolute;z-index:1;text-indent:-10000em;overflow:hidden;}.yui-calendar .calnavright{position:absolute;z-index:1;text-indent:-10000em;overflow:hidden;}.yui-calendar .calheader{position:relative;width:100%;text-align:center;}.yui-calcontainer .yui-cal-nav-mask{position:absolute;z-index:2;margin:0;padding:0;width:100%;height:100%;_width:0;_height:0;left:0;top:0;display:none;}.yui-calcontainer .yui-cal-nav{position:absolute;z-index:3;top:0;display:none;}.yui-calcontainer .yui-cal-nav .yui-cal-nav-btn{display:-moz-inline-box;display:inline-block;}.yui-calcontainer .yui-cal-nav .yui-cal-nav-btn button{display:block;*display:inline-block;*overflow:visible;border:none;background-color:transparent;cursor:pointer;}.yui-calendar .calbody a:hover{background:inherit;}p#clear{clear:left;padding-top:10px;}.yui-skin-sam .yui-calcontainer{background-color:#f2f2f2;border:1px solid #808080;padding:10px;}.yui-skin-sam .yui-calcontainer.multi{padding:0 5px 0 5px;}.yui-skin-sam .yui-calcontainer.multi .groupcal{background-color:transparent;border:none;padding:10px 5px 10px 5px;margin:0;}.yui-skin-sam .yui-calcontainer .title{background:url(sprite.png) repeat-x 0 0;border-bottom:1px solid #ccc;font:100% sans-serif;color:#000;font-weight:bold;height:auto;padding:.4em;margin:0 -10px 10px -10px;top:0;left:0;text-align:left;}.yui-skin-sam .yui-calcontainer.multi .title{margin:0 -5px 0 -5px;}.yui-skin-sam .yui-calcontainer.withtitle{padding-top:0;}.yui-skin-sam .yui-calcontainer .calclose{background:url(sprite.png) no-repeat 0 -300px;width:25px;height:15px;top:.4em;right:.4em;cursor:pointer;}.yui-skin-sam .yui-calendar{border-spacing:0;border-collapse:collapse;font:100% sans-serif;text-align:center;margin:0;}.yui-skin-sam .yui-calendar .calhead{background:transparent;border:none;vertical-align:middle;padding:0;}.yui-skin-sam .yui-calendar .calheader{background:transparent;font-weight:bold;padding:0 0 .6em 0;text-align:center;}.yui-skin-sam .yui-calendar .calheader img{border:none;}.yui-skin-sam .yui-calendar .calnavleft{background:url(sprite.png) no-repeat 0 -450px;width:25px;height:15px;top:0;bottom:0;left:-10px;margin-left:.4em;cursor:pointer;}.yui-skin-sam .yui-calendar .calnavright{background:url(sprite.png) no-repeat 0 -500px;width:25px;height:15px;top:0;bottom:0;right:-10px;margin-right:.4em;cursor:pointer;}.yui-skin-sam .yui-calendar .calweekdayrow{height:2em;}.yui-skin-sam .yui-calendar .calweekdayrow th{padding:0;border:none;}.yui-skin-sam .yui-calendar .calweekdaycell{color:#000;font-weight:bold;text-align:center;width:2em;}.yui-skin-sam .yui-calendar .calfoot{background-color:#f2f2f2;}.yui-skin-sam .yui-calendar .calrowhead,.yui-skin-sam .yui-calendar .calrowfoot{color:#a6a6a6;font-size:85%;font-style:normal;font-weight:normal;border:none;}.yui-skin-sam .yui-calendar .calrowhead{text-align:right;padding:0 2px 0 0;}.yui-skin-sam .yui-calendar .calrowfoot{text-align:left;padding:0 0 0 2px;}.yui-skin-sam .yui-calendar td.calcell{border:1px solid #ccc;background:#fff;padding:1px;height:1.6em;line-height:1.6em;text-align:center;white-space:nowrap;}.yui-skin-sam .yui-calendar td.calcell a{color:#06c;display:block;height:100%;text-decoration:none;}.yui-skin-sam .yui-calendar td.calcell.today{background-color:#000;}.yui-skin-sam .yui-calendar td.calcell.today a{background-color:#fff;}.yui-skin-sam .yui-calendar td.calcell.oom{background-color:#ccc;color:#a6a6a6;cursor:default;}.yui-skin-sam .yui-calendar td.calcell.selected{background-color:#fff;color:#000;}.yui-skin-sam .yui-calendar td.calcell.selected a{background-color:#b3d4ff;color:#000;}.yui-skin-sam .yui-calendar td.calcell.calcellhover{background-color:#426fd9;color:#fff;cursor:pointer;}.yui-skin-sam .yui-calendar td.calcell.calcellhover a{background-color:#426fd9;color:#fff;}.yui-skin-sam .yui-calendar td.calcell.previous{color:#e0e0e0;}.yui-skin-sam .yui-calendar td.calcell.restricted{text-decoration:line-through;}.yui-skin-sam .yui-calendar td.calcell.highlight1{background-color:#cf9;}.yui-skin-sam .yui-calendar td.calcell.highlight2{background-color:#9cf;}.yui-skin-sam .yui-calendar td.calcell.highlight3{background-color:#fcc;}.yui-skin-sam .yui-calendar td.calcell.highlight4{background-color:#cf9;}.yui-skin-sam .yui-calendar a.calnav{border:1px solid #f2f2f2;padding:0 4px;text-decoration:none;color:#000;zoom:1;}.yui-skin-sam .yui-calendar a.calnav:hover{background:url(sprite.png) repeat-x 0 0;border-color:#A0A0A0;cursor:pointer;}.yui-skin-sam .yui-calcontainer .yui-cal-nav-mask{background-color:#000;opacity:.25;filter:alpha(opacity=25);}.yui-skin-sam .yui-calcontainer .yui-cal-nav{font-family:arial,helvetica,clean,sans-serif;font-size:93%;border:1px solid #808080;left:50%;margin-left:-7em;width:14em;padding:0;top:2.5em;background-color:#f2f2f2;}.yui-skin-sam .yui-calcontainer.withtitle .yui-cal-nav{top:4.5em;}.yui-skin-sam .yui-calcontainer.multi .yui-cal-nav{width:16em;margin-left:-8em;}.yui-skin-sam .yui-calcontainer .yui-cal-nav-y,.yui-skin-sam .yui-calcontainer .yui-cal-nav-m,.yui-skin-sam .yui-calcontainer .yui-cal-nav-b{padding:5px 10px 5px 10px;}.yui-skin-sam .yui-calcontainer .yui-cal-nav-b{text-align:center;}.yui-skin-sam .yui-calcontainer .yui-cal-nav-e{margin-top:5px;padding:5px;background-color:#EDF5FF;border-top:1px solid black;display:none;}.yui-skin-sam .yui-calcontainer .yui-cal-nav label{display:block;font-weight:bold;} +.yui-skin-sam .yui-calcontainer .yui-cal-nav-mc{width:100%;_width:auto;}.yui-skin-sam .yui-calcontainer .yui-cal-nav-y input.yui-invalid{background-color:#FFEE69;border:1px solid #000;}.yui-skin-sam .yui-calcontainer .yui-cal-nav-yc{width:4em;}.yui-skin-sam .yui-calcontainer .yui-cal-nav .yui-cal-nav-btn{border:1px solid #808080;background:url(sprite.png) repeat-x 0 0;background-color:#ccc;margin:auto .15em;}.yui-skin-sam .yui-calcontainer .yui-cal-nav .yui-cal-nav-btn button{padding:0 8px;font-size:93%;line-height:2;*line-height:1.7;min-height:2em;*min-height:auto;color:#000;}.yui-skin-sam .yui-calcontainer .yui-cal-nav .yui-cal-nav-btn.yui-default{border:1px solid #304369;background-color:#426fd9;background:url(sprite.png) repeat-x 0 -1400px;}.yui-skin-sam .yui-calcontainer .yui-cal-nav .yui-cal-nav-btn.yui-default button{color:#fff;} diff --git a/public/css/yui/build/assets/skins/sam/carousel.css b/public/css/yui/build/assets/skins/sam/carousel.css new file mode 100644 index 000000000..7cf687488 --- /dev/null +++ b/public/css/yui/build/assets/skins/sam/carousel.css @@ -0,0 +1,7 @@ +/* +Copyright (c) 2009, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.7.0 +*/ +.yui-carousel{visibility:hidden;overflow:hidden;position:relative;text-align:left;zoom:1;}.yui-carousel.yui-carousel-visible{visibility:visible;}.yui-carousel-content{overflow:hidden;position:relative;}.yui-carousel-element{margin:5px 0;overflow:hidden;padding:0;position:relative;width:32000px;z-index:1;}.yui-carousel-vertical .yui-carousel-element{margin:0 5px;}.yui-carousel-element li{border:1px solid #ccc;float:left;list-style:none;margin:1px;overflow:hidden;padding:0;text-align:center;*float:none;*display:inline-block;*zoom:1;*display:inline;}.yui-carousel .yui-carousel-item-selected{border:1px dashed #000;margin:1px;}.yui-carousel-vertical{height:32000px;margin:0 5px;width:auto;}.yui-carousel-vertical .yui-carousel-element li{display:block;float:none;}.yui-log .carousel{background:#f2e886;}.yui-carousel-nav{zoom:1;}.yui-carousel-nav:after{clear:both;content:"";display:block;}.yui-carousel-button-focus{outline:1px dotted #000;}.yui-carousel-min-width .yui-carousel-content{margin:0 auto;}.yui-skin-sam .yui-carousel,.yui-skin-sam .yui-carousel-vertical{border:1px solid #808080;}.yui-skin-sam .yui-carousel-nav{background:url(sprite.png) repeat-x 0 0;padding:3px;text-align:right;}.yui-skin-sam .yui-carousel-button{background:url(sprite.png) no-repeat 0 -600px;float:right;height:19px;margin:5px;overflow:hidden;width:40px;}.yui-skin-sam .yui-carousel-vertical .yui-carousel-button{background-position:0 -800px;}.yui-skin-sam .yui-carousel-button-disabled{background-position:0 -2000px;}.yui-skin-sam .yui-carousel-vertical .yui-carousel-button-disabled{background-position:0 -2100px;}.yui-skin-sam .yui-carousel-button input,.yui-skin-sam .yui-carousel-button button{background-color:transparent;border:0;cursor:pointer;display:block;height:44px;margin:-2px 0 0 -2px;padding:0 0 0 50px;}.yui-skin-sam span.yui-carousel-first-button{background-position:0 -550px;margin-left:-100px;margin-right:50px;*margin:5px 5px 5px -90px;}.yui-skin-sam .yui-carousel-vertical span.yui-carousel-first-button{background-position:0 -750px;}.yui-skin-sam span.yui-carousel-first-button-disabled{background-position:0 -1950px;}.yui-skin-sam .yui-carousel-vertical span.yui-carousel-first-button-disabled{background-position:0 -2050px;}.yui-skin-sam .yui-carousel-nav ul{float:right;height:19px;margin:0;margin-left:-220px;margin-right:100px;*margin-left:-160px;*margin-right:0;padding:0;}.yui-skin-sam .yui-carousel-min-width .yui-carousel-nav ul{*margin-left:-170px;}.yui-skin-sam .yui-carousel-nav select{position:relative;*right:50px;top:4px;}.yui-skin-sam .yui-carousel-vertical .yui-carousel-nav ul,.yui-skin-sam .yui-carousel-vertical .yui-carousel-nav select{float:none;margin:0;*zoom:1;}.yui-skin-sam .yui-carousel-nav ul li{background:url(sprite.png) no-repeat 0 -650px;cursor:pointer;float:left;height:9px;list-style:none;margin:10px 0 0 5px;overflow:hidden;padding:0;width:9px;}.yui-skin-sam .yui-carousel-nav ul:after{clear:both;content:"";display:block;}.yui-skin-sam .yui-carousel-nav ul li a{left:-10000px;position:absolute;}.yui-skin-sam .yui-carousel-nav ul li.yui-carousel-nav-page-focus{outline:1px dotted #000;}.yui-skin-sam .yui-carousel-nav ul li.yui-carousel-nav-page-selected{background-position:0 -700px;}.yui-skin-sam .yui-carousel-item-loading{background:url(ajax-loader.gif) no-repeat 50% 50%;position:relative;text-indent:-150px;} diff --git a/public/css/yui/build/assets/skins/sam/colorpicker.css b/public/css/yui/build/assets/skins/sam/colorpicker.css new file mode 100644 index 000000000..6d9ff2b36 --- /dev/null +++ b/public/css/yui/build/assets/skins/sam/colorpicker.css @@ -0,0 +1,7 @@ +/* +Copyright (c) 2009, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.7.0 +*/ +.yui-picker-panel{background:#e3e3e3;border-color:#888;}.yui-picker-panel .hd{background-color:#ccc;font-size:100%;line-height:100%;border:1px solid #e3e3e3;font-weight:bold;overflow:hidden;padding:6px;color:#000;}.yui-picker-panel .bd{background:#e8e8e8;margin:1px;height:200px;}.yui-picker-panel .ft{background:#e8e8e8;margin:1px;padding:1px;}.yui-picker{position:relative;}.yui-picker-hue-thumb{cursor:default;width:18px;height:18px;top:-8px;left:-2px;z-index:9;position:absolute;}.yui-picker-hue-bg{-moz-outline:none;outline:0 none;position:absolute;left:200px;height:183px;width:14px;background:url(hue_bg.png) no-repeat;top:4px;}.yui-picker-bg{-moz-outline:none;outline:0 none;position:absolute;top:4px;left:4px;height:182px;width:182px;background-color:#F00;background-image:url(picker_mask.png);}*html .yui-picker-bg{background-image:none;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='../../build/colorpicker/assets/picker_mask.png',sizingMethod='scale');}.yui-picker-mask{position:absolute;z-index:1;top:0;left:0;}.yui-picker-thumb{cursor:default;width:11px;height:11px;z-index:9;position:absolute;top:-4px;left:-4px;}.yui-picker-swatch{position:absolute;left:240px;top:4px;height:60px;width:55px;border:1px solid #888;}.yui-picker-websafe-swatch{position:absolute;left:304px;top:4px;height:24px;width:24px;border:1px solid #888;}.yui-picker-controls{position:absolute;top:72px;left:226px;font:1em monospace;}.yui-picker-controls .hd{background:transparent;border-width:0!important;}.yui-picker-controls .bd{height:100px;border-width:0!important;}.yui-picker-controls ul{float:left;padding:0 2px 0 0;margin:0;}.yui-picker-controls li{padding:2px;list-style:none;margin:0;}.yui-picker-controls input{font-size:.85em;width:2.4em;}.yui-picker-hex-controls{clear:both;padding:2px;}.yui-picker-hex-controls input{width:4.6em;}.yui-picker-controls a{font:1em arial,helvetica,clean,sans-serif;display:block;*display:inline-block;padding:0;color:#000;} diff --git a/public/css/yui/build/assets/skins/sam/container.css b/public/css/yui/build/assets/skins/sam/container.css new file mode 100644 index 000000000..4c8125552 --- /dev/null +++ b/public/css/yui/build/assets/skins/sam/container.css @@ -0,0 +1,7 @@ +/* +Copyright (c) 2009, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.7.0 +*/ +.yui-overlay,.yui-panel-container{visibility:hidden;position:absolute;z-index:2;}.yui-panel{position:relative;}.yui-panel-container form{margin:0;}.mask{z-index:1;display:none;position:absolute;top:0;left:0;right:0;bottom:0;}.mask.block-scrollbars{overflow:auto;}.masked select,.drag select,.hide-select select{_visibility:hidden;}.yui-panel-container select{_visibility:inherit;}.hide-scrollbars,.hide-scrollbars *{overflow:hidden;}.hide-scrollbars select{display:none;}.show-scrollbars{overflow:auto;}.yui-panel-container.show-scrollbars,.yui-tt.show-scrollbars{overflow:visible;}.yui-panel-container.show-scrollbars .underlay,.yui-tt.show-scrollbars .yui-tt-shadow{overflow:auto;}.yui-panel-container.shadow .underlay.yui-force-redraw{padding-bottom:1px;}.yui-effect-fade .underlay,.yui-effect-fade .yui-tt-shadow{display:none;}.yui-tt-shadow{position:absolute;}.yui-override-padding{padding:0!important;}.yui-panel-container .container-close{overflow:hidden;text-indent:-10000em;text-decoration:none;}.yui-overlay.yui-force-redraw,.yui-panel-container.yui-force-redraw{margin-bottom:1px;}.yui-skin-sam .mask{background-color:#000;opacity:.25;filter:alpha(opacity=25);}.yui-skin-sam .yui-panel-container{padding:0 1px;*padding:2px;}.yui-skin-sam .yui-panel{position:relative;left:0;top:0;border-style:solid;border-width:1px 0;border-color:#808080;z-index:1;*border-width:1px;*zoom:1;_zoom:normal;}.yui-skin-sam .yui-panel .hd,.yui-skin-sam .yui-panel .bd,.yui-skin-sam .yui-panel .ft{border-style:solid;border-width:0 1px;border-color:#808080;margin:0 -1px;*margin:0;*border:0;}.yui-skin-sam .yui-panel .hd{border-bottom:solid 1px #ccc;}.yui-skin-sam .yui-panel .bd,.yui-skin-sam .yui-panel .ft{background-color:#F2F2F2;}.yui-skin-sam .yui-panel .hd{padding:0 10px;font-size:93%;line-height:2;*line-height:1.9;font-weight:bold;color:#000;background:url(sprite.png) repeat-x 0 -200px;}.yui-skin-sam .yui-panel .bd{padding:10px;}.yui-skin-sam .yui-panel .ft{border-top:solid 1px #808080;padding:5px 10px;font-size:77%;}.yui-skin-sam .container-close{position:absolute;top:5px;right:6px;width:25px;height:15px;background:url(sprite.png) no-repeat 0 -300px;cursor:pointer;}.yui-skin-sam .yui-panel-container .underlay{right:-1px;left:-1px;}.yui-skin-sam .yui-panel-container.matte{padding:9px 10px;background-color:#fff;}.yui-skin-sam .yui-panel-container.shadow{_padding:2px 4px 0 2px;}.yui-skin-sam .yui-panel-container.shadow .underlay{position:absolute;top:2px;left:-3px;right:-3px;bottom:-3px;*top:4px;*left:-1px;*right:-1px;*bottom:-1px;_top:0;_left:0;_right:0;_bottom:0;_margin-top:3px;_margin-left:-1px;background-color:#000;opacity:.12;filter:alpha(opacity=12);}.yui-skin-sam .yui-dialog .ft{border-top:none;padding:0 10px 10px 10px;font-size:100%;}.yui-skin-sam .yui-dialog .ft .button-group{display:block;text-align:right;}.yui-skin-sam .yui-dialog .ft button.default{font-weight:bold;}.yui-skin-sam .yui-dialog .ft span.default{border-color:#304369;background-position:0 -1400px;}.yui-skin-sam .yui-dialog .ft span.default .first-child{border-color:#304369;}.yui-skin-sam .yui-dialog .ft span.default button{color:#fff;}.yui-skin-sam .yui-dialog .ft span.yui-button-disabled{background-position:0 -1500px;border-color:#ccc;}.yui-skin-sam .yui-dialog .ft span.yui-button-disabled .first-child{border-color:#ccc;}.yui-skin-sam .yui-dialog .ft span.yui-button-disabled button{color:#a6a6a6;}.yui-skin-sam .yui-simple-dialog .bd .yui-icon{background:url(sprite.png) no-repeat 0 0;width:16px;height:16px;margin-right:10px;float:left;}.yui-skin-sam .yui-simple-dialog .bd span.blckicon{background-position:0 -1100px;}.yui-skin-sam .yui-simple-dialog .bd span.alrticon{background-position:0 -1050px;}.yui-skin-sam .yui-simple-dialog .bd span.hlpicon{background-position:0 -1150px;}.yui-skin-sam .yui-simple-dialog .bd span.infoicon{background-position:0 -1200px;}.yui-skin-sam .yui-simple-dialog .bd span.warnicon{background-position:0 -1900px;}.yui-skin-sam .yui-simple-dialog .bd span.tipicon{background-position:0 -1250px;}.yui-skin-sam .yui-tt .bd{position:relative;top:0;left:0;z-index:1;color:#000;padding:2px 5px;border-color:#D4C237 #A6982B #A6982B #A6982B;border-width:1px;border-style:solid;background-color:#FFEE69;}.yui-skin-sam .yui-tt.show-scrollbars .bd{overflow:auto;}.yui-skin-sam .yui-tt-shadow{top:2px;right:-3px;left:-3px;bottom:-3px;background-color:#000;}.yui-skin-sam .yui-tt-shadow-visible{opacity:.12;filter:alpha(opacity=12);} diff --git a/public/css/yui/build/assets/skins/sam/datatable.css b/public/css/yui/build/assets/skins/sam/datatable.css new file mode 100644 index 000000000..307606154 --- /dev/null +++ b/public/css/yui/build/assets/skins/sam/datatable.css @@ -0,0 +1,8 @@ +/* +Copyright (c) 2009, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.7.0 +*/ +.yui-skin-sam .yui-dt-mask{position:absolute;z-index:9500;}.yui-dt-tmp{position:absolute;left:-9000px;}.yui-dt-scrollable .yui-dt-bd{overflow:auto;}.yui-dt-scrollable .yui-dt-hd{overflow:hidden;position:relative;}.yui-dt-scrollable .yui-dt-bd thead tr,.yui-dt-scrollable .yui-dt-bd thead th{position:absolute;left:-1500px;}.yui-dt-scrollable tbody{-moz-outline:none;}.yui-skin-sam thead .yui-dt-sortable{cursor:pointer;}.yui-skin-sam thead .yui-dt-draggable{cursor:move;}.yui-dt-coltarget{position:absolute;z-index:999;}.yui-dt-hd{zoom:1;}th.yui-dt-resizeable .yui-dt-resizerliner{position:relative;}.yui-dt-resizer{position:absolute;right:0;bottom:0;height:100%;cursor:e-resize;cursor:col-resize;background-color:#CCC;opacity:0;filter:alpha(opacity=0);}.yui-dt-resizerproxy{visibility:hidden;position:absolute;z-index:9000;background-color:#CCC;opacity:0;filter:alpha(opacity=0);}th.yui-dt-hidden .yui-dt-liner,td.yui-dt-hidden .yui-dt-liner,th.yui-dt-hidden .yui-dt-resizer{display:none;}.yui-dt-editor{position:absolute;z-index:9000;}.yui-skin-sam .yui-dt table{margin:0;padding:0;font-family:arial;font-size:inherit;border-collapse:separate;*border-collapse:collapse;border-spacing:0;border:1px solid #7F7F7F;}.yui-skin-sam .yui-dt thead{border-spacing:0;}.yui-skin-sam .yui-dt caption{color:#000;font-size:85%;font-weight:normal;font-style:italic;line-height:1;padding:1em 0;text-align:center;}.yui-skin-sam .yui-dt th{background:#D8D8DA url(sprite.png) repeat-x 0 0;}.yui-skin-sam .yui-dt th,.yui-skin-sam .yui-dt th a{font-weight:normal;text-decoration:none;color:#000;vertical-align:bottom;}.yui-skin-sam .yui-dt th{margin:0;padding:0;border:none;border-right:1px solid #CBCBCB;}.yui-skin-sam .yui-dt tr.yui-dt-first td{border-top:1px solid #7F7F7F;}.yui-skin-sam .yui-dt th .yui-dt-liner{white-space:nowrap;}.yui-skin-sam .yui-dt-liner{margin:0;padding:0;padding:4px 10px 4px 10px;}.yui-skin-sam .yui-dt-coltarget{width:5px;background-color:red;}.yui-skin-sam .yui-dt td{margin:0;padding:0;border:none;border-right:1px solid #CBCBCB;text-align:left;}.yui-skin-sam .yui-dt-list td{border-right:none;}.yui-skin-sam .yui-dt-resizer{width:6px;}.yui-skin-sam .yui-dt-mask{background-color:#000;opacity:.25;filter:alpha(opacity=25);}.yui-skin-sam .yui-dt-message{background-color:#FFF;}.yui-skin-sam .yui-dt-scrollable table{border:none;}.yui-skin-sam .yui-dt-scrollable .yui-dt-hd{border-left:1px solid #7F7F7F;border-top:1px solid #7F7F7F;border-right:1px solid #7F7F7F;}.yui-skin-sam .yui-dt-scrollable .yui-dt-bd{border-left:1px solid #7F7F7F;border-bottom:1px solid #7F7F7F;border-right:1px solid #7F7F7F;background-color:#FFF;}.yui-skin-sam .yui-dt-scrollable .yui-dt-data tr.yui-dt-last td{border-bottom:1px solid #7F7F7F;}.yui-skin-sam th.yui-dt-asc,.yui-skin-sam th.yui-dt-desc{background:url(sprite.png) repeat-x 0 -100px;}.yui-skin-sam th.yui-dt-sortable .yui-dt-label{margin-right:10px;}.yui-skin-sam th.yui-dt-asc .yui-dt-liner{background:url(dt-arrow-up.png) no-repeat right;}.yui-skin-sam th.yui-dt-desc .yui-dt-liner{background:url(dt-arrow-dn.png) no-repeat right;}tbody .yui-dt-editable{cursor:pointer;}.yui-dt-editor{text-align:left;background-color:#F2F2F2;border:1px solid #808080;padding:6px;}.yui-dt-editor label{padding-left:4px;padding-right:6px;}.yui-dt-editor .yui-dt-button{padding-top:6px;text-align:right;}.yui-dt-editor .yui-dt-button button{background:url(sprite.png) repeat-x 0 0;border:1px solid #999;width:4em;height:1.8em;margin-left:6px;}.yui-dt-editor .yui-dt-button button.yui-dt-default{background:url(sprite.png) repeat-x 0 -1400px;background-color:#5584E0;border:1px solid #304369;color:#FFF;}.yui-dt-editor .yui-dt-button button:hover{background:url(sprite.png) repeat-x 0 -1300px;color:#000;}.yui-dt-editor .yui-dt-button button:active{background:url(sprite.png) repeat-x 0 -1700px;color:#000;}.yui-skin-sam tr.yui-dt-even{background-color:#FFF;}.yui-skin-sam tr.yui-dt-odd{background-color:#EDF5FF;}.yui-skin-sam tr.yui-dt-even td.yui-dt-asc,.yui-skin-sam tr.yui-dt-even td.yui-dt-desc{background-color:#EDF5FF;}.yui-skin-sam tr.yui-dt-odd td.yui-dt-asc,.yui-skin-sam tr.yui-dt-odd td.yui-dt-desc{background-color:#DBEAFF;}.yui-skin-sam .yui-dt-list tr.yui-dt-even{background-color:#FFF;}.yui-skin-sam .yui-dt-list tr.yui-dt-odd{background-color:#FFF;}.yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-asc,.yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-desc{background-color:#EDF5FF;}.yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-asc,.yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-desc{background-color:#EDF5FF;}.yui-skin-sam th.yui-dt-highlighted,.yui-skin-sam th.yui-dt-highlighted a{background-color:#B2D2FF;}.yui-skin-sam tr.yui-dt-highlighted,.yui-skin-sam tr.yui-dt-highlighted td.yui-dt-asc,.yui-skin-sam tr.yui-dt-highlighted td.yui-dt-desc,.yui-skin-sam tr.yui-dt-even td.yui-dt-highlighted,.yui-skin-sam tr.yui-dt-odd td.yui-dt-highlighted{cursor:pointer;background-color:#B2D2FF;}.yui-skin-sam .yui-dt-list th.yui-dt-highlighted,.yui-skin-sam .yui-dt-list th.yui-dt-highlighted a{background-color:#B2D2FF;}.yui-skin-sam .yui-dt-list tr.yui-dt-highlighted,.yui-skin-sam .yui-dt-list tr.yui-dt-highlighted td.yui-dt-asc,.yui-skin-sam .yui-dt-list tr.yui-dt-highlighted td.yui-dt-desc,.yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-highlighted,.yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-highlighted{cursor:pointer;background-color:#B2D2FF;}.yui-skin-sam th.yui-dt-selected,.yui-skin-sam th.yui-dt-selected a{background-color:#446CD7;}.yui-skin-sam tr.yui-dt-selected td,.yui-skin-sam tr.yui-dt-selected td.yui-dt-asc,.yui-skin-sam tr.yui-dt-selected td.yui-dt-desc{background-color:#426FD9;color:#FFF;}.yui-skin-sam tr.yui-dt-even td.yui-dt-selected,.yui-skin-sam tr.yui-dt-odd td.yui-dt-selected{background-color:#446CD7;color:#FFF;}.yui-skin-sam .yui-dt-list th.yui-dt-selected,.yui-skin-sam .yui-dt-list th.yui-dt-selected a{background-color:#446CD7;} +.yui-skin-sam .yui-dt-list tr.yui-dt-selected td,.yui-skin-sam .yui-dt-list tr.yui-dt-selected td.yui-dt-asc,.yui-skin-sam .yui-dt-list tr.yui-dt-selected td.yui-dt-desc{background-color:#426FD9;color:#FFF;}.yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-selected,.yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-selected{background-color:#446CD7;color:#FFF;}.yui-skin-sam .yui-dt-paginator{display:block;margin:6px 0;white-space:nowrap;}.yui-skin-sam .yui-dt-paginator .yui-dt-first,.yui-skin-sam .yui-dt-paginator .yui-dt-last,.yui-skin-sam .yui-dt-paginator .yui-dt-selected{padding:2px 6px;}.yui-skin-sam .yui-dt-paginator a.yui-dt-first,.yui-skin-sam .yui-dt-paginator a.yui-dt-last{text-decoration:none;}.yui-skin-sam .yui-dt-paginator .yui-dt-previous,.yui-skin-sam .yui-dt-paginator .yui-dt-next{display:none;}.yui-skin-sam a.yui-dt-page{border:1px solid #CBCBCB;padding:2px 6px;text-decoration:none;background-color:#fff;}.yui-skin-sam .yui-dt-selected{border:1px solid #fff;background-color:#fff;} diff --git a/public/css/yui/build/assets/skins/sam/desc.gif b/public/css/yui/build/assets/skins/sam/desc.gif new file mode 100644 index 0000000000000000000000000000000000000000..c114f290c8ba1ff4173e129b1ef7e4f3f5e2bb5d GIT binary patch literal 177 zcmZ?wbhEHbU}|FG@8_44nAqLjosyCg9vmZ){{V zVZwy=_I7V?@1UTd{Jgy0-d;-!i@3Nr8*A&jy1Ge|CjI~ap8*F@{K>+|z#z_`1Cj^X z$-t_&AfWe&MeGaLh@5Q0kS;d8>Ju6P(#(BMdM*5_og0L@6jvQ6(g^H!doZ(#VTvMy FH2`14Gspk{ literal 0 HcmV?d00001 diff --git a/public/css/yui/build/assets/skins/sam/dt-arrow-dn.png b/public/css/yui/build/assets/skins/sam/dt-arrow-dn.png new file mode 100644 index 0000000000000000000000000000000000000000..85fda0bbca21cefc6b8cf1726bc83e43bff993c4 GIT binary patch literal 116 zcmeAS@N?(olHy`uVBq!ia0vp@K+M9#3?wzWV%32ZXMj(L>;M1%fy~Ir2;r~IJAo|5 zk|4ie28U-i(tsREPZ!6Kid)Guq>ddput17Y#X`7&C779+nL(zFDdZjVkv^az22WQ% Jmvv4FO#tWt9i9LH literal 0 HcmV?d00001 diff --git a/public/css/yui/build/assets/skins/sam/dt-arrow-up.png b/public/css/yui/build/assets/skins/sam/dt-arrow-up.png new file mode 100644 index 0000000000000000000000000000000000000000..1c674316aed41943dae79b01583956db63c8be08 GIT binary patch literal 116 zcmeAS@N?(olHy`uVBq!ia0vp@K+M9#3?wzWV%32ZXMj(L>;M1%fy}VT__niwAVJ2G zAirP+hi5m^fE-Cr7srr_TgeGo2?+@gd>DjQ2|6TYNiZ`ri2h~@(drDS1}b9kboFyt I=akR{0KC>mi#>Q#WroDds`uzFx3^1VhlZBCift5iABmh#&!0aEf z>&{2rQ#+d!lrGr5WpF;$+r>U-p%#pf7j6C(;=#aR4FLK*IpF{R literal 0 HcmV?d00001 diff --git a/public/css/yui/build/assets/skins/sam/editor-sprite-active.gif b/public/css/yui/build/assets/skins/sam/editor-sprite-active.gif new file mode 100644 index 0000000000000000000000000000000000000000..3e9d4200b3e6b124354f12d6c5f90513587315d1 GIT binary patch literal 5614 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 RDPx!cToE9&k%xf2{{!Lm*)sqD literal 0 HcmV?d00001 diff --git a/public/css/yui/build/assets/skins/sam/editor-sprite.gif b/public/css/yui/build/assets/skins/sam/editor-sprite.gif new file mode 100644 index 0000000000000000000000000000000000000000..02042fa1474cd62d7de63588ae536f5495d45be2 GIT binary patch literal 5690 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 literal 0 HcmV?d00001 diff --git a/public/css/yui/build/assets/skins/sam/editor.css b/public/css/yui/build/assets/skins/sam/editor.css new file mode 100644 index 000000000..5fe778cb7 --- /dev/null +++ b/public/css/yui/build/assets/skins/sam/editor.css @@ -0,0 +1,10 @@ +/* +Copyright (c) 2009, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.7.0 +*/ +.yui-busy{cursor:wait!important;}.yui-toolbar-container fieldset,.yui-editor-container fieldset{padding:0;margin:0;border:0;}.yui-toolbar-container legend{display:none;}.yui-toolbar-container .yui-toolbar-subcont{padding:.25em 0;zoom:1;}.yui-toolbar-container-collapsed .yui-toolbar-subcont{display:none;}.yui-toolbar-container .yui-toolbar-subcont:after{display:block;clear:both;visibility:hidden;content:'.';height:0;}.yui-toolbar-container span.yui-toolbar-draghandle{cursor:move;border-left:1px solid #999;border-right:1px solid #999;overflow:hidden;text-indent:77777px;width:2px;height:20px;display:block;clear:none;float:left;margin:0 0 0 .2em;}.yui-toolbar-container .yui-toolbar-titlebar.draggable{cursor:move;}.yui-toolbar-container .yui-toolbar-titlebar{position:relative;}.yui-toolbar-container .yui-toolbar-titlebar h2{font-weight:bold;letter-spacing:0;border:none;color:#000;margin:0;padding:.2em;}.yui-toolbar-container .yui-toolbar-titlebar h2 a{text-decoration:none;color:#000;cursor:default;}.yui-toolbar-container.yui-toolbar-grouped span.yui-toolbar-draghandle{height:40px;}.yui-toolbar-container .yui-toolbar-group{float:left;margin-right:.5em;zoom:1;}.yui-toolbar-container .yui-toolbar-group:after{display:block;clear:both;visibility:hidden;content:'.';height:0;}.yui-toolbar-container .yui-toolbar-group h3{font-size:75%;padding:0 0 0 .25em;margin:0;}.yui-toolbar-container span.yui-toolbar-separator{width:2px;padding:0;height:18px;margin:.2em 0 .2em .1em;display:none;float:left;}.yui-toolbar-container.yui-toolbar-grouped span.yui-toolbar-separator{height:45px;*height:50px;}.yui-toolbar-container.yui-toolbar-grouped .yui-toolbar-group span.yui-toolbar-separator{height:18px;display:block;}.yui-toolbar-container ul li{margin:0;padding:0;list-style-type:none;}.yui-toolbar-container .yui-toolbar-nogrouplabels h3{display:none;}.yui-toolbar-container .yui-push-button,.yui-toolbar-container .yui-color-button,.yui-toolbar-container .yui-menu-button{position:relative;cursor:pointer;}.yui-toolbar-container .yui-button .first-child,.yui-toolbar-container .yui-button .first-child a{height:100%;width:100%;overflow:hidden;font-size:0;}.yui-toolbar-container .yui-button-disabled{cursor:default;}.yui-toolbar-container .yui-button-disabled .yui-toolbar-icon{opacity:.5;filter:alpha(opacity=50);}.yui-toolbar-container .yui-button-disabled .up,.yui-toolbar-container .yui-button-disabled .down{opacity:.5;filter:alpha(opacity=50);}.yui-toolbar-container .yui-button a{overflow:hidden;}.yui-toolbar-container .yui-toolbar-select .first-child a{cursor:pointer;}.yui-toolbar-fontname-arial{font-family:Arial;}.yui-toolbar-fontname-arial-black{font-family:Arial Black;}.yui-toolbar-fontname-comic-sans-ms{font-family:Comic Sans MS;}.yui-toolbar-fontname-courier-new{font-family:Courier New;}.yui-toolbar-fontname-times-new-roman{font-family:Times New Roman;}.yui-toolbar-fontname-verdana{font-family:Verdana;}.yui-toolbar-fontname-impact{font-family:Impact;}.yui-toolbar-fontname-lucida-console{font-family:Lucida Console;}.yui-toolbar-fontname-tahoma{font-family:Tahoma;}.yui-toolbar-fontname-trebuchet-ms{font-family:Trebuchet MS;}.yui-toolbar-container .yui-toolbar-spinbutton{position:relative;}.yui-toolbar-container .yui-toolbar-spinbutton .first-child a{z-index:0;opacity:1;}.yui-toolbar-container .yui-toolbar-spinbutton a.up,.yui-toolbar-container .yui-toolbar-spinbutton a.down{position:absolute;display:block right:0;cursor:pointer;z-index:1;padding:0;margin:0;}.yui-toolbar-container .yui-overlay{position:absolute;}.yui-toolbar-container .yui-overlay ul li{margin:0;list-style-type:none;}.yui-toolbar-container{z-index:1;}.yui-editor-container .yui-editor-editable-container{position:relative;z-index:0;width:100%;}.yui-editor-container .yui-editor-masked{background-color:#CCC;height:100%;width:100%;position:absolute;top:0;left:0;opacity:.5;filter:alpha(opacity=50);}.yui-editor-container iframe{border:0;padding:0;margin:0;zoom:1;display:block;}.yui-editor-container .yui-editor-editable{padding:0;margin:0;}.yui-editor-container .dompath{font-size:85%;}.yui-editor-panel .hd{text-align:left;position:relative;}.yui-editor-panel .hd h3{font-weight:bold;padding:.25em 0 .25em .25em;margin:0;}.yui-editor-panel .bd{width:100%;zoom:1;position:relative;}.yui-editor-panel .bd div.yui-editor-body-cont{padding:.25em .1em;zoom:1;}.yui-editor-panel .bd .gecko form{overflow:auto;}.yui-editor-panel .bd div.yui-editor-body-cont:after{display:block;clear:both;visibility:hidden;content:'.';height:0;}.yui-editor-panel .ft{text-align:right;width:99%;float:left;clear:both;}.yui-editor-panel .ft span.tip{display:block;position:relative;padding:.5em .5em .5em 23px;text-align:left;zoom:1;}.yui-editor-panel label{clear:both;float:left;padding:0;width:100%;text-align:left;zoom:1;}.yui-editor-panel .gecko label{overflow:auto;}.yui-editor-panel label strong{float:left;width:6em;}.yui-editor-panel .removeLink{width:80%;text-align:right;}.yui-editor-panel label input{margin-left:.25em;float:left;}.yui-editor-panel .yui-toolbar-group{margin-bottom:.75em;}.yui-editor-panel .height-width{float:left;}.yui-editor-panel .height-width span{font-style:italic;display:block;float:left;overflow:visible;}.yui-editor-panel .height-width span.info{font-size:70%;margin-top:3px;}.yui-editor-panel .yui-toolbar-bordersize,.yui-editor-panel .yui-toolbar-bordertype{font-size:75%;}.yui-editor-panel .yui-toolbar-container span.yui-toolbar-separator{border:none;}.yui-editor-panel .yui-toolbar-bordersize span a span,.yui-editor-panel .yui-toolbar-bordertype span a span{display:block;height:8px;left:4px;position:absolute;top:3px;_top:-5px;width:24px;text-indent:52px;font-size:0;}.yui-editor-panel .yui-toolbar-bordertype span a span.yui-toolbar-bordertype-solid{border-bottom:1px solid black;}.yui-editor-panel .yui-toolbar-bordertype span a span.yui-toolbar-bordertype-dotted{border-bottom:1px dotted black;}.yui-editor-panel .yui-toolbar-bordertype span a span.yui-toolbar-bordertype-dashed{border-bottom:1px dashed black;} +.yui-editor-panel .yui-toolbar-bordersize span a span.yui-toolbar-bordersize-0{*top:0;text-indent:0;font-size:75%;}.yui-editor-panel .yui-toolbar-bordersize span a span.yui-toolbar-bordersize-1{border-bottom:1px solid black;}.yui-editor-panel .yui-toolbar-bordersize span a span.yui-toolbar-bordersize-2{border-bottom:2px solid black;}.yui-editor-panel .yui-toolbar-bordersize span a span.yui-toolbar-bordersize-3{top:2px;*top:-5px;border-bottom:3px solid black;}.yui-editor-panel .yui-toolbar-bordersize span a span.yui-toolbar-bordersize-4{top:1px;*top:-5px;border-bottom:4px solid black;}.yui-editor-panel .yui-toolbar-bordersize span a span.yui-toolbar-bordersize-5{top:1px;*top:-5px;border-bottom:5px solid black;}.yui-toolbar-container .yui-toolbar-bordersize-menu,.yui-toolbar-container .yui-toolbar-bordertype-menu{width:95px!important;}.yui-toolbar-bordersize-menu .yuimenuitemlabel,.yui-toolbar-bordertype-menu .yuimenuitemlabel,.yui-toolbar-bordersize-menu .yuimenuitemlabel,.yui-toolbar-bordertype-menu .yuimenuitemlabel:hover{margin:0 3px 7px 17px;}.yui-toolbar-bordersize-menu .yuimenuitemlabel .checkedindicator,.yui-toolbar-bordertype-menu .yuimenuitemlabel .checkedindicator{position:absolute;left:-12px;*top:14px;*left:0;}.yui-toolbar-bordersize-menu li.yui-toolbar-bordersize-1 a{border-bottom:1px solid black;height:14px;}.yui-toolbar-bordersize-menu li.yui-toolbar-bordersize-2 a{border-bottom:2px solid black;height:14px;}.yui-toolbar-bordersize-menu li.yui-toolbar-bordersize-3 a{border-bottom:3px solid black;height:14px;}.yui-toolbar-bordersize-menu li.yui-toolbar-bordersize-4 a{border-bottom:4px solid black;height:14px;}.yui-toolbar-bordersize-menu li.yui-toolbar-bordersize-5 a{border-bottom:5px solid black;height:14px;}.yui-toolbar-bordertype-menu li.yui-toolbar-bordertype-solid a{border-bottom:1px solid black;height:14px;}.yui-toolbar-bordertype-menu li.yui-toolbar-bordertype-dashed a{border-bottom:1px dashed black;height:14px;}.yui-toolbar-bordertype-menu li.yui-toolbar-bordertype-dotted a{border-bottom:1px dotted black;height:14px;}h2.yui-editor-skipheader,h3.yui-editor-skipheader{height:0;margin:0;padding:0;border:none;width:0;overflow:hidden;position:absolute;}.yui-toolbar-colors{width:133px;zoom:1;display:none;z-index:100;overflow:hidden;}.yui-toolbar-colors:after{display:block;clear:both;visibility:hidden;content:'.';height:0;}.yui-toolbar-colors a{height:9px;width:9px;float:left;display:block;overflow:hidden;text-indent:999px;margin:0;cursor:pointer;border:1px solid #F6F7EE;}.yui-toolbar-colors a:hover{border:1px solid black;}.yui-color-button-menu{overflow:visible;background-color:transparent;}.yui-toolbar-colors span{position:relative;display:block;padding:3px;overflow:hidden;float:left;width:100%;zoom:1;}.yui-toolbar-colors span:after{display:block;clear:both;visibility:hidden;content:'.';height:0;}.yui-toolbar-colors span em{height:35px;width:30px;float:left;display:block;overflow:hidden;text-indent:999px;margin:.75px;border:1px solid black;}.yui-toolbar-colors span strong{font-weight:normal;padding-left:3px;display:block;font-size:85%;float:left;width:65%;}.yui-toolbar-group-undoredo h3,.yui-toolbar-group-insertitem h3,.yui-toolbar-group-indentlist h3{width:68px;}.yui-toolbar-group-indentlist2 h3{width:122px;}.yui-toolbar-group-alignment h3{width:130px;}.yui-skin-sam .yui-editor-container{border:1px solid #808080;}.yui-skin-sam .yui-toolbar-container{zoom:1;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-titlebar{background:url(sprite.png) repeat-x 0 -200px;position:relative;}.yui-skin-sam .yui-editor-container .draggable .yui-toolbar-titlebar{cursor:move;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-titlebar h2{color:#000;font-weight:bold;margin:0;padding:.3em 1em;font-size:100%;text-align:left;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-group h3{color:#808080;font-size:75%;margin:1em 0 0;padding-bottom:0;padding-left:.25em;text-align:left;}.yui-toolbar-container span.yui-toolbar-separator{border:none;text-indent:33px;overflow:hidden;margin:0 .25em;}.yui-skin-sam .yui-toolbar-container{background-color:#F2F2F2;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-subcont{padding:0 1em .35em;border-bottom:1px solid #808080;}.yui-skin-sam .yui-toolbar-container-collapsed .yui-toolbar-titlebar{border-bottom:1px solid #808080;}.yui-skin-sam .yui-editor-container .visible .yui-menu-shadow,.yui-skin-sam .yui-editor-panel .visible .yui-menu-shadow{display:none;}.yui-skin-sam .yui-editor-container ul{list-style-type:none;margin:0;padding:0;}.yui-skin-sam .yui-editor-container ul li{list-style-type:none;margin:0;padding:0;}.yui-skin-sam .yui-toolbar-group ul li.yui-toolbar-groupitem{float:left;}.yui-skin-sam .yui-editor-container .dompath{background-color:#F2F2F2;border-top:1px solid #808080;color:#999;text-align:left;padding:.25em;}.yui-skin-sam .yui-toolbar-container .collapse{background:url(sprite.png) no-repeat 0 -400px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-titlebar span.collapse{cursor:pointer;position:absolute;top:4px;right:2px;display:block;overflow:hidden;height:15px;width:15px;text-indent:9999px;}.yui-skin-sam .yui-toolbar-container .yui-push-button,.yui-skin-sam .yui-toolbar-container .yui-color-button,.yui-skin-sam .yui-toolbar-container .yui-menu-button{background:url(sprite.png) repeat-x 0 0;position:relative;display:block;height:22px;width:30px;_font-size:0;margin:0;border-color:#808080;color:#f2f2f2;border-style:solid;border-width:1px 0;zoom:1;}.yui-skin-sam .yui-toolbar-container .yui-push-button a,.yui-skin-sam .yui-toolbar-container .yui-color-button a,.yui-skin-sam .yui-toolbar-container .yui-menu-button a{padding-left:35px;height:20px;text-decoration:none;font-size:0;line-height:2;display:block;color:#000;overflow:hidden;white-space:nowrap;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-spinbutton a,.yui-skin-sam .yui-toolbar-container .yui-toolbar-select a{font-size:12px;} +.yui-skin-sam .yui-toolbar-container .yui-push-button .first-child,.yui-skin-sam .yui-toolbar-container .yui-color-button .first-child,.yui-skin-sam .yui-toolbar-container .yui-menu-button .first-child{border-color:#808080;border-style:solid;border-width:0 1px;margin:0 -1px;display:block;position:relative;}.yui-skin-sam .yui-toolbar-container .yui-push-button-disabled .first-child,.yui-skin-sam .yui-toolbar-container .yui-color-button-disabled .first-child,.yui-skin-sam .yui-toolbar-container .yui-menu-button-disabled .first-child{border-color:#ccc;}.yui-skin-sam .yui-toolbar-container .yui-push-button-disabled a,.yui-skin-sam .yui-toolbar-container .yui-color-button-disabled a,.yui-skin-sam .yui-toolbar-container .yui-menu-button-disabled a{color:#A6A6A6;cursor:default;}.yui-skin-sam .yui-toolbar-container .yui-push-button-disabled,.yui-skin-sam .yui-toolbar-container .yui-color-button-disabled,.yui-skin-sam .yui-toolbar-container .yui-menu-button-disabled{border-color:#ccc;}.yui-skin-sam .yui-toolbar-container .yui-button .first-child{*left:0;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-fontname{width:135px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-heading{width:92px;}.yui-skin-sam .yui-toolbar-container .yui-button-hover{background:url(sprite.png) repeat-x 0 -1300px;border-color:#808080;}.yui-skin-sam .yui-toolbar-container .yui-button-selected{background:url(sprite.png) repeat-x 0 -1700px;border-color:#808080;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-nogrouplabels h3{display:none;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-nogrouplabels .yui-toolbar-group{margin-top:.75em;}.yui-skin-sam .yui-toolbar-container .yui-push-button span.yui-toolbar-icon,.yui-skin-sam .yui-toolbar-container .yui-color-button span.yui-toolbar-icon,.yui-skin-sam .yui-toolbar-container .yui-menu-button span.yui-toolbar-icon{display:block;position:absolute;top:2px;height:18px;width:18px;overflow:hidden;background:url(editor-sprite.gif) no-repeat 30px 30px;}.yui-skin-sam .yui-toolbar-container .yui-button-selected span.yui-toolbar-icon,.yui-skin-sam .yui-toolbar-container .yui-button-hover span.yui-toolbar-icon{background-image:url(editor-sprite-active.gif);}.yui-skin-sam .yui-toolbar-container .visible .yuimenuitemlabel{cursor:pointer;color:#000;*position:relative;}.yui-skin-sam .yui-toolbar-container .yui-button-menu{background-color:#fff;}.yui-skin-sam .yui-toolbar-container .yui-button-menu .yui-menu-body-scrolled{position:relative;}.yui-skin-sam div.yuimenu li.selected{background-color:#B3D4FF;}.yui-skin-sam div.yuimenu li.selected a.selected{color:#000;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-bold span.yui-toolbar-icon{background-position:0 0;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-strikethrough span.yui-toolbar-icon{background-position:0 -108px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-italic span.yui-toolbar-icon{background-position:0 -36px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-undo span.yui-toolbar-icon{background-position:0 -1326px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-redo span.yui-toolbar-icon{background-position:0 -1355px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-underline span.yui-toolbar-icon{background-position:0 -72px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-subscript span.yui-toolbar-icon{background-position:0 -180px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-superscript span.yui-toolbar-icon{background-position:0 -144px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-forecolor span.yui-toolbar-icon{background-position:0 -216px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-backcolor span.yui-toolbar-icon{background-position:0 -288px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-justifyleft span.yui-toolbar-icon{background-position:0 -324px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-justifycenter span.yui-toolbar-icon{background-position:0 -360px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-justifyright span.yui-toolbar-icon{background-position:0 -396px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-justifyfull span.yui-toolbar-icon{background-position:0 -432px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-indent span.yui-toolbar-icon{background-position:0 -720px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-outdent span.yui-toolbar-icon{background-position:0 -684px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-createlink span.yui-toolbar-icon{background-position:0 -792px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-insertimage span.yui-toolbar-icon{background-position:1px -756px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-left span.yui-toolbar-icon{background-position:0 -972px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-right span.yui-toolbar-icon{background-position:0 -936px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-inline span.yui-toolbar-icon{background-position:0 -900px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-block span.yui-toolbar-icon{background-position:0 -864px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-bordercolor span.yui-toolbar-icon{background-position:0 -252px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-removeformat span.yui-toolbar-icon{background-position:0 -1080px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-hiddenelements span.yui-toolbar-icon{background-position:0 -1044px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-insertunorderedlist span.yui-toolbar-icon{background-position:0 -468px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-insertorderedlist span.yui-toolbar-icon{background-position:0 -504px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-spinbutton,.yui-skin-sam .yui-toolbar-container .yui-toolbar-spinbutton .first-child{width:35px;} +.yui-skin-sam .yui-toolbar-container .yui-toolbar-spinbutton .first-child a{padding-left:2px;text-align:left;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-spinbutton span.yui-toolbar-icon{display:none;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-spinbutton a.up,.yui-skin-sam .yui-toolbar-container .yui-toolbar-spinbutton a.down{right:2px;background:url(editor-sprite.gif) no-repeat 0 -1222px;overflow:hidden;height:6px;width:7px;min-height:0;padding:0;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-spinbutton a.up{top:2px;background-position:0 -1222px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-spinbutton a.down{bottom:2px;background-position:0 -1187px;}.yui-skin-sam .yui-toolbar-container select{height:22px;border:1px solid #808080;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-select .first-child a{padding-left:5px;text-align:left;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-select span.yui-toolbar-icon{background:url(editor-sprite.gif) no-repeat 0 -1144px;overflow:hidden;right:-2px;top:0;height:20px;}.yui-skin-sam .yui-editor-panel .yui-color-button-menu .bd{background-color:transparent;border:none;width:135px;}.yui-skin-sam .yui-color-button-menu .yui-toolbar-colors{border:1px solid #808080;}.yui-skin-sam .yui-editor-panel{padding:0;margin:0;border:none;background-color:transparent;overflow:visible;position:absolute;}.yui-skin-sam .yui-editor-panel .hd{margin:10px 0 0;padding:0;border:none;}.yui-skin-sam .yui-editor-panel .hd h3{color:#000;border:1px solid #808080;background:url(sprite.png) repeat-x 0 -200px;width:99%;position:relative;margin:0;padding:3px 0 0 0;font-size:93%;text-indent:5px;height:20px;}.yui-skin-sam .yui-editor-panel .bd{background-color:#F2F2F2;border-left:1px solid #808080;border-right:1px solid #808080;width:99%;margin:0;padding:0;overflow:visible;}.yui-skin-sam .yui-editor-panel ul{list-style-type:none;margin:0;padding:0;}.yui-skin-sam .yui-editor-panel ul li{margin:0;padding:0;}.yui-skin-sam .yui-editor-panel .yui-toolbar-container .yui-toolbar-subcont{padding:0;border:none;margin-top:.35em;}.yui-skin-sam .yui-editor-panel .yui-toolbar-bordersize,.yui-skin-sam .yui-editor-panel .yui-toolbar-bordertype{width:50px;}.yui-skin-sam .yui-editor-panel label{display:block;float:none;padding:4px 0;margin-bottom:7px;}.yui-skin-sam .yui-editor-panel label strong{font-weight:normal;font-size:93%;text-align:right;padding-top:2px;}.yui-skin-sam .yui-editor-panel label input{width:75%;}.yui-skin-sam .yui-editor-panel .createlink_target,.yui-skin-sam .yui-editor-panel .insertimage_target{width:auto;margin-right:5px;}.yui-skin-sam .yui-editor-panel .removeLink{width:98%;}.yui-skin-sam .yui-editor-panel label input.warning{background-color:#FFEE69;}.yui-skin-sam .yui-editor-panel .yui-toolbar-group h3{color:#000;float:left;font-weight:normal;font-size:93%;margin:5px 0 0 0;padding:0 3px 0 0;text-align:right;}.yui-skin-sam .yui-editor-panel .height-width h3{margin:3px 0 0 10px;}.yui-skin-sam .yui-editor-panel .height-width{margin:3px 0 0 35px;*margin-left:14px;width:42%;*width:44%;}.yui-skin-sam .yui-editor-panel .yui-toolbar-group-border{width:190px;}.yui-skin-sam .yui-editor-panel .no-button .yui-toolbar-group-border{width:210px;}.yui-skin-sam .yui-editor-panel .yui-toolbar-group-padding{width:203px;_width:198px;}.yui-skin-sam .yui-editor-panel .no-button .yui-toolbar-group-padding{width:172px;}.yui-skin-sam .yui-editor-panel .yui-toolbar-group-padding h3{margin-left:25px;*margin-left:12px;}.yui-skin-sam .yui-editor-panel .yui-toolbar-group-textflow{width:182px;}.yui-skin-sam .yui-editor-panel .hd{background:none;}.yui-skin-sam .yui-editor-panel .ft{background-color:#F2F2F2;border:1px solid #808080;border-top:none;padding:0;margin:0 0 2px 0;}.yui-skin-sam .yui-editor-panel .hd span.close{background:url(sprite.png) no-repeat 0 -300px;cursor:pointer;display:block;height:16px;overflow:hidden;position:absolute;right:5px;text-indent:500px;top:2px;width:26px;}.yui-skin-sam .yui-editor-panel .ft span.tip{background-color:#EDF5FF;border-top:1px solid #808080;font-size:85%;}.yui-skin-sam .yui-editor-panel .ft span.tip strong{display:block;float:left;margin:0 2px 8px 0;}.yui-skin-sam .yui-editor-panel .ft span.tip span.icon{background:url(editor-sprite.gif) no-repeat 0 -1260px;display:block;height:20px;left:2px;position:absolute;top:8px;width:20px;}.yui-skin-sam .yui-editor-panel .ft span.tip span.icon-info{background-position:2px -1260px;}.yui-skin-sam .yui-editor-panel .ft span.tip span.icon-warn{background-position:2px -1296px;}.yui-skin-sam .yui-editor-panel .hd span.knob{position:absolute;height:10px;width:28px;top:-10px;left:25px;text-indent:9999px;overflow:hidden;background:url(editor-knob.gif) no-repeat 0 0;}.yui-skin-sam .yui-editor-panel .yui-toolbar-container{float:left;width:100%;background-image:none;border:none;}.yui-skin-sam .yui-editor-panel .yui-toolbar-container .bd{background-color:#fff;}.yui-editor-blankimage{background-image:url(blankimage.png);}.yui-skin-sam .yui-editor-container .yui-resize-handle-br{height:11px;width:11px;background-position:-20px -60px;background-color:transparent;} diff --git a/public/css/yui/build/assets/skins/sam/header_background.png b/public/css/yui/build/assets/skins/sam/header_background.png new file mode 100644 index 0000000000000000000000000000000000000000..3ef7909d3ed04956a06c5d9017076ea30e0ced27 GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^j6kf+!2~3434ebKq$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~-c6*+jiIEGZ*s_F9NI$*%V9Q*UX`TlF!Ldi}q7dA02yr`^X zu-PrN{%75tzwegsKk4J*;_R|w)xBe%IT`Nt9oJ`MW0-m*yz~E_s%D^B44$rjF6*2U FngH9xIDh~E literal 0 HcmV?d00001 diff --git a/public/css/yui/build/assets/skins/sam/hue_bg.png b/public/css/yui/build/assets/skins/sam/hue_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..d9bcdeb5c49910d5c32c9ebbb134200bf138b7b4 GIT binary patch literal 1120 zcmWkuZA?>V6h6*nD|EKy_G>T#efd;-TcIEZRG=3KG$^eF2Q{FAMV4*KY}f{qh`QSV zerz}DmTbC_Y|fEr#w0P0=t#CW_qsTZ+oCcxM!nmzgkYx0y)F9Qv+IxZJb6w|&dGC5 zaz;Z<^@~z7QUPF5prJObvq_J$hJ`xXo5wcl^n8zhtsmg}%|C)|K3%8x)wT6C_ipWb zw=>oa{%CJkw=1x%v!^@U-5DL&ajAP1z;mggH7#{nz-rJ$faL=7qA45La$rShQh@N! zu%sTCvXE1t{K=eCf%*<$g}~m_lTbYf%#DuhOcn)}oyL+UY!^T)N0SIlg&q}p70^Bg z#v`A*ftBD@6%H#L*N*0!pas#aR&fdVH33r!@M?%V4H}RB^=Q5i+Cy}fVbYD}B4EjH z?P{0x>Acg883%Oa|AzJ?B#N%FVmw`fKNY;g=C3&BXB;Z@Kam~dpydSE;!)KoPs+}MGZ#35TL&dgu1t8ZJCOzunMR5)=3wB`6<04>Wd>fEGNt=fUO7S z2UdorB;0d<%}W2%DB8|}rj&7Bd@G600GiIAl}DfA(T~fGjEtPSpMM-+!RdW!t0gq&tGw>1(Ck!bL+QCwfHM zFSfg6C%J1(_sXrL%2?h=Gs#tB`jY5~^n-B4=5yiEV7#4=o|0Az*Nu@}Ih_Oz$pHOG zC`&0{EO(L#V`PcEmKepS-spt1Gd{>irzEF%o|nyJB4uhF{YR*@P1evnVor$^%6<|| znF`WIVUCMc(=ZuIiR8<#kjLU}uWTnbQf7F06KORJtfO9XHgzgQe;2kI(+lL6NRM$K zObK})t}2X5(vY~u9{XN8DGugG$E0mSB^Mi(>V!GlYlD8E#--~|}G|8JkdYdiH90fD-v+HZu-d;bSJ8}W_+ literal 0 HcmV?d00001 diff --git a/public/css/yui/build/assets/skins/sam/imagecropper.css b/public/css/yui/build/assets/skins/sam/imagecropper.css new file mode 100644 index 000000000..0f1b40f91 --- /dev/null +++ b/public/css/yui/build/assets/skins/sam/imagecropper.css @@ -0,0 +1,7 @@ +/* +Copyright (c) 2009, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.7.0 +*/ +.yui-crop{position:relative;}.yui-crop .yui-crop-mask{position:absolute;top:0;left:0;height:100%;width:100%;}.yui-crop .yui-resize{position:absolute;top:10px;left:10px;border:0;}.yui-crop .yui-crop-resize-mask{position:absolute;top:0;left:0;height:100%;width:100%;background-position:-10px -10px;overflow:hidden;}.yui-skin-sam .yui-crop .yui-crop-mask{background-color:#000;opacity:.5;filter:alpha(opacity=50);}.yui-skin-sam .yui-crop .yui-resize{border:1px dashed #fff;} diff --git a/public/css/yui/build/assets/skins/sam/layout.css b/public/css/yui/build/assets/skins/sam/layout.css new file mode 100644 index 000000000..4928608a2 --- /dev/null +++ b/public/css/yui/build/assets/skins/sam/layout.css @@ -0,0 +1,7 @@ +/* +Copyright (c) 2009, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.7.0 +*/ +.yui-layout-loading{visibility:hidden;}body.yui-layout{overflow:hidden;position:relative;padding:0;margin:0;}.yui-layout-doc{position:relative;overflow:hidden;padding:0;margin:0;}.yui-layout-unit{height:50px;width:50px;padding:0;margin:0;float:none;z-index:0;}.yui-layout-unit-top{position:absolute;top:0;left:0;width:100%;}.yui-layout-unit-left{position:absolute;top:0;left:0;}.yui-layout-unit-right{position:absolute;top:0;right:0;}.yui-layout-unit-bottom{position:absolute;bottom:0;left:0;width:100%;}.yui-layout-unit-center{position:absolute;top:0;left:0;width:100%;}.yui-layout div.yui-layout-hd{position:absolute;top:0;left:0;zoom:1;width:100%;}.yui-layout div.yui-layout-bd{position:absolute;top:0;left:0;zoom:1;width:100%;}.yui-layout .yui-layout-noscroll div.yui-layout-bd{overflow:hidden;}.yui-layout .yui-layout-scroll div.yui-layout-bd{overflow:auto;}.yui-layout div.yui-layout-ft{position:absolute;bottom:0;left:0;width:100%;zoom:1;}.yui-layout .yui-layout-unit div.yui-layout-hd h2{text-align:left;}.yui-layout .yui-layout-unit div.yui-layout-hd .collapse{cursor:pointer;height:13px;position:absolute;right:2px;top:2px;width:17px;font-size:0;}.yui-layout .yui-layout-unit div.yui-layout-hd .close{cursor:pointer;height:13px;position:absolute;right:2px;top:2px;width:17px;font-size:0;}.yui-layout .yui-layout-unit div.yui-layout-hd .collapse-close{right:25px;}.yui-layout .yui-layout-clip{position:absolute;height:20px;background-color:#c0c0c0;display:none;}.yui-layout .yui-layout-clip .collapse{cursor:pointer;height:13px;position:absolute;right:2px;top:2px;width:17px;font-size:0px;}.yui-layout .yui-layout-wrap{height:100%;width:100%;position:absolute;left:0;}.yui-skin-sam .yui-layout .yui-resize-proxy{border:none;font-size:0;margin:0;padding:0;}.yui-skin-sam .yui-layout .yui-resize-resizing .yui-resize-handle{visibility:hidden;}.yui-skin-sam .yui-layout .yui-resize-proxy div{position:absolute;border:1px solid #808080;background-color:#EDF5FF;}.yui-skin-sam .yui-layout .yui-resize .yui-resize-handle-active{}.yui-skin-sam .yui-layout .yui-resize-proxy .yui-layout-handle-l{width:5px;height:100%;top:0;left:0;}.yui-skin-sam .yui-layout .yui-resize-proxy .yui-layout-handle-r{width:5px;top:0;right:0;height:100%;position:absolute;zoom:1;}.yui-skin-sam .yui-layout .yui-resize-proxy .yui-layout-handle-b{width:100%;bottom:0;left:0;height:5px;}.yui-skin-sam .yui-layout .yui-resize-proxy .yui-layout-handle-t{width:100%;top:0;left:0;height:5px;}.yui-skin-sam .yui-layout .yui-layout-unit-left div.yui-layout-hd .collapse{background:transparent url(layout_sprite.png) no-repeat -20px -160px;border:1px solid #808080;}.yui-skin-sam .yui-layout .yui-layout-clip-left .collapse{background:transparent url(layout_sprite.png) no-repeat -20px -140px;border:1px solid #808080;}.yui-skin-sam .yui-layout .yui-layout-unit-right div.yui-layout-hd .collapse{background:transparent url(layout_sprite.png) no-repeat -20px -200px;border:1px solid #808080;}.yui-skin-sam .yui-layout .yui-layout-clip-right .collapse{background:transparent url(layout_sprite.png) no-repeat -20px -120px;border:1px solid #808080;}.yui-skin-sam .yui-layout .yui-layout-unit-top div.yui-layout-hd .collapse{background:transparent url(layout_sprite.png) no-repeat -20px -220px;border:1px solid #808080;}.yui-skin-sam .yui-layout .yui-layout-clip-top .collapse{background:transparent url(layout_sprite.png) no-repeat -20px -240px;border:1px solid #808080;}.yui-skin-sam .yui-layout .yui-layout-unit-bottom div.yui-layout-hd .collapse{background:transparent url(layout_sprite.png) no-repeat -20px -260px;border:1px solid #808080;}.yui-skin-sam .yui-layout .yui-layout-clip-bottom .collapse{background:transparent url(layout_sprite.png) no-repeat -20px -180px;border:1px solid #808080;}.yui-skin-sam .yui-layout .yui-layout-unit div.yui-layout-hd .close{background:transparent url(layout_sprite.png) no-repeat -20px -100px;border:1px solid #808080;}.yui-skin-sam .yui-layout .yui-layout-hd{background:url(sprite.png) repeat-x 0 -1400px;border:1px solid #808080;}.yui-skin-sam .yui-layout{background-color:#EDF5FF;}.yui-skin-sam .yui-layout .yui-layout-unit div.yui-layout-hd h2{font-weight:bold;color:#fff;padding:3px;}.yui-skin-sam .yui-layout .yui-layout-unit div.yui-layout-bd{border:1px solid #808080;border-bottom:none;border-top:none;*border-bottom-width:0;*border-top-width:0;background-color:#f2f2f2;text-align:left;}.yui-skin-sam .yui-layout .yui-layout-unit div.yui-layout-bd-noft{border-bottom:1px solid #808080;}.yui-skin-sam .yui-layout .yui-layout-unit div.yui-layout-bd-nohd{border-top:1px solid #808080;}.yui-skin-sam .yui-layout .yui-layout-clip{position:absolute;height:20px;background-color:#EDF5FF;display:none;border:1px solid #808080;}.yui-skin-sam .yui-layout div.yui-layout-ft{border:1px solid #808080;border-top:none;*border-top-width:0;background-color:#f2f2f2;}.yui-skin-sam .yui-layout-unit .yui-resize-handle{background-color:transparent;}.yui-skin-sam .yui-layout-unit .yui-resize-handle-r{right:0;top:0;background-image:none;}.yui-skin-sam .yui-layout-unit .yui-resize-handle-l{left:0;top:0;background-image:none;}.yui-skin-sam .yui-layout-unit .yui-resize-handle-b{right:0;bottom:0;background-image:none;}.yui-skin-sam .yui-layout-unit .yui-resize-handle-t{right:0;top:0;background-image:none;}.yui-skin-sam .yui-layout-unit .yui-resize-handle-r .yui-layout-resize-knob,.yui-skin-sam .yui-layout-unit .yui-resize-handle-l .yui-layout-resize-knob{position:absolute;height:16px;width:6px;top:45%;left:0px;background:transparent url(layout_sprite.png) no-repeat 0 -5px;}.yui-skin-sam .yui-layout-unit .yui-resize-handle-t .yui-layout-resize-knob,.yui-skin-sam .yui-layout-unit .yui-resize-handle-b .yui-layout-resize-knob{position:absolute;height:6px;width:16px;left:45%;background:transparent url(layout_sprite.png) no-repeat -20px 0;} diff --git a/public/css/yui/build/assets/skins/sam/layout_sprite.png b/public/css/yui/build/assets/skins/sam/layout_sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..d6fce3c7a5bec2e266531e2b921f6a3bc3572bcb GIT binary patch literal 1409 zcmV-{1%CR8P)Foc7fVkN9ZLH|iPzfUuN*G~E00Ia|@iPD+ScV@e5BCj%&595~Az9JYb1HE%fJ|lvg&G4W z6xqeu5wao}vOGw#oOoq zdC>F%1Q0?EEY*Rd3zq4SGax3LA2VLCrA$0(SkZGRe)Txn3^>fhp`Mk2G^wZ|DoEi^P%kHvUUm}of|3c`UUt&-f|52O4U_0*PV)UriM_~rMM%_(97pUF zgq4T@9=!koXf2}^3PBhQEBt~NN?sh$J8ydbXFQt)$8tiP<$_ov{Q4FXyL>Z8Y{z2V zkaSb@Mp@4L)cu~!F2?_5njt5??aV6VWbNsf=#lQ+PR7RWs~T&qO?1)0;8OP9mr&?_ zEd!{i70@B06_L@4$jDGFl7UgQB&=k~SS7Maj>slCBAcYPu^a+2hmVBJ&?9G-+}TBz zXWWq~l#nFk3zof330q|P#FdpMx?{=@e9y*0nRuG?)9dbIA?=7Zn<-7Ogy z%rLzw;Z+H4qs~_O26Js?Gu0GVXL}YV+@i`mTQ6efT|4_N8}^c}3;8Lx-qSp(>c5yP zv+!2uj`O5iUE1Gh?d8?|Hp~2qjUgL*#Kz|yu(3mIobhzo0%%W3w;50B)}I;aHsc}P zSeq@=3AQYoV9T-zwk(^Ikvv-Un*@E(FC%n|1lUfINU{yq26f#+*Q{GQ%4Xe0YxQpu zv2_#y8&Nz-w%~RHx=DSu0s3URv(}ru4{F`oY^bw)ANJd!RX0b`Dd=_+pdGVqaS#TA zaC#8o%*J|#2HI+&(EtA%Z`Y=G+9q~V=ogzs#Fs&WPiD*-y?Scqb$UUo8r5tsP!;V9 z+So;%!C1xB@h9l0TBW5A>O>nFRjUhLtI#SPHmr5mvtO=H#t?b%!g$d!L~pK&n|i}L z!&%^r^XATaJ(Q)5hg3QzAHz@KF_|6%p4ElhboHes%dnJo?C(gon^x1UVMu9>l+$EM zyYYBITTA&JYj=J;UeH!t2igzSu&1+}ENH*(>w~#T?}~D>R>)!8tQB$?H*0yv+zy3X zp5FpK#BWTE@nL>rYK#x`TfkSiVcaHeL%A7)bE^@*P25(v!8sWU;bx5QQEo#=#9l_Y z9jWsb&xxPHEyHgiDKT#F_ig65r+y1bS-53z`*yvmBxe`^)OW4foqs1^G=pWW+-Vx8O~1UE+HGF@F06NmG=W!zJbw P00000NkvXXu0mjf;Dg73 literal 0 HcmV?d00001 diff --git a/public/css/yui/build/assets/skins/sam/loading.gif b/public/css/yui/build/assets/skins/sam/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..0bbf3bc0c0e5e635553e8d1bf9ceddefbc402396 GIT binary patch literal 2673 zcmchY_gj;P7RTSb83YJ1>=8y5ONL=ZcEgk+C?FydumNNz8c=c6`n&|fmMu_HHG%^w zNLVjHyfy)hAgHK_Kxkz+0Ktm5M|X*?y?g!o_3yv`{_^F^wY9YuFJ3GxEUd1s-nnz<)vH(c?%i8n zUVirM+2rIT007UQKY#e};oRKZty{MqJa}MhYina;bNBAu-+udTYHDhBcJ|n@WA*j* z-+lL;iHS*OX6D|#dm|zu!o$ON?b=mbT)bh!26uP&kdP1u2Zx!N8486$B9X?&$DclZ zdgI28>FMdk#l`#g@Bj4EPc=0)2M!!4EG!%z9?s6rzI5r**|TSdhK8)HtXf)HHgDc+ zZEek9Fk)k4xm@nHZQC3j9o^jACMG6~jg9m3^EYnX2*Yq^XJ>6~?X_#y4jnqQbLUQp zM6z$+zMp^o*}}p?p-?n8H=jOzx~Zv&N~Km+RkgLX9X@>c=FOXxm6dsUd1NvZ zX=yul?BMZua=F~p)O7py?EwJ+w{PD*dGh2hzx?v((WCP6au$mb!vmnqSpF6-9Ona(JQT#e>!KODwxYzG5#S|?M#v6eD#mgO^`=~9EL;yL&>*dd5*+XG=_`^3=CG25PbLa+LJ%N(PW_s z=_-TaM{SB!w(n7k+dMDN2G6VPqUA$u7F4m@ABAZ1D`*UMfe}E6csJU}J1Trmp#~7hZ5QSGpNvd1Uz$!Rf3q28pgSj9o zx?zwoWa8GYK@TOz^)mp#V2_VR5WfJ0W9BSSbn+cKb z7B9l9)K#s!?PSt;g%c8u;y7rd?hkP%>vq5BY=N>c=98V=+T&RSPgSu|E(FAK>B?vNN1 zPszwcbxJ?Oh|1pGd!9?gxzSWOR8o=x5!rGh+6r3hBL-14aTaAQxvJ|Y-S_m4niV2S zK@?}-9Dkhg<+w{Ny!vjyp-QmjyGmIW1DFB{k>P2=8cm~9M^_P#8?JFDumGEPaqJvf zZ{f;B#CG;H7q8a_hQ$pR6%%6So8vKM+W+cNPE_TI46^dn9q@qBr@1bUgxcPGB*b-i z3Hx_0(Esy5KKx^Y0yfgB6~}t>@!ctk>J|!vgVRhE2CPQ;AOKY2y%5nM@YF^ZMS~q}%L-n>Lpor#4w48UHYViOt={{43LMRvkIp+rkbs*s; z14}4q0y6`s8DL?uo-~*R@5tnFsC1DR#BGxT8fA20u_o?`0iDNI6lf;^$@AkR1dPTz z>XF1ZAqNjU95c@Vn59Wo;Z6b(YG+L$xy3(?j2I*vQ>PmzMEdh`yw3=)E}JYMDG|*x mDkGVJ;D)fXhxDI?kcM(ish)C#5QQ<|d}62BjvZR2H60wE-$(3-AeXt*@{D|Np;u@pDC#5QQ<|d}62BjvZR2H60wE-$(3-AeX1=9cj|6h7@{#_u8sU*lR z_&>wb?FL>zp1h}vV@SoVq=W_rH;IG.bd>ul:after{content:".";display:block;clear:both;visibility:hidden;height:0;line-height:0;}.yuimenubaritem{float:left;}.yuimenubaritemlabel,.yuimenuitemlabel{display:block;}.yuimenuitemlabel .helptext{font-style:normal;display:block;margin:-1em 0 0 10em;}.yui-menu-shadow{position:absolute;visibility:hidden;z-index:-1;}.yui-menu-shadow-visible{top:2px;right:-3px;left:-3px;bottom:-3px;visibility:visible;}.hide-scrollbars *{overflow:hidden;}.hide-scrollbars select{display:none;}.yuimenu.show-scrollbars,.yuimenubar.show-scrollbars{overflow:visible;}.yuimenu.hide-scrollbars .yui-menu-shadow,.yuimenubar.hide-scrollbars .yui-menu-shadow{overflow:hidden;}.yuimenu.show-scrollbars .yui-menu-shadow,.yuimenubar.show-scrollbars .yui-menu-shadow{overflow:auto;}.yui-overlay.yui-force-redraw{margin-bottom:1px;}.yui-skin-sam .yuimenubar{font-size:93%;line-height:2;*line-height:1.9;border:solid 1px #808080;background:url(sprite.png) repeat-x 0 0;}.yui-skin-sam .yuimenubarnav .yuimenubaritem{border-right:solid 1px #ccc;}.yui-skin-sam .yuimenubaritemlabel{padding:0 10px;color:#000;text-decoration:none;cursor:default;border-style:solid;border-color:#808080;border-width:1px 0;*position:relative;margin:-1px 0;}.yui-skin-sam .yuimenubarnav .yuimenubaritemlabel{padding-right:20px;*display:inline-block;}.yui-skin-sam .yuimenubarnav .yuimenubaritemlabel-hassubmenu{background:url(menubaritem_submenuindicator.png) right center no-repeat;}.yui-skin-sam .yuimenubaritem-selected{background:url(sprite.png) repeat-x 0 -1700px;}.yui-skin-sam .yuimenubaritemlabel-selected{border-color:#7D98B8;}.yui-skin-sam .yuimenubarnav .yuimenubaritemlabel-selected{border-left-width:1px;margin-left:-1px;*left:-1px;}.yui-skin-sam .yuimenubaritemlabel-disabled{cursor:default;color:#A6A6A6;}.yui-skin-sam .yuimenubarnav .yuimenubaritemlabel-hassubmenu-disabled{background-image:url(menubaritem_submenuindicator_disabled.png);}.yui-skin-sam .yuimenu{font-size:93%;line-height:1.5;*line-height:1.45;}.yui-skin-sam .yuimenubar .yuimenu,.yui-skin-sam .yuimenu .yuimenu{font-size:100%;}.yui-skin-sam .yuimenu .bd{*zoom:1;_zoom:normal;border:solid 1px #808080;background-color:#fff;}.yui-skin-sam .yuimenu .yuimenu .bd{*zoom:normal;}.yui-skin-sam .yuimenu ul{padding:3px 0;border-width:1px 0 0 0;border-color:#ccc;border-style:solid;}.yui-skin-sam .yuimenu ul.first-of-type{border-width:0;}.yui-skin-sam .yuimenu h6{font-weight:bold;border-style:solid;border-color:#ccc;border-width:1px 0 0 0;color:#a4a4a4;padding:3px 10px 0 10px;}.yui-skin-sam .yuimenu ul.hastitle,.yui-skin-sam .yuimenu h6.first-of-type{border-width:0;}.yui-skin-sam .yuimenu .yui-menu-body-scrolled{border-color:#ccc #808080;overflow:hidden;}.yui-skin-sam .yuimenu .topscrollbar,.yui-skin-sam .yuimenu .bottomscrollbar{height:16px;border:solid 1px #808080;background:#fff url(sprite.png) no-repeat 0 0;}.yui-skin-sam .yuimenu .topscrollbar{border-bottom-width:0;background-position:center -950px;}.yui-skin-sam .yuimenu .topscrollbar_disabled{background-position:center -975px;}.yui-skin-sam .yuimenu .bottomscrollbar{border-top-width:0;background-position:center -850px;}.yui-skin-sam .yuimenu .bottomscrollbar_disabled{background-position:center -875px;}.yui-skin-sam .yuimenuitem{_border-bottom:solid 1px #fff;}.yui-skin-sam .yuimenuitemlabel{padding:0 20px;color:#000;text-decoration:none;cursor:default;}.yui-skin-sam .yuimenuitemlabel .helptext{margin-top:-1.5em;*margin-top:-1.45em;}.yui-skin-sam .yuimenuitem-hassubmenu{background-image:url(menuitem_submenuindicator.png);background-position:right center;background-repeat:no-repeat;}.yui-skin-sam .yuimenuitem-checked{background-image:url(menuitem_checkbox.png);background-position:left center;background-repeat:no-repeat;}.yui-skin-sam .yui-menu-shadow-visible{background-color:#000;opacity:.12;filter:alpha(opacity=12);}.yui-skin-sam .yuimenuitem-selected{background-color:#B3D4FF;}.yui-skin-sam .yuimenuitemlabel-disabled{cursor:default;color:#A6A6A6;}.yui-skin-sam .yuimenuitem-hassubmenu-disabled{background-image:url(menuitem_submenuindicator_disabled.png);}.yui-skin-sam .yuimenuitem-checked-disabled{background-image:url(menuitem_checkbox_disabled.png);} diff --git a/public/css/yui/build/assets/skins/sam/menubaritem_submenuindicator.png b/public/css/yui/build/assets/skins/sam/menubaritem_submenuindicator.png new file mode 100644 index 0000000000000000000000000000000000000000..030941c9cffc064276813d7eaab03d8c667ed700 GIT binary patch literal 3618 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 oFfyX>85y7$4gdfE0RR6300puDFk literal 0 HcmV?d00001 diff --git a/public/css/yui/build/assets/skins/sam/menubaritem_submenuindicator_disabled.png b/public/css/yui/build/assets/skins/sam/menubaritem_submenuindicator_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..6c1612230550ef09678a38a2e3374585055a07eb GIT binary patch literal 3618 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 literal 0 HcmV?d00001 diff --git a/public/css/yui/build/assets/skins/sam/menuitem_submenuindicator_disabled.png b/public/css/yui/build/assets/skins/sam/menuitem_submenuindicator_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..427d60a38af14ac7b530a266dc2e969555d287c7 GIT binary patch literal 3617 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 literal 0 HcmV?d00001 diff --git a/public/css/yui/build/assets/skins/sam/paginator.css b/public/css/yui/build/assets/skins/sam/paginator.css new file mode 100644 index 000000000..fe499de15 --- /dev/null +++ b/public/css/yui/build/assets/skins/sam/paginator.css @@ -0,0 +1,7 @@ +/* +Copyright (c) 2009, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.7.0 +*/ +.yui-skin-sam .yui-pg-container{display:block;margin:6px 0;white-space:nowrap;}.yui-skin-sam .yui-pg-first,.yui-skin-sam .yui-pg-previous,.yui-skin-sam .yui-pg-next,.yui-skin-sam .yui-pg-last,.yui-skin-sam .yui-pg-current,.yui-skin-sam .yui-pg-pages,.yui-skin-sam .yui-pg-page{display:inline-block;font-family:arial,helvetica,clean,sans-serif;padding:3px 6px;zoom:1;}.yui-skin-sam .yui-pg-pages{padding:0;}.yui-skin-sam .yui-pg-current{padding:3px 0;}.yui-skin-sam a.yui-pg-first:link,.yui-skin-sam a.yui-pg-first:visited,.yui-skin-sam a.yui-pg-first:active,.yui-skin-sam a.yui-pg-first:hover,.yui-skin-sam a.yui-pg-previous:link,.yui-skin-sam a.yui-pg-previous:visited,.yui-skin-sam a.yui-pg-previous:active,.yui-skin-sam a.yui-pg-previous:hover,.yui-skin-sam a.yui-pg-next:link,.yui-skin-sam a.yui-pg-next:visited,.yui-skin-sam a.yui-pg-next:active,.yui-skin-sam a.yui-pg-next:hover,.yui-skin-sam a.yui-pg-last:link,.yui-skin-sam a.yui-pg-last:visited,.yui-skin-sam a.yui-pg-last:active,.yui-skin-sam a.yui-pg-last:hover,.yui-skin-sam a.yui-pg-page:link,.yui-skin-sam a.yui-pg-page:visited,.yui-skin-sam a.yui-pg-page:active,.yui-skin-sam a.yui-pg-page:hover{color:#06c;text-decoration:underline;outline:0;}.yui-skin-sam span.yui-pg-first,.yui-skin-sam span.yui-pg-previous,.yui-skin-sam span.yui-pg-next,.yui-skin-sam span.yui-pg-last{color:#a6a6a6;}.yui-skin-sam .yui-pg-page{background-color:#fff;border:1px solid #CBCBCB;padding:2px 6px;text-decoration:none;}.yui-skin-sam .yui-pg-current-page{background-color:transparent;border:none;font-weight:bold;padding:3px 6px;}.yui-skin-sam .yui-pg-page{margin-left:1px;margin-right:1px;}.yui-skin-sam .yui-pg-first,.yui-skin-sam .yui-pg-previous{padding-left:0;}.yui-skin-sam .yui-pg-next,.yui-skin-sam .yui-pg-last{padding-right:0;}.yui-skin-sam .yui-pg-current,.yui-skin-sam .yui-pg-rpp-options{margin-left:1em;margin-right:1em;} diff --git a/public/css/yui/build/assets/skins/sam/picker_mask.png b/public/css/yui/build/assets/skins/sam/picker_mask.png new file mode 100644 index 0000000000000000000000000000000000000000..f8d91932b376af76ccfac030c12eb9fec7ee4c63 GIT binary patch literal 12174 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.bd>ul:after{content:".";display:block;clear:both;visibility:hidden;height:0;line-height:0;}.yuimenubaritem{float:left;}.yuimenubaritemlabel,.yuimenuitemlabel{display:block;}.yuimenuitemlabel .helptext{font-style:normal;display:block;margin:-1em 0 0 10em;}.yui-menu-shadow{position:absolute;visibility:hidden;z-index:-1;}.yui-menu-shadow-visible{top:2px;right:-3px;left:-3px;bottom:-3px;visibility:visible;}.hide-scrollbars *{overflow:hidden;}.hide-scrollbars select{display:none;}.yuimenu.show-scrollbars,.yuimenubar.show-scrollbars{overflow:visible;}.yuimenu.hide-scrollbars .yui-menu-shadow,.yuimenubar.hide-scrollbars .yui-menu-shadow{overflow:hidden;}.yuimenu.show-scrollbars .yui-menu-shadow,.yuimenubar.show-scrollbars .yui-menu-shadow{overflow:auto;}.yui-overlay.yui-force-redraw{margin-bottom:1px;}.yui-skin-sam .yuimenubar{font-size:93%;line-height:2;*line-height:1.9;border:solid 1px #808080;background:url(sprite.png) repeat-x 0 0;}.yui-skin-sam .yuimenubarnav .yuimenubaritem{border-right:solid 1px #ccc;}.yui-skin-sam .yuimenubaritemlabel{padding:0 10px;color:#000;text-decoration:none;cursor:default;border-style:solid;border-color:#808080;border-width:1px 0;*position:relative;margin:-1px 0;}.yui-skin-sam .yuimenubarnav .yuimenubaritemlabel{padding-right:20px;*display:inline-block;}.yui-skin-sam .yuimenubarnav .yuimenubaritemlabel-hassubmenu{background:url(menubaritem_submenuindicator.png) right center no-repeat;}.yui-skin-sam .yuimenubaritem-selected{background:url(sprite.png) repeat-x 0 -1700px;}.yui-skin-sam .yuimenubaritemlabel-selected{border-color:#7D98B8;}.yui-skin-sam .yuimenubarnav .yuimenubaritemlabel-selected{border-left-width:1px;margin-left:-1px;*left:-1px;}.yui-skin-sam .yuimenubaritemlabel-disabled{cursor:default;color:#A6A6A6;}.yui-skin-sam .yuimenubarnav .yuimenubaritemlabel-hassubmenu-disabled{background-image:url(menubaritem_submenuindicator_disabled.png);}.yui-skin-sam .yuimenu{font-size:93%;line-height:1.5;*line-height:1.45;}.yui-skin-sam .yuimenubar .yuimenu,.yui-skin-sam .yuimenu .yuimenu{font-size:100%;}.yui-skin-sam .yuimenu .bd{*zoom:1;_zoom:normal;border:solid 1px #808080;background-color:#fff;}.yui-skin-sam .yuimenu .yuimenu .bd{*zoom:normal;}.yui-skin-sam .yuimenu ul{padding:3px 0;border-width:1px 0 0 0;border-color:#ccc;border-style:solid;}.yui-skin-sam .yuimenu ul.first-of-type{border-width:0;}.yui-skin-sam .yuimenu h6{font-weight:bold;border-style:solid;border-color:#ccc;border-width:1px 0 0 0;color:#a4a4a4;padding:3px 10px 0 10px;}.yui-skin-sam .yuimenu ul.hastitle,.yui-skin-sam .yuimenu h6.first-of-type{border-width:0;}.yui-skin-sam .yuimenu .yui-menu-body-scrolled{border-color:#ccc #808080;overflow:hidden;}.yui-skin-sam .yuimenu .topscrollbar,.yui-skin-sam .yuimenu .bottomscrollbar{height:16px;border:solid 1px #808080;background:#fff url(sprite.png) no-repeat 0 0;}.yui-skin-sam .yuimenu .topscrollbar{border-bottom-width:0;background-position:center -950px;}.yui-skin-sam .yuimenu .topscrollbar_disabled{background-position:center -975px;}.yui-skin-sam .yuimenu .bottomscrollbar{border-top-width:0;background-position:center -850px;}.yui-skin-sam .yuimenu .bottomscrollbar_disabled{background-position:center -875px;}.yui-skin-sam .yuimenuitem{_border-bottom:solid 1px #fff;}.yui-skin-sam .yuimenuitemlabel{padding:0 20px;color:#000;text-decoration:none;cursor:default;}.yui-skin-sam .yuimenuitemlabel .helptext{margin-top:-1.5em;*margin-top:-1.45em;}.yui-skin-sam .yuimenuitem-hassubmenu{background-image:url(menuitem_submenuindicator.png);background-position:right center;background-repeat:no-repeat;}.yui-skin-sam .yuimenuitem-checked{background-image:url(menuitem_checkbox.png);background-position:left center;background-repeat:no-repeat;}.yui-skin-sam .yui-menu-shadow-visible{background-color:#000;opacity:.12;filter:alpha(opacity=12);}.yui-skin-sam .yuimenuitem-selected{background-color:#B3D4FF;}.yui-skin-sam .yuimenuitemlabel-disabled{cursor:default;color:#A6A6A6;}.yui-skin-sam .yuimenuitem-hassubmenu-disabled{background-image:url(menuitem_submenuindicator_disabled.png);}.yui-skin-sam .yuimenuitem-checked-disabled{background-image:url(menuitem_checkbox_disabled.png);} +.yui-skin-sam .yui-pg-container{display:block;margin:6px 0;white-space:nowrap;}.yui-skin-sam .yui-pg-first,.yui-skin-sam .yui-pg-previous,.yui-skin-sam .yui-pg-next,.yui-skin-sam .yui-pg-last,.yui-skin-sam .yui-pg-current,.yui-skin-sam .yui-pg-pages,.yui-skin-sam .yui-pg-page{display:inline-block;font-family:arial,helvetica,clean,sans-serif;padding:3px 6px;zoom:1;}.yui-skin-sam .yui-pg-pages{padding:0;}.yui-skin-sam .yui-pg-current{padding:3px 0;}.yui-skin-sam a.yui-pg-first:link,.yui-skin-sam a.yui-pg-first:visited,.yui-skin-sam a.yui-pg-first:active,.yui-skin-sam a.yui-pg-first:hover,.yui-skin-sam a.yui-pg-previous:link,.yui-skin-sam a.yui-pg-previous:visited,.yui-skin-sam a.yui-pg-previous:active,.yui-skin-sam a.yui-pg-previous:hover,.yui-skin-sam a.yui-pg-next:link,.yui-skin-sam a.yui-pg-next:visited,.yui-skin-sam a.yui-pg-next:active,.yui-skin-sam a.yui-pg-next:hover,.yui-skin-sam a.yui-pg-last:link,.yui-skin-sam a.yui-pg-last:visited,.yui-skin-sam a.yui-pg-last:active,.yui-skin-sam a.yui-pg-last:hover,.yui-skin-sam a.yui-pg-page:link,.yui-skin-sam a.yui-pg-page:visited,.yui-skin-sam a.yui-pg-page:active,.yui-skin-sam a.yui-pg-page:hover{color:#06c;text-decoration:underline;outline:0;}.yui-skin-sam span.yui-pg-first,.yui-skin-sam span.yui-pg-previous,.yui-skin-sam span.yui-pg-next,.yui-skin-sam span.yui-pg-last{color:#a6a6a6;}.yui-skin-sam .yui-pg-page{background-color:#fff;border:1px solid #CBCBCB;padding:2px 6px;text-decoration:none;}.yui-skin-sam .yui-pg-current-page{background-color:transparent;border:none;font-weight:bold;padding:3px 6px;}.yui-skin-sam .yui-pg-page{margin-left:1px;margin-right:1px;}.yui-skin-sam .yui-pg-first,.yui-skin-sam .yui-pg-previous{padding-left:0;}.yui-skin-sam .yui-pg-next,.yui-skin-sam .yui-pg-last{padding-right:0;}.yui-skin-sam .yui-pg-current,.yui-skin-sam .yui-pg-rpp-options{margin-left:1em;margin-right:1em;} +.yui-skin-sam .yui-pv{background-color:#4a4a4a;font:arial;position:relative;width:99%;z-index:1000;margin-bottom:1em;overflow:hidden;}.yui-skin-sam .yui-pv .hd{background:url(header_background.png) repeat-x;min-height:30px;overflow:hidden;zoom:1;padding:2px 0;}.yui-skin-sam .yui-pv .hd h4{padding:8px 10px;margin:0;font:bold 14px arial;color:#fff;}.yui-skin-sam .yui-pv .hd a{background:#3f6bc3;font:bold 11px arial;color:#fff;padding:4px;margin:3px 10px 0 0;border:1px solid #3f567d;cursor:pointer;display:block;float:right;}.yui-skin-sam .yui-pv .hd span{display:none;}.yui-skin-sam .yui-pv .hd span.yui-pv-busy{height:18px;width:18px;background:url(wait.gif) no-repeat;overflow:hidden;display:block;float:right;margin:4px 10px 0 0;}.yui-skin-sam .yui-pv .hd:after,.yui-pv .bd:after,.yui-skin-sam .yui-pv-chartlegend dl:after{content:'.';visibility:hidden;clear:left;height:0;display:block;}.yui-skin-sam .yui-pv .bd{position:relative;zoom:1;overflow-x:auto;overflow-y:hidden;}.yui-skin-sam .yui-pv .yui-pv-table{padding:0 10px;margin:5px 0 10px 0;}.yui-skin-sam .yui-pv .yui-pv-table .yui-dt-bd td{color:#eeee5c;font:12px arial;}.yui-skin-sam .yui-pv .yui-pv-table tr.yui-dt-odd{background:#929292;}.yui-skin-sam .yui-pv .yui-pv-table tr.yui-dt-even{background:#58637a;}.yui-skin-sam .yui-pv .yui-pv-table tr.yui-dt-even td.yui-dt-asc,.yui-skin-sam .yui-pv .yui-pv-table tr.yui-dt-even td.yui-dt-desc{background:#384970;}.yui-skin-sam .yui-pv .yui-pv-table tr.yui-dt-odd td.yui-dt-asc,.yui-skin-sam .yui-pv .yui-pv-table tr.yui-dt-odd td.yui-dt-desc{background:#6F6E6E;}.yui-skin-sam .yui-pv .yui-pv-table .yui-dt-hd th{background-image:none;background:#2E2D2D;}.yui-skin-sam .yui-pv th.yui-dt-asc .yui-dt-liner{background:transparent url(asc.gif) no-repeat scroll right center;}.yui-skin-sam .yui-pv th.yui-dt-desc .yui-dt-liner{background:transparent url(desc.gif) no-repeat scroll right center;}.yui-skin-sam .yui-pv .yui-pv-table .yui-dt-hd th a{color:#fff;font:bold 12px arial;}.yui-skin-sam .yui-pv .yui-pv-table .yui-dt-hd th.yui-dt-asc,.yui-skin-sam .yui-pv .yui-pv-table .yui-dt-hd th.yui-dt-desc{background:#333;}.yui-skin-sam .yui-pv-chartcontainer{padding:0 10px;}.yui-skin-sam .yui-pv-chart{height:250px;clear:right;margin:5px 0 0 0;color:#fff;}.yui-skin-sam .yui-pv-chartlegend div{float:right;margin:0 0 0 10px;_width:250px;}.yui-skin-sam .yui-pv-chartlegend dl{border:1px solid #999;padding:.2em 0 .2em .5em;zoom:1;margin:5px 0;}.yui-skin-sam .yui-pv-chartlegend dt{float:left;display:block;height:.7em;width:.7em;padding:0;}.yui-skin-sam .yui-pv-chartlegend dd{float:left;display:block;color:#fff;margin:0 1em 0 .5em;padding:0;font:11px arial;}.yui-skin-sam .yui-pv-minimized{height:35px;}.yui-skin-sam .yui-pv-minimized .bd{top:-3000px;}.yui-skin-sam .yui-pv-minimized .hd a.yui-pv-refresh{display:none;} +.yui-resize{position:relative;zoom:1;z-index:0;}.yui-resize-wrap{zoom:1;}.yui-draggable{cursor:move;}.yui-resize .yui-resize-handle{position:absolute;z-index:1;font-size:0;margin:0;padding:0;zoom:1;height:1px;width:1px;}.yui-resize .yui-resize-handle-br{height:5px;width:5px;bottom:0;right:0;cursor:se-resize;z-index:2;zoom:1;}.yui-resize .yui-resize-handle-bl{height:5px;width:5px;bottom:0;left:0;cursor:sw-resize;z-index:2;zoom:1;}.yui-resize .yui-resize-handle-tl{height:5px;width:5px;top:0;left:0;cursor:nw-resize;z-index:2;zoom:1;}.yui-resize .yui-resize-handle-tr{height:5px;width:5px;top:0;right:0;cursor:ne-resize;z-index:2;zoom:1;}.yui-resize .yui-resize-handle-r{width:5px;height:100%;top:0;right:0;cursor:e-resize;zoom:1;}.yui-resize .yui-resize-handle-l{height:100%;width:5px;top:0;left:0;cursor:w-resize;zoom:1;}.yui-resize .yui-resize-handle-b{width:100%;height:5px;bottom:0;right:0;cursor:s-resize;zoom:1;}.yui-resize .yui-resize-handle-t{width:100%;height:5px;top:0;right:0;cursor:n-resize;zoom:1;}.yui-resize-proxy{position:absolute;border:1px dashed #000;visibility:hidden;z-index:1000;}.yui-resize-hover .yui-resize-handle,.yui-resize-hidden .yui-resize-handle{opacity:0;filter:alpha(opacity=0);}.yui-resize-ghost{opacity:.5;filter:alpha(opacity=50);}.yui-resize-knob .yui-resize-handle{height:6px;width:6px;}.yui-resize-knob .yui-resize-handle-tr{right:-3px;top:-3px;}.yui-resize-knob .yui-resize-handle-tl{left:-3px;top:-3px;}.yui-resize-knob .yui-resize-handle-bl{left:-3px;bottom:-3px;}.yui-resize-knob .yui-resize-handle-br{right:-3px;bottom:-3px;}.yui-resize-knob .yui-resize-handle-t{left:45%;top:-3px;}.yui-resize-knob .yui-resize-handle-r{right:-3px;top:45%;}.yui-resize-knob .yui-resize-handle-l{left:-3px;top:45%;}.yui-resize-knob .yui-resize-handle-b{left:45%;bottom:-3px;}.yui-resize-status{position:absolute;top:-999px;left:-999px;padding:2px;font-size:80%;display:none;zoom:1;z-index:9999;}.yui-resize-status strong,.yui-resize-status em{font-weight:normal;font-style:normal;padding:1px;zoom:1;}.yui-skin-sam .yui-resize .yui-resize-handle{background-color:#F2F2F2;zoom:1;}.yui-skin-sam .yui-resize .yui-resize-handle-active{background-color:#7D98B8;zoom:1;}.yui-skin-sam .yui-resize .yui-resize-handle-l,.yui-skin-sam .yui-resize .yui-resize-handle-r,.yui-skin-sam .yui-resize .yui-resize-handle-l-active,.yui-skin-sam .yui-resize .yui-resize-handle-r-active{height:100%;zoom:1;}.yui-skin-sam .yui-resize-knob .yui-resize-handle{border:1px solid #808080;}.yui-skin-sam .yui-resize-hover .yui-resize-handle-active{opacity:1;filter:alpha(opacity=100);}.yui-skin-sam .yui-resize-proxy{border:1px dashed #426FD9;}.yui-skin-sam .yui-resize-status{border:1px solid #A6982B;border-top:1px solid #D4C237;background-color:#FFEE69;color:#000;}.yui-skin-sam .yui-resize-status strong,.yui-skin-sam .yui-resize-status em{float:left;display:block;clear:both;padding:1px;text-align:center;}.yui-skin-sam .yui-resize .yui-resize-handle-inner-r,.yui-skin-sam .yui-resize .yui-resize-handle-inner-l{background:transparent url(layout_sprite.png) no-repeat 0 -5px;height:16px;width:5px;position:absolute;top:45%;}.yui-skin-sam .yui-resize .yui-resize-handle-inner-t,.yui-skin-sam .yui-resize .yui-resize-handle-inner-b{background:transparent url(layout_sprite.png) no-repeat -20px 0;height:5px;width:16px;position:absolute;left:50%;}.yui-skin-sam .yui-resize .yui-resize-handle-br{background-image:url(layout_sprite.png);background-repeat:no-repeat;background-position:-22px -62px;}.yui-skin-sam .yui-resize .yui-resize-handle-tr{background-image:url(layout_sprite.png);background-repeat:no-repeat;background-position:-22px -42px;}.yui-skin-sam .yui-resize .yui-resize-handle-tl{background-image:url(layout_sprite.png);background-repeat:no-repeat;background-position:-22px -82px;}.yui-skin-sam .yui-resize .yui-resize-handle-bl{background-image:url(layout_sprite.png);background-repeat:no-repeat;background-position:-22px -23px;}.yui-skin-sam .yui-resize-knob .yui-resize-handle-t,.yui-skin-sam .yui-resize-knob .yui-resize-handle-r,.yui-skin-sam .yui-resize-knob .yui-resize-handle-b,.yui-skin-sam .yui-resize-knob .yui-resize-handle-l,.yui-skin-sam .yui-resize-knob .yui-resize-handle-tl,.yui-skin-sam .yui-resize-knob .yui-resize-handle-tr,.yui-skin-sam .yui-resize-knob .yui-resize-handle-bl,.yui-skin-sam .yui-resize-knob .yui-resize-handle-br,.yui-skin-sam .yui-resize-knob .yui-resize-handle-inner-t,.yui-skin-sam .yui-resize-knob .yui-resize-handle-inner-r,.yui-skin-sam .yui-resize-knob .yui-resize-handle-inner-b,.yui-skin-sam .yui-resize-knob .yui-resize-handle-inner-l,.yui-skin-sam .yui-resize-knob .yui-resize-handle-inner-tl,.yui-skin-sam .yui-resize-knob .yui-resize-handle-inner-tr,.yui-skin-sam .yui-resize-knob .yui-resize-handle-inner-bl,.yui-skin-sam .yui-resize-knob .yui-resize-handle-inner-br{background-image:none;}.yui-skin-sam .yui-resize-knob .yui-resize-handle-l,.yui-skin-sam .yui-resize-knob .yui-resize-handle-r,.yui-skin-sam .yui-resize-knob .yui-resize-handle-l-active,.yui-skin-sam .yui-resize-knob .yui-resize-handle-r-active{height:6px;width:6px;}.yui-skin-sam .yui-resize-textarea .yui-resize-handle-r{right:-8px;}.yui-skin-sam .yui-resize-textarea .yui-resize-handle-b{bottom:-8px;}.yui-skin-sam .yui-resize-textarea .yui-resize-handle-br{right:-8px;bottom:-8px;} +.yui-busy{cursor:wait!important;}.yui-toolbar-container fieldset,.yui-editor-container fieldset{padding:0;margin:0;border:0;}.yui-toolbar-container legend{display:none;}.yui-toolbar-container .yui-toolbar-subcont{padding:.25em 0;zoom:1;}.yui-toolbar-container-collapsed .yui-toolbar-subcont{display:none;}.yui-toolbar-container .yui-toolbar-subcont:after{display:block;clear:both;visibility:hidden;content:'.';height:0;}.yui-toolbar-container span.yui-toolbar-draghandle{cursor:move;border-left:1px solid #999;border-right:1px solid #999;overflow:hidden;text-indent:77777px;width:2px;height:20px;display:block;clear:none;float:left;margin:0 0 0 .2em;}.yui-toolbar-container .yui-toolbar-titlebar.draggable{cursor:move;}.yui-toolbar-container .yui-toolbar-titlebar{position:relative;}.yui-toolbar-container .yui-toolbar-titlebar h2{font-weight:bold;letter-spacing:0;border:none;color:#000;margin:0;padding:.2em;}.yui-toolbar-container .yui-toolbar-titlebar h2 a{text-decoration:none;color:#000;cursor:default;}.yui-toolbar-container.yui-toolbar-grouped span.yui-toolbar-draghandle{height:40px;}.yui-toolbar-container .yui-toolbar-group{float:left;margin-right:.5em;zoom:1;}.yui-toolbar-container .yui-toolbar-group:after{display:block;clear:both;visibility:hidden;content:'.';height:0;}.yui-toolbar-container .yui-toolbar-group h3{font-size:75%;padding:0 0 0 .25em;margin:0;}.yui-toolbar-container span.yui-toolbar-separator{width:2px;padding:0;height:18px;margin:.2em 0 .2em .1em;display:none;float:left;}.yui-toolbar-container.yui-toolbar-grouped span.yui-toolbar-separator{height:45px;*height:50px;}.yui-toolbar-container.yui-toolbar-grouped .yui-toolbar-group span.yui-toolbar-separator{height:18px;display:block;}.yui-toolbar-container ul li{margin:0;padding:0;list-style-type:none;}.yui-toolbar-container .yui-toolbar-nogrouplabels h3{display:none;}.yui-toolbar-container .yui-push-button,.yui-toolbar-container .yui-color-button,.yui-toolbar-container .yui-menu-button{position:relative;cursor:pointer;}.yui-toolbar-container .yui-button .first-child,.yui-toolbar-container .yui-button .first-child a{height:100%;width:100%;overflow:hidden;font-size:0;}.yui-toolbar-container .yui-button-disabled{cursor:default;}.yui-toolbar-container .yui-button-disabled .yui-toolbar-icon{opacity:.5;filter:alpha(opacity=50);}.yui-toolbar-container .yui-button-disabled .up,.yui-toolbar-container .yui-button-disabled .down{opacity:.5;filter:alpha(opacity=50);}.yui-toolbar-container .yui-button a{overflow:hidden;}.yui-toolbar-container .yui-toolbar-select .first-child a{cursor:pointer;}.yui-toolbar-fontname-arial{font-family:Arial;}.yui-toolbar-fontname-arial-black{font-family:Arial Black;}.yui-toolbar-fontname-comic-sans-ms{font-family:Comic Sans MS;}.yui-toolbar-fontname-courier-new{font-family:Courier New;}.yui-toolbar-fontname-times-new-roman{font-family:Times New Roman;}.yui-toolbar-fontname-verdana{font-family:Verdana;}.yui-toolbar-fontname-impact{font-family:Impact;}.yui-toolbar-fontname-lucida-console{font-family:Lucida Console;}.yui-toolbar-fontname-tahoma{font-family:Tahoma;}.yui-toolbar-fontname-trebuchet-ms{font-family:Trebuchet MS;}.yui-toolbar-container .yui-toolbar-spinbutton{position:relative;}.yui-toolbar-container .yui-toolbar-spinbutton .first-child a{z-index:0;opacity:1;}.yui-toolbar-container .yui-toolbar-spinbutton a.up,.yui-toolbar-container .yui-toolbar-spinbutton a.down{position:absolute;display:block right:0;cursor:pointer;z-index:1;padding:0;margin:0;}.yui-toolbar-container .yui-overlay{position:absolute;}.yui-toolbar-container .yui-overlay ul li{margin:0;list-style-type:none;}.yui-toolbar-container{z-index:1;}.yui-editor-container .yui-editor-editable-container{position:relative;z-index:0;width:100%;}.yui-editor-container .yui-editor-masked{background-color:#CCC;height:100%;width:100%;position:absolute;top:0;left:0;opacity:.5;filter:alpha(opacity=50);}.yui-editor-container iframe{border:0;padding:0;margin:0;zoom:1;display:block;}.yui-editor-container .yui-editor-editable{padding:0;margin:0;}.yui-editor-container .dompath{font-size:85%;}.yui-editor-panel .hd{text-align:left;position:relative;}.yui-editor-panel .hd h3{font-weight:bold;padding:.25em 0 .25em .25em;margin:0;}.yui-editor-panel .bd{width:100%;zoom:1;position:relative;}.yui-editor-panel .bd div.yui-editor-body-cont{padding:.25em .1em;zoom:1;}.yui-editor-panel .bd .gecko form{overflow:auto;}.yui-editor-panel .bd div.yui-editor-body-cont:after{display:block;clear:both;visibility:hidden;content:'.';height:0;}.yui-editor-panel .ft{text-align:right;width:99%;float:left;clear:both;}.yui-editor-panel .ft span.tip{display:block;position:relative;padding:.5em .5em .5em 23px;text-align:left;zoom:1;}.yui-editor-panel label{clear:both;float:left;padding:0;width:100%;text-align:left;zoom:1;}.yui-editor-panel .gecko label{overflow:auto;}.yui-editor-panel label strong{float:left;width:6em;}.yui-editor-panel .removeLink{width:80%;text-align:right;}.yui-editor-panel label input{margin-left:.25em;float:left;}.yui-editor-panel .yui-toolbar-group{margin-bottom:.75em;}.yui-editor-panel .height-width{float:left;}.yui-editor-panel .height-width span{font-style:italic;display:block;float:left;overflow:visible;}.yui-editor-panel .height-width span.info{font-size:70%;margin-top:3px;}.yui-editor-panel .yui-toolbar-bordersize,.yui-editor-panel .yui-toolbar-bordertype{font-size:75%;}.yui-editor-panel .yui-toolbar-container span.yui-toolbar-separator{border:none;}.yui-editor-panel .yui-toolbar-bordersize span a span,.yui-editor-panel .yui-toolbar-bordertype span a span{display:block;height:8px;left:4px;position:absolute;top:3px;_top:-5px;width:24px;text-indent:52px;font-size:0;}.yui-editor-panel .yui-toolbar-bordertype span a span.yui-toolbar-bordertype-solid{border-bottom:1px solid black;}.yui-editor-panel .yui-toolbar-bordertype span a span.yui-toolbar-bordertype-dotted{border-bottom:1px dotted black;}.yui-editor-panel .yui-toolbar-bordertype span a span.yui-toolbar-bordertype-dashed{border-bottom:1px dashed black;} +.yui-editor-panel .yui-toolbar-bordersize span a span.yui-toolbar-bordersize-0{*top:0;text-indent:0;font-size:75%;}.yui-editor-panel .yui-toolbar-bordersize span a span.yui-toolbar-bordersize-1{border-bottom:1px solid black;}.yui-editor-panel .yui-toolbar-bordersize span a span.yui-toolbar-bordersize-2{border-bottom:2px solid black;}.yui-editor-panel .yui-toolbar-bordersize span a span.yui-toolbar-bordersize-3{top:2px;*top:-5px;border-bottom:3px solid black;}.yui-editor-panel .yui-toolbar-bordersize span a span.yui-toolbar-bordersize-4{top:1px;*top:-5px;border-bottom:4px solid black;}.yui-editor-panel .yui-toolbar-bordersize span a span.yui-toolbar-bordersize-5{top:1px;*top:-5px;border-bottom:5px solid black;}.yui-toolbar-container .yui-toolbar-bordersize-menu,.yui-toolbar-container .yui-toolbar-bordertype-menu{width:95px!important;}.yui-toolbar-bordersize-menu .yuimenuitemlabel,.yui-toolbar-bordertype-menu .yuimenuitemlabel,.yui-toolbar-bordersize-menu .yuimenuitemlabel,.yui-toolbar-bordertype-menu .yuimenuitemlabel:hover{margin:0 3px 7px 17px;}.yui-toolbar-bordersize-menu .yuimenuitemlabel .checkedindicator,.yui-toolbar-bordertype-menu .yuimenuitemlabel .checkedindicator{position:absolute;left:-12px;*top:14px;*left:0;}.yui-toolbar-bordersize-menu li.yui-toolbar-bordersize-1 a{border-bottom:1px solid black;height:14px;}.yui-toolbar-bordersize-menu li.yui-toolbar-bordersize-2 a{border-bottom:2px solid black;height:14px;}.yui-toolbar-bordersize-menu li.yui-toolbar-bordersize-3 a{border-bottom:3px solid black;height:14px;}.yui-toolbar-bordersize-menu li.yui-toolbar-bordersize-4 a{border-bottom:4px solid black;height:14px;}.yui-toolbar-bordersize-menu li.yui-toolbar-bordersize-5 a{border-bottom:5px solid black;height:14px;}.yui-toolbar-bordertype-menu li.yui-toolbar-bordertype-solid a{border-bottom:1px solid black;height:14px;}.yui-toolbar-bordertype-menu li.yui-toolbar-bordertype-dashed a{border-bottom:1px dashed black;height:14px;}.yui-toolbar-bordertype-menu li.yui-toolbar-bordertype-dotted a{border-bottom:1px dotted black;height:14px;}h2.yui-editor-skipheader,h3.yui-editor-skipheader{height:0;margin:0;padding:0;border:none;width:0;overflow:hidden;position:absolute;}.yui-toolbar-colors{width:133px;zoom:1;display:none;z-index:100;overflow:hidden;}.yui-toolbar-colors:after{display:block;clear:both;visibility:hidden;content:'.';height:0;}.yui-toolbar-colors a{height:9px;width:9px;float:left;display:block;overflow:hidden;text-indent:999px;margin:0;cursor:pointer;border:1px solid #F6F7EE;}.yui-toolbar-colors a:hover{border:1px solid black;}.yui-color-button-menu{overflow:visible;background-color:transparent;}.yui-toolbar-colors span{position:relative;display:block;padding:3px;overflow:hidden;float:left;width:100%;zoom:1;}.yui-toolbar-colors span:after{display:block;clear:both;visibility:hidden;content:'.';height:0;}.yui-toolbar-colors span em{height:35px;width:30px;float:left;display:block;overflow:hidden;text-indent:999px;margin:.75px;border:1px solid black;}.yui-toolbar-colors span strong{font-weight:normal;padding-left:3px;display:block;font-size:85%;float:left;width:65%;}.yui-toolbar-group-undoredo h3,.yui-toolbar-group-insertitem h3,.yui-toolbar-group-indentlist h3{width:68px;}.yui-toolbar-group-indentlist2 h3{width:122px;}.yui-toolbar-group-alignment h3{width:130px;}.yui-skin-sam .yui-editor-container{border:1px solid #808080;}.yui-skin-sam .yui-toolbar-container{zoom:1;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-titlebar{background:url(sprite.png) repeat-x 0 -200px;position:relative;}.yui-skin-sam .yui-editor-container .draggable .yui-toolbar-titlebar{cursor:move;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-titlebar h2{color:#000;font-weight:bold;margin:0;padding:.3em 1em;font-size:100%;text-align:left;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-group h3{color:#808080;font-size:75%;margin:1em 0 0;padding-bottom:0;padding-left:.25em;text-align:left;}.yui-toolbar-container span.yui-toolbar-separator{border:none;text-indent:33px;overflow:hidden;margin:0 .25em;}.yui-skin-sam .yui-toolbar-container{background-color:#F2F2F2;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-subcont{padding:0 1em .35em;border-bottom:1px solid #808080;}.yui-skin-sam .yui-toolbar-container-collapsed .yui-toolbar-titlebar{border-bottom:1px solid #808080;}.yui-skin-sam .yui-editor-container .visible .yui-menu-shadow,.yui-skin-sam .yui-editor-panel .visible .yui-menu-shadow{display:none;}.yui-skin-sam .yui-editor-container ul{list-style-type:none;margin:0;padding:0;}.yui-skin-sam .yui-editor-container ul li{list-style-type:none;margin:0;padding:0;}.yui-skin-sam .yui-toolbar-group ul li.yui-toolbar-groupitem{float:left;}.yui-skin-sam .yui-editor-container .dompath{background-color:#F2F2F2;border-top:1px solid #808080;color:#999;text-align:left;padding:.25em;}.yui-skin-sam .yui-toolbar-container .collapse{background:url(sprite.png) no-repeat 0 -400px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-titlebar span.collapse{cursor:pointer;position:absolute;top:4px;right:2px;display:block;overflow:hidden;height:15px;width:15px;text-indent:9999px;}.yui-skin-sam .yui-toolbar-container .yui-push-button,.yui-skin-sam .yui-toolbar-container .yui-color-button,.yui-skin-sam .yui-toolbar-container .yui-menu-button{background:url(sprite.png) repeat-x 0 0;position:relative;display:block;height:22px;width:30px;_font-size:0;margin:0;border-color:#808080;color:#f2f2f2;border-style:solid;border-width:1px 0;zoom:1;}.yui-skin-sam .yui-toolbar-container .yui-push-button a,.yui-skin-sam .yui-toolbar-container .yui-color-button a,.yui-skin-sam .yui-toolbar-container .yui-menu-button a{padding-left:35px;height:20px;text-decoration:none;font-size:0;line-height:2;display:block;color:#000;overflow:hidden;white-space:nowrap;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-spinbutton a,.yui-skin-sam .yui-toolbar-container .yui-toolbar-select a{font-size:12px;} +.yui-skin-sam .yui-toolbar-container .yui-push-button .first-child,.yui-skin-sam .yui-toolbar-container .yui-color-button .first-child,.yui-skin-sam .yui-toolbar-container .yui-menu-button .first-child{border-color:#808080;border-style:solid;border-width:0 1px;margin:0 -1px;display:block;position:relative;}.yui-skin-sam .yui-toolbar-container .yui-push-button-disabled .first-child,.yui-skin-sam .yui-toolbar-container .yui-color-button-disabled .first-child,.yui-skin-sam .yui-toolbar-container .yui-menu-button-disabled .first-child{border-color:#ccc;}.yui-skin-sam .yui-toolbar-container .yui-push-button-disabled a,.yui-skin-sam .yui-toolbar-container .yui-color-button-disabled a,.yui-skin-sam .yui-toolbar-container .yui-menu-button-disabled a{color:#A6A6A6;cursor:default;}.yui-skin-sam .yui-toolbar-container .yui-push-button-disabled,.yui-skin-sam .yui-toolbar-container .yui-color-button-disabled,.yui-skin-sam .yui-toolbar-container .yui-menu-button-disabled{border-color:#ccc;}.yui-skin-sam .yui-toolbar-container .yui-button .first-child{*left:0;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-fontname{width:135px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-heading{width:92px;}.yui-skin-sam .yui-toolbar-container .yui-button-hover{background:url(sprite.png) repeat-x 0 -1300px;border-color:#808080;}.yui-skin-sam .yui-toolbar-container .yui-button-selected{background:url(sprite.png) repeat-x 0 -1700px;border-color:#808080;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-nogrouplabels h3{display:none;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-nogrouplabels .yui-toolbar-group{margin-top:.75em;}.yui-skin-sam .yui-toolbar-container .yui-push-button span.yui-toolbar-icon,.yui-skin-sam .yui-toolbar-container .yui-color-button span.yui-toolbar-icon,.yui-skin-sam .yui-toolbar-container .yui-menu-button span.yui-toolbar-icon{display:block;position:absolute;top:2px;height:18px;width:18px;overflow:hidden;background:url(editor-sprite.gif) no-repeat 30px 30px;}.yui-skin-sam .yui-toolbar-container .yui-button-selected span.yui-toolbar-icon,.yui-skin-sam .yui-toolbar-container .yui-button-hover span.yui-toolbar-icon{background-image:url(editor-sprite-active.gif);}.yui-skin-sam .yui-toolbar-container .visible .yuimenuitemlabel{cursor:pointer;color:#000;*position:relative;}.yui-skin-sam .yui-toolbar-container .yui-button-menu{background-color:#fff;}.yui-skin-sam .yui-toolbar-container .yui-button-menu .yui-menu-body-scrolled{position:relative;}.yui-skin-sam div.yuimenu li.selected{background-color:#B3D4FF;}.yui-skin-sam div.yuimenu li.selected a.selected{color:#000;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-bold span.yui-toolbar-icon{background-position:0 0;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-strikethrough span.yui-toolbar-icon{background-position:0 -108px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-italic span.yui-toolbar-icon{background-position:0 -36px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-undo span.yui-toolbar-icon{background-position:0 -1326px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-redo span.yui-toolbar-icon{background-position:0 -1355px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-underline span.yui-toolbar-icon{background-position:0 -72px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-subscript span.yui-toolbar-icon{background-position:0 -180px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-superscript span.yui-toolbar-icon{background-position:0 -144px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-forecolor span.yui-toolbar-icon{background-position:0 -216px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-backcolor span.yui-toolbar-icon{background-position:0 -288px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-justifyleft span.yui-toolbar-icon{background-position:0 -324px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-justifycenter span.yui-toolbar-icon{background-position:0 -360px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-justifyright span.yui-toolbar-icon{background-position:0 -396px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-justifyfull span.yui-toolbar-icon{background-position:0 -432px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-indent span.yui-toolbar-icon{background-position:0 -720px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-outdent span.yui-toolbar-icon{background-position:0 -684px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-createlink span.yui-toolbar-icon{background-position:0 -792px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-insertimage span.yui-toolbar-icon{background-position:1px -756px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-left span.yui-toolbar-icon{background-position:0 -972px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-right span.yui-toolbar-icon{background-position:0 -936px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-inline span.yui-toolbar-icon{background-position:0 -900px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-block span.yui-toolbar-icon{background-position:0 -864px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-bordercolor span.yui-toolbar-icon{background-position:0 -252px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-removeformat span.yui-toolbar-icon{background-position:0 -1080px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-hiddenelements span.yui-toolbar-icon{background-position:0 -1044px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-insertunorderedlist span.yui-toolbar-icon{background-position:0 -468px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-insertorderedlist span.yui-toolbar-icon{background-position:0 -504px;left:5px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-spinbutton,.yui-skin-sam .yui-toolbar-container .yui-toolbar-spinbutton .first-child{width:35px;} +.yui-skin-sam .yui-toolbar-container .yui-toolbar-spinbutton .first-child a{padding-left:2px;text-align:left;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-spinbutton span.yui-toolbar-icon{display:none;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-spinbutton a.up,.yui-skin-sam .yui-toolbar-container .yui-toolbar-spinbutton a.down{right:2px;background:url(editor-sprite.gif) no-repeat 0 -1222px;overflow:hidden;height:6px;width:7px;min-height:0;padding:0;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-spinbutton a.up{top:2px;background-position:0 -1222px;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-spinbutton a.down{bottom:2px;background-position:0 -1187px;}.yui-skin-sam .yui-toolbar-container select{height:22px;border:1px solid #808080;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-select .first-child a{padding-left:5px;text-align:left;}.yui-skin-sam .yui-toolbar-container .yui-toolbar-select span.yui-toolbar-icon{background:url(editor-sprite.gif) no-repeat 0 -1144px;overflow:hidden;right:-2px;top:0;height:20px;}.yui-skin-sam .yui-editor-panel .yui-color-button-menu .bd{background-color:transparent;border:none;width:135px;}.yui-skin-sam .yui-color-button-menu .yui-toolbar-colors{border:1px solid #808080;}.yui-skin-sam .yui-editor-panel{padding:0;margin:0;border:none;background-color:transparent;overflow:visible;position:absolute;}.yui-skin-sam .yui-editor-panel .hd{margin:10px 0 0;padding:0;border:none;}.yui-skin-sam .yui-editor-panel .hd h3{color:#000;border:1px solid #808080;background:url(sprite.png) repeat-x 0 -200px;width:99%;position:relative;margin:0;padding:3px 0 0 0;font-size:93%;text-indent:5px;height:20px;}.yui-skin-sam .yui-editor-panel .bd{background-color:#F2F2F2;border-left:1px solid #808080;border-right:1px solid #808080;width:99%;margin:0;padding:0;overflow:visible;}.yui-skin-sam .yui-editor-panel ul{list-style-type:none;margin:0;padding:0;}.yui-skin-sam .yui-editor-panel ul li{margin:0;padding:0;}.yui-skin-sam .yui-editor-panel .yui-toolbar-container .yui-toolbar-subcont{padding:0;border:none;margin-top:.35em;}.yui-skin-sam .yui-editor-panel .yui-toolbar-bordersize,.yui-skin-sam .yui-editor-panel .yui-toolbar-bordertype{width:50px;}.yui-skin-sam .yui-editor-panel label{display:block;float:none;padding:4px 0;margin-bottom:7px;}.yui-skin-sam .yui-editor-panel label strong{font-weight:normal;font-size:93%;text-align:right;padding-top:2px;}.yui-skin-sam .yui-editor-panel label input{width:75%;}.yui-skin-sam .yui-editor-panel .createlink_target,.yui-skin-sam .yui-editor-panel .insertimage_target{width:auto;margin-right:5px;}.yui-skin-sam .yui-editor-panel .removeLink{width:98%;}.yui-skin-sam .yui-editor-panel label input.warning{background-color:#FFEE69;}.yui-skin-sam .yui-editor-panel .yui-toolbar-group h3{color:#000;float:left;font-weight:normal;font-size:93%;margin:5px 0 0 0;padding:0 3px 0 0;text-align:right;}.yui-skin-sam .yui-editor-panel .height-width h3{margin:3px 0 0 10px;}.yui-skin-sam .yui-editor-panel .height-width{margin:3px 0 0 35px;*margin-left:14px;width:42%;*width:44%;}.yui-skin-sam .yui-editor-panel .yui-toolbar-group-border{width:190px;}.yui-skin-sam .yui-editor-panel .no-button .yui-toolbar-group-border{width:210px;}.yui-skin-sam .yui-editor-panel .yui-toolbar-group-padding{width:203px;_width:198px;}.yui-skin-sam .yui-editor-panel .no-button .yui-toolbar-group-padding{width:172px;}.yui-skin-sam .yui-editor-panel .yui-toolbar-group-padding h3{margin-left:25px;*margin-left:12px;}.yui-skin-sam .yui-editor-panel .yui-toolbar-group-textflow{width:182px;}.yui-skin-sam .yui-editor-panel .hd{background:none;}.yui-skin-sam .yui-editor-panel .ft{background-color:#F2F2F2;border:1px solid #808080;border-top:none;padding:0;margin:0 0 2px 0;}.yui-skin-sam .yui-editor-panel .hd span.close{background:url(sprite.png) no-repeat 0 -300px;cursor:pointer;display:block;height:16px;overflow:hidden;position:absolute;right:5px;text-indent:500px;top:2px;width:26px;}.yui-skin-sam .yui-editor-panel .ft span.tip{background-color:#EDF5FF;border-top:1px solid #808080;font-size:85%;}.yui-skin-sam .yui-editor-panel .ft span.tip strong{display:block;float:left;margin:0 2px 8px 0;}.yui-skin-sam .yui-editor-panel .ft span.tip span.icon{background:url(editor-sprite.gif) no-repeat 0 -1260px;display:block;height:20px;left:2px;position:absolute;top:8px;width:20px;}.yui-skin-sam .yui-editor-panel .ft span.tip span.icon-info{background-position:2px -1260px;}.yui-skin-sam .yui-editor-panel .ft span.tip span.icon-warn{background-position:2px -1296px;}.yui-skin-sam .yui-editor-panel .hd span.knob{position:absolute;height:10px;width:28px;top:-10px;left:25px;text-indent:9999px;overflow:hidden;background:url(editor-knob.gif) no-repeat 0 0;}.yui-skin-sam .yui-editor-panel .yui-toolbar-container{float:left;width:100%;background-image:none;border:none;}.yui-skin-sam .yui-editor-panel .yui-toolbar-container .bd{background-color:#fff;}.yui-editor-blankimage{background-image:url(blankimage.png);}.yui-skin-sam .yui-editor-container .yui-resize-handle-br{height:11px;width:11px;background-position:-20px -60px;background-color:transparent;} +.yui-h-slider,.yui-v-slider{position:relative;}.yui-h-slider .yui-slider-thumb,.yui-v-slider .yui-slider-thumb{position:absolute;cursor:default;}.yui-skin-sam .yui-h-slider{background:url(bg-h.gif) no-repeat 5px 0;height:28px;width:228px;}.yui-skin-sam .yui-h-slider .yui-slider-thumb{top:4px;}.yui-skin-sam .yui-v-slider{background:url(bg-v.gif) no-repeat 12px 0;height:228px;width:48px;} +.yui-navset .yui-nav li,.yui-navset .yui-navset-top .yui-nav li,.yui-navset .yui-navset-bottom .yui-nav li{margin:0 .5em 0 0;}.yui-navset-left .yui-nav li,.yui-navset-right .yui-nav li{margin:0 0 .5em;}.yui-navset .yui-content .yui-hidden{position:absolute;left:-999999px;visibility:hidden;}.yui-navset .yui-navset-left .yui-nav,.yui-navset .yui-navset-right .yui-nav,.yui-navset-left .yui-nav,.yui-navset-right .yui-nav{width:6em;}.yui-navset-top .yui-nav,.yui-navset-bottom .yui-nav{width:auto;}.yui-navset .yui-navset-left,.yui-navset-left{padding:0 0 0 6em;}.yui-navset-right{padding:0 6em 0 0;}.yui-navset-top,.yui-navset-bottom{padding:auto;}.yui-nav,.yui-nav li{margin:0;padding:0;list-style:none;}.yui-navset li em{font-style:normal;}.yui-navset{position:relative;zoom:1;}.yui-navset .yui-content,.yui-navset .yui-content div{zoom:1;}.yui-navset .yui-content:after{content:'';display:block;clear:both;}.yui-navset .yui-nav li,.yui-navset .yui-navset-top .yui-nav li,.yui-navset .yui-navset-bottom .yui-nav li{display:inline-block;display:-moz-inline-stack;*display:inline;vertical-align:bottom;cursor:pointer;zoom:1;}.yui-navset-left .yui-nav li,.yui-navset-right .yui-nav li{display:block;}.yui-navset .yui-nav a{position:relative;}.yui-navset .yui-nav li a,.yui-navset-top .yui-nav li a,.yui-navset-bottom .yui-nav li a{display:block;display:inline-block;vertical-align:bottom;zoom:1;}.yui-navset-left .yui-nav li a,.yui-navset-right .yui-nav li a{display:block;}.yui-navset-bottom .yui-nav li a{vertical-align:text-top;}.yui-navset .yui-nav li a em,.yui-navset-top .yui-nav li a em,.yui-navset-bottom .yui-nav li a em{display:block;}.yui-navset .yui-navset-left .yui-nav,.yui-navset .yui-navset-right .yui-nav,.yui-navset-left .yui-nav,.yui-navset-right .yui-nav{position:absolute;z-index:1;}.yui-navset-top .yui-nav,.yui-navset-bottom .yui-nav{position:static;}.yui-navset .yui-navset-left .yui-nav,.yui-navset-left .yui-nav{left:0;right:auto;}.yui-navset .yui-navset-right .yui-nav,.yui-navset-right .yui-nav{right:0;left:auto;}.yui-skin-sam .yui-navset .yui-nav,.yui-skin-sam .yui-navset .yui-navset-top .yui-nav{border:solid #2647a0;border-width:0 0 5px;zoom:1;}.yui-skin-sam .yui-navset .yui-nav li,.yui-skin-sam .yui-navset .yui-navset-top .yui-nav li{margin:0 .16em 0 0;padding:1px 0 0;zoom:1;}.yui-skin-sam .yui-navset .yui-nav .selected,.yui-skin-sam .yui-navset .yui-navset-top .yui-nav .selected{margin:0 .16em -1px 0;}.yui-skin-sam .yui-navset .yui-nav a,.yui-skin-sam .yui-navset .yui-navset-top .yui-nav a{background:#d8d8d8 url(sprite.png) repeat-x;border:solid #a3a3a3;border-width:0 1px;color:#000;position:relative;text-decoration:none;}.yui-skin-sam .yui-navset .yui-nav a em,.yui-skin-sam .yui-navset .yui-navset-top .yui-nav a em{border:solid #a3a3a3;border-width:1px 0 0;cursor:hand;padding:.25em .75em;left:0;right:0;bottom:0;top:-1px;position:relative;}.yui-skin-sam .yui-navset .yui-nav .selected a,.yui-skin-sam .yui-navset .yui-nav .selected a:focus,.yui-skin-sam .yui-navset .yui-nav .selected a:hover{background:#2647a0 url(sprite.png) repeat-x left -1400px;color:#fff;}.yui-skin-sam .yui-navset .yui-nav a:hover,.yui-skin-sam .yui-navset .yui-nav a:focus{background:#bfdaff url(sprite.png) repeat-x left -1300px;outline:0;}.yui-skin-sam .yui-navset .yui-nav .selected a em{padding:.35em .75em;}.yui-skin-sam .yui-navset .yui-nav .selected a,.yui-skin-sam .yui-navset .yui-nav .selected a em{border-color:#243356;}.yui-skin-sam .yui-navset .yui-content{background:#edf5ff;}.yui-skin-sam .yui-navset .yui-content,.yui-skin-sam .yui-navset .yui-navset-top .yui-content{border:1px solid #808080;border-top-color:#243356;padding:.25em .5em;}.yui-skin-sam .yui-navset-left .yui-nav,.yui-skin-sam .yui-navset .yui-navset-left .yui-nav,.yui-skin-sam .yui-navset .yui-navset-right .yui-nav,.yui-skin-sam .yui-navset-right .yui-nav{border-width:0 5px 0 0;Xposition:absolute;top:0;bottom:0;}.yui-skin-sam .yui-navset .yui-navset-right .yui-nav,.yui-skin-sam .yui-navset-right .yui-nav{border-width:0 0 0 5px;}.yui-skin-sam .yui-navset-left .yui-nav li,.yui-skin-sam .yui-navset .yui-navset-left .yui-nav li,.yui-skin-sam .yui-navset-right .yui-nav li{margin:0 0 .16em;padding:0 0 0 1px;}.yui-skin-sam .yui-navset-right .yui-nav li{padding:0 1px 0 0;}.yui-skin-sam .yui-navset-left .yui-nav .selected,.yui-skin-sam .yui-navset .yui-navset-left .yui-nav .selected{margin:0 -1px .16em 0;}.yui-skin-sam .yui-navset-right .yui-nav .selected{margin:0 0 .16em -1px;}.yui-skin-sam .yui-navset-left .yui-nav a,.yui-skin-sam .yui-navset-right .yui-nav a{border-width:1px 0;}.yui-skin-sam .yui-navset-left .yui-nav a em,.yui-skin-sam .yui-navset .yui-navset-left .yui-nav a em,.yui-skin-sam .yui-navset-right .yui-nav a em{border-width:0 0 0 1px;padding:.2em .75em;top:auto;left:-1px;}.yui-skin-sam .yui-navset-right .yui-nav a em{border-width:0 1px 0 0;left:auto;right:-1px;}.yui-skin-sam .yui-navset-left .yui-nav a,.yui-skin-sam .yui-navset-left .yui-nav .selected a,.yui-skin-sam .yui-navset-left .yui-nav a:hover,.yui-skin-sam .yui-navset-right .yui-nav a,.yui-skin-sam .yui-navset-right .yui-nav .selected a,.yui-skin-sam .yui-navset-right .yui-nav a:hover,.yui-skin-sam .yui-navset-bottom .yui-nav a,.yui-skin-sam .yui-navset-bottom .yui-nav .selected a,.yui-skin-sam .yui-navset-bottom .yui-nav a:hover{background-image:none;}.yui-skin-sam .yui-navset-left .yui-content{border:1px solid #808080;border-left-color:#243356;}.yui-skin-sam .yui-navset-bottom .yui-nav,.yui-skin-sam .yui-navset .yui-navset-bottom .yui-nav{border-width:5px 0 0;}.yui-skin-sam .yui-navset .yui-navset-bottom .yui-nav .selected,.yui-skin-sam .yui-navset-bottom .yui-nav .selected{margin:-1px .16em 0 0;}.yui-skin-sam .yui-navset .yui-navset-bottom .yui-nav li,.yui-skin-sam .yui-navset-bottom .yui-nav li{padding:0 0 1px 0;vertical-align:top;}.yui-skin-sam .yui-navset .yui-navset-bottom .yui-nav a em,.yui-skin-sam .yui-navset-bottom .yui-nav a em{border-width:0 0 1px;top:auto;bottom:-1px;} +.yui-skin-sam .yui-navset-bottom .yui-content,.yui-skin-sam .yui-navset .yui-navset-bottom .yui-content{border:1px solid #808080;border-bottom-color:#243356;} +.ygtvitem{}.ygtvitem table{margin-bottom:0;border:none;}.ygtvrow td{border:none;padding:0;}.ygtvrow td a{text-decoration:none;}.ygtvtn{width:18px;height:22px;background:url(treeview-sprite.gif) 0 -5600px no-repeat;}.ygtvtm{width:18px;height:22px;cursor:pointer;background:url(treeview-sprite.gif) 0 -4000px no-repeat;}.ygtvtmh,.ygtvtmhh{width:18px;height:22px;cursor:pointer;background:url(treeview-sprite.gif) 0 -4800px no-repeat;}.ygtvtp{width:18px;height:22px;cursor:pointer;background:url(treeview-sprite.gif) 0 -6400px no-repeat;}.ygtvtph,.ygtvtphh{width:18px;height:22px;cursor:pointer;background:url(treeview-sprite.gif) 0 -7200px no-repeat;}.ygtvln{width:18px;height:22px;background:url(treeview-sprite.gif) 0 -1600px no-repeat;}.ygtvlm{width:18px;height:22px;cursor:pointer;background:url(treeview-sprite.gif) 0 0px no-repeat;}.ygtvlmh,.ygtvlmhh{width:18px;height:22px;cursor:pointer;background:url(treeview-sprite.gif) 0 -800px no-repeat;}.ygtvlp{width:18px;height:22px;cursor:pointer;background:url(treeview-sprite.gif) 0 -2400px no-repeat;}.ygtvlph,.ygtvlphh{width:18px;height:22px;cursor:pointer;background:url(treeview-sprite.gif) 0 -3200px no-repeat;}.ygtvloading{width:18px;height:22px;background:url(treeview-loading.gif) 0 0 no-repeat;}.ygtvdepthcell{width:18px;height:22px;background:url(treeview-sprite.gif) 0 -8000px no-repeat;}.ygtvblankdepthcell{width:18px;height:22px;}.ygtvchildren{}* html .ygtvchildren{height:2%;}.ygtvlabel,.ygtvlabel:link,.ygtvlabel:visited,.ygtvlabel:hover{margin-left:2px;text-decoration:none;background-color:white;cursor:pointer;}.ygtvcontent{cursor:default;}.ygtvspacer{height:22px;width:12px;}.ygtvfocus{background-color:#c0e0e0;border:none;}.ygtvfocus .ygtvlabel,.ygtvfocus .ygtvlabel:link,.ygtvfocus .ygtvlabel:visited,.ygtvfocus .ygtvlabel:hover{background-color:#c0e0e0;}.ygtvfocus a,.ygtvrow td a{outline-style:none;}.ygtvok{width:18px;height:22px;background:url(treeview-sprite.gif) 0 -8800px no-repeat;}.ygtvok:hover{background:url(treeview-sprite.gif) 0 -8844px no-repeat;}.ygtvcancel{width:18px;height:22px;background:url(treeview-sprite.gif) 0 -8822px no-repeat;}.ygtvcancel:hover{background:url(treeview-sprite.gif) 0 -8866px no-repeat;}.ygtv-label-editor{background-color:#f2f2f2;border:1px solid silver;position:absolute;display:none;overflow:hidden;margin:auto;z-index:9000;}.ygtv-edit-TextNode{width:190px;}.ygtv-edit-TextNode .ygtvcancel,.ygtv-edit-TextNode .ygtvok{border:none;}.ygtv-edit-TextNode .ygtv-button-container{float:right;}.ygtv-edit-TextNode .ygtv-input input{width:140px;}.ygtv-edit-DateNode .ygtvcancel{border:none;}.ygtv-edit-DateNode .ygtvok{display:none;}.ygtv-edit-DateNode .ygtv-button-container{text-align:right;margin:auto;} + diff --git a/public/css/yui/build/assets/skins/sam/slider.css b/public/css/yui/build/assets/skins/sam/slider.css new file mode 100644 index 000000000..b0b336a4c --- /dev/null +++ b/public/css/yui/build/assets/skins/sam/slider.css @@ -0,0 +1,7 @@ +/* +Copyright (c) 2009, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.7.0 +*/ +.yui-h-slider,.yui-v-slider{position:relative;}.yui-h-slider .yui-slider-thumb,.yui-v-slider .yui-slider-thumb{position:absolute;cursor:default;}.yui-skin-sam .yui-h-slider{background:url(bg-h.gif) no-repeat 5px 0;height:28px;width:228px;}.yui-skin-sam .yui-h-slider .yui-slider-thumb{top:4px;}.yui-skin-sam .yui-v-slider{background:url(bg-v.gif) no-repeat 12px 0;height:228px;width:48px;} diff --git a/public/css/yui/build/assets/skins/sam/split-button-arrow-active.png b/public/css/yui/build/assets/skins/sam/split-button-arrow-active.png new file mode 100644 index 0000000000000000000000000000000000000000..fa58c5030e76082c84e38342cf6722c723ad2fd2 GIT binary patch literal 280 zcmV+z0q6dSP)N~-|K;%i-0c73 z@c-iO|KRQa-|hd~QeFE1003M`L_t(|+U&?l5`sVg1i`WZK}Epr|6dhmytLs92=mel z9uoULP6;mwyM%qhIpHzkHQ|(SNO(*5TD8?y@wq9xG<+26t_AN^`$=39HtEMPCOjwP e%l`;(0R{kdKn;SADLBOd00006$Gh9E#3p9{H-P6S}q~camLV^=3&tj%#_Xa_x2_Xl57U&w-9pX85Q9;Im dv4Me^VIeE)+1pK9I)PdkJYD@<);T3K0RYcxInw|D literal 0 HcmV?d00001 diff --git a/public/css/yui/build/assets/skins/sam/split-button-arrow-focus.png b/public/css/yui/build/assets/skins/sam/split-button-arrow-focus.png new file mode 100644 index 0000000000000000000000000000000000000000..167d71eb721ba9b85c6601f9077d5c39faa4ebd2 GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^0zhoU!3-pmJXhxdDVB6cUq=RpYd5a=M;HP5k|nMY zCBgY=CFO}lsSJ)O`AMk?p1FzXsX?iUDV2pMQ*D5XI0Jk_Tx)0S05bpo|DSu#^)isf zToU9L{Qp10^;5h+0~ypkT^vIyZY3ooII;39W@>hC5M-JVa^Poyu7TYlo?{mkWE>b9 b7?>Frva+7N-L$0>sD;7P)z4*}Q$iB}D9ShR literal 0 HcmV?d00001 diff --git a/public/css/yui/build/assets/skins/sam/split-button-arrow-hover.png b/public/css/yui/build/assets/skins/sam/split-button-arrow-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..167d71eb721ba9b85c6601f9077d5c39faa4ebd2 GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^0zhoU!3-pmJXhxdDVB6cUq=RpYd5a=M;HP5k|nMY zCBgY=CFO}lsSJ)O`AMk?p1FzXsX?iUDV2pMQ*D5XI0Jk_Tx)0S05bpo|DSu#^)isf zToU9L{Qp10^;5h+0~ypkT^vIyZY3ooII;39W@>hC5M-JVa^Poyu7TYlo?{mkWE>b9 b7?>Frva+7N-L$0>sD;7P)z4*}Q$iB}D9ShR literal 0 HcmV?d00001 diff --git a/public/css/yui/build/assets/skins/sam/split-button-arrow.png b/public/css/yui/build/assets/skins/sam/split-button-arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..b33a93ff2dc2039bd24e4ea3b75ecf4bb3295f84 GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^0zhoU!3-pmJXhxdDVB6cUq=RpYd5a=M;HP5k|nMY zCBgY=CFO}lsSJ)O`AMk?p1FzXsX?iUDV2pMQ*D5XI0Jk_TpJo1fXx5@|JyBHuocK+ zE(!7r{{Nrh`YB$Zfeh-NE{-7;w~`VPoLG4lGc~(62r^9wIqgTe~DWM4f1sXSq literal 0 HcmV?d00001 diff --git a/public/css/yui/build/assets/skins/sam/sprite.png b/public/css/yui/build/assets/skins/sam/sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..73634d6a22c4377060f49217b63f31b59fe22d51 GIT binary patch literal 3745 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 literal 0 HcmV?d00001 diff --git a/public/css/yui/build/assets/skins/sam/sprite.psd b/public/css/yui/build/assets/skins/sam/sprite.psd new file mode 100644 index 0000000000000000000000000000000000000000..fff2c3471308fed4c93ef4961ea1cd729b41bdca GIT binary patch literal 118162 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 literal 0 HcmV?d00001 diff --git a/public/css/yui/build/assets/skins/sam/tabview.css b/public/css/yui/build/assets/skins/sam/tabview.css new file mode 100644 index 000000000..99b9bfd52 --- /dev/null +++ b/public/css/yui/build/assets/skins/sam/tabview.css @@ -0,0 +1,8 @@ +/* +Copyright (c) 2009, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.7.0 +*/ +.yui-navset .yui-nav li,.yui-navset .yui-navset-top .yui-nav li,.yui-navset .yui-navset-bottom .yui-nav li{margin:0 .5em 0 0;}.yui-navset-left .yui-nav li,.yui-navset-right .yui-nav li{margin:0 0 .5em;}.yui-navset .yui-content .yui-hidden{position:absolute;left:-999999px;visibility:hidden;}.yui-navset .yui-navset-left .yui-nav,.yui-navset .yui-navset-right .yui-nav,.yui-navset-left .yui-nav,.yui-navset-right .yui-nav{width:6em;}.yui-navset-top .yui-nav,.yui-navset-bottom .yui-nav{width:auto;}.yui-navset .yui-navset-left,.yui-navset-left{padding:0 0 0 6em;}.yui-navset-right{padding:0 6em 0 0;}.yui-navset-top,.yui-navset-bottom{padding:auto;}.yui-nav,.yui-nav li{margin:0;padding:0;list-style:none;}.yui-navset li em{font-style:normal;}.yui-navset{position:relative;zoom:1;}.yui-navset .yui-content,.yui-navset .yui-content div{zoom:1;}.yui-navset .yui-content:after{content:'';display:block;clear:both;}.yui-navset .yui-nav li,.yui-navset .yui-navset-top .yui-nav li,.yui-navset .yui-navset-bottom .yui-nav li{display:inline-block;display:-moz-inline-stack;*display:inline;vertical-align:bottom;cursor:pointer;zoom:1;}.yui-navset-left .yui-nav li,.yui-navset-right .yui-nav li{display:block;}.yui-navset .yui-nav a{position:relative;}.yui-navset .yui-nav li a,.yui-navset-top .yui-nav li a,.yui-navset-bottom .yui-nav li a{display:block;display:inline-block;vertical-align:bottom;zoom:1;}.yui-navset-left .yui-nav li a,.yui-navset-right .yui-nav li a{display:block;}.yui-navset-bottom .yui-nav li a{vertical-align:text-top;}.yui-navset .yui-nav li a em,.yui-navset-top .yui-nav li a em,.yui-navset-bottom .yui-nav li a em{display:block;}.yui-navset .yui-navset-left .yui-nav,.yui-navset .yui-navset-right .yui-nav,.yui-navset-left .yui-nav,.yui-navset-right .yui-nav{position:absolute;z-index:1;}.yui-navset-top .yui-nav,.yui-navset-bottom .yui-nav{position:static;}.yui-navset .yui-navset-left .yui-nav,.yui-navset-left .yui-nav{left:0;right:auto;}.yui-navset .yui-navset-right .yui-nav,.yui-navset-right .yui-nav{right:0;left:auto;}.yui-skin-sam .yui-navset .yui-nav,.yui-skin-sam .yui-navset .yui-navset-top .yui-nav{border:solid #2647a0;border-width:0 0 5px;zoom:1;}.yui-skin-sam .yui-navset .yui-nav li,.yui-skin-sam .yui-navset .yui-navset-top .yui-nav li{margin:0 .16em 0 0;padding:1px 0 0;zoom:1;}.yui-skin-sam .yui-navset .yui-nav .selected,.yui-skin-sam .yui-navset .yui-navset-top .yui-nav .selected{margin:0 .16em -1px 0;}.yui-skin-sam .yui-navset .yui-nav a,.yui-skin-sam .yui-navset .yui-navset-top .yui-nav a{background:#d8d8d8 url(sprite.png) repeat-x;border:solid #a3a3a3;border-width:0 1px;color:#000;position:relative;text-decoration:none;}.yui-skin-sam .yui-navset .yui-nav a em,.yui-skin-sam .yui-navset .yui-navset-top .yui-nav a em{border:solid #a3a3a3;border-width:1px 0 0;cursor:hand;padding:.25em .75em;left:0;right:0;bottom:0;top:-1px;position:relative;}.yui-skin-sam .yui-navset .yui-nav .selected a,.yui-skin-sam .yui-navset .yui-nav .selected a:focus,.yui-skin-sam .yui-navset .yui-nav .selected a:hover{background:#2647a0 url(sprite.png) repeat-x left -1400px;color:#fff;}.yui-skin-sam .yui-navset .yui-nav a:hover,.yui-skin-sam .yui-navset .yui-nav a:focus{background:#bfdaff url(sprite.png) repeat-x left -1300px;outline:0;}.yui-skin-sam .yui-navset .yui-nav .selected a em{padding:.35em .75em;}.yui-skin-sam .yui-navset .yui-nav .selected a,.yui-skin-sam .yui-navset .yui-nav .selected a em{border-color:#243356;}.yui-skin-sam .yui-navset .yui-content{background:#edf5ff;}.yui-skin-sam .yui-navset .yui-content,.yui-skin-sam .yui-navset .yui-navset-top .yui-content{border:1px solid #808080;border-top-color:#243356;padding:.25em .5em;}.yui-skin-sam .yui-navset-left .yui-nav,.yui-skin-sam .yui-navset .yui-navset-left .yui-nav,.yui-skin-sam .yui-navset .yui-navset-right .yui-nav,.yui-skin-sam .yui-navset-right .yui-nav{border-width:0 5px 0 0;Xposition:absolute;top:0;bottom:0;}.yui-skin-sam .yui-navset .yui-navset-right .yui-nav,.yui-skin-sam .yui-navset-right .yui-nav{border-width:0 0 0 5px;}.yui-skin-sam .yui-navset-left .yui-nav li,.yui-skin-sam .yui-navset .yui-navset-left .yui-nav li,.yui-skin-sam .yui-navset-right .yui-nav li{margin:0 0 .16em;padding:0 0 0 1px;}.yui-skin-sam .yui-navset-right .yui-nav li{padding:0 1px 0 0;}.yui-skin-sam .yui-navset-left .yui-nav .selected,.yui-skin-sam .yui-navset .yui-navset-left .yui-nav .selected{margin:0 -1px .16em 0;}.yui-skin-sam .yui-navset-right .yui-nav .selected{margin:0 0 .16em -1px;}.yui-skin-sam .yui-navset-left .yui-nav a,.yui-skin-sam .yui-navset-right .yui-nav a{border-width:1px 0;}.yui-skin-sam .yui-navset-left .yui-nav a em,.yui-skin-sam .yui-navset .yui-navset-left .yui-nav a em,.yui-skin-sam .yui-navset-right .yui-nav a em{border-width:0 0 0 1px;padding:.2em .75em;top:auto;left:-1px;}.yui-skin-sam .yui-navset-right .yui-nav a em{border-width:0 1px 0 0;left:auto;right:-1px;}.yui-skin-sam .yui-navset-left .yui-nav a,.yui-skin-sam .yui-navset-left .yui-nav .selected a,.yui-skin-sam .yui-navset-left .yui-nav a:hover,.yui-skin-sam .yui-navset-right .yui-nav a,.yui-skin-sam .yui-navset-right .yui-nav .selected a,.yui-skin-sam .yui-navset-right .yui-nav a:hover,.yui-skin-sam .yui-navset-bottom .yui-nav a,.yui-skin-sam .yui-navset-bottom .yui-nav .selected a,.yui-skin-sam .yui-navset-bottom .yui-nav a:hover{background-image:none;}.yui-skin-sam .yui-navset-left .yui-content{border:1px solid #808080;border-left-color:#243356;}.yui-skin-sam .yui-navset-bottom .yui-nav,.yui-skin-sam .yui-navset .yui-navset-bottom .yui-nav{border-width:5px 0 0;}.yui-skin-sam .yui-navset .yui-navset-bottom .yui-nav .selected,.yui-skin-sam .yui-navset-bottom .yui-nav .selected{margin:-1px .16em 0 0;}.yui-skin-sam .yui-navset .yui-navset-bottom .yui-nav li,.yui-skin-sam .yui-navset-bottom .yui-nav li{padding:0 0 1px 0;vertical-align:top;}.yui-skin-sam .yui-navset .yui-navset-bottom .yui-nav a em,.yui-skin-sam .yui-navset-bottom .yui-nav a em{border-width:0 0 1px;top:auto;bottom:-1px;} +.yui-skin-sam .yui-navset-bottom .yui-content,.yui-skin-sam .yui-navset .yui-navset-bottom .yui-content{border:1px solid #808080;border-bottom-color:#243356;} diff --git a/public/css/yui/build/assets/skins/sam/treeview-loading.gif b/public/css/yui/build/assets/skins/sam/treeview-loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..0bbf3bc0c0e5e635553e8d1bf9ceddefbc402396 GIT binary patch literal 2673 zcmchY_gj;P7RTSb83YJ1>=8y5ONL=ZcEgk+C?FydumNNz8c=c6`n&|fmMu_HHG%^w zNLVjHyfy)hAgHK_Kxkz+0Ktm5M|X*?y?g!o_3yv`{_^F^wY9YuFJ3GxEUd1s-nnz<)vH(c?%i8n zUVirM+2rIT007UQKY#e};oRKZty{MqJa}MhYina;bNBAu-+udTYHDhBcJ|n@WA*j* z-+lL;iHS*OX6D|#dm|zu!o$ON?b=mbT)bh!26uP&kdP1u2Zx!N8486$B9X?&$DclZ zdgI28>FMdk#l`#g@Bj4EPc=0)2M!!4EG!%z9?s6rzI5r**|TSdhK8)HtXf)HHgDc+ zZEek9Fk)k4xm@nHZQC3j9o^jACMG6~jg9m3^EYnX2*Yq^XJ>6~?X_#y4jnqQbLUQp zM6z$+zMp^o*}}p?p-?n8H=jOzx~Zv&N~Km+RkgLX9X@>c=FOXxm6dsUd1NvZ zX=yul?BMZua=F~p)O7py?EwJ+w{PD*dGh2hzx?v((WCP6au$mb!vmnqSpF6-9Ona(JQT#e>!KODwxYzG5#S|?M#v6eD#mgO^`=~9EL;yL&>*dd5*+XG=_`^3=CG25PbLa+LJ%N(PW_s z=_-TaM{SB!w(n7k+dMDN2G6VPqUA$u7F4m@ABAZ1D`*UMfe}E6csJU}J1Trmp#~7hZ5QSGpNvd1Uz$!Rf3q28pgSj9o zx?zwoWa8GYK@TOz^)mp#V2_VR5WfJ0W9BSSbn+cKb z7B9l9)K#s!?PSt;g%c8u;y7rd?hkP%>vq5BY=N>c=98V=+T&RSPgSu|E(FAK>B?vNN1 zPszwcbxJ?Oh|1pGd!9?gxzSWOR8o=x5!rGh+6r3hBL-14aTaAQxvJ|Y-S_m4niV2S zK@?}-9Dkhg<+w{Ny!vjyp-QmjyGmIW1DFB{k>P2=8cm~9M^_P#8?JFDumGEPaqJvf zZ{f;B#CG;H7q8a_hQ$pR6%%6So8vKM+W+cNPE_TI46^dn9q@qBr@1bUgxcPGB*b-i z3Hx_0(Esy5KKx^Y0yfgB6~}t>@!ctk>J|!vgVRhE2CPQ;AOKY2y%5nM@YF^ZMS~q}%L-n>Lpor#4w48UHYViOt={{43LMRvkIp+rkbs*s; z14}4q0y6`s8DL?uo-~*R@5tnFsC1DR#BGxT8fA20u_o?`0iDNI6lf;^$@AkR1dPTz z>XF1ZAqNjU95c@Vn59Wo;Z6b(YG+L$xy3(?j2I*vQ>PmzMEdh`yw3=)E}JYMDG|*x mDkGVJ;D)fXhxDI?kcM(ish)HppA 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 U{p-H~9KZ}Pzz8h7+YkZ(JNT^25dZ)H literal 0 HcmV?d00001 diff --git a/public/css/yui/build/assets/skins/sam/treeview.css b/public/css/yui/build/assets/skins/sam/treeview.css new file mode 100644 index 000000000..3f3e2a6ad --- /dev/null +++ b/public/css/yui/build/assets/skins/sam/treeview.css @@ -0,0 +1,7 @@ +/* +Copyright (c) 2009, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.7.0 +*/ +.ygtvitem{}.ygtvitem table{margin-bottom:0;border:none;}.ygtvrow td{border:none;padding:0;}.ygtvrow td a{text-decoration:none;}.ygtvtn{width:18px;height:22px;background:url(treeview-sprite.gif) 0 -5600px no-repeat;}.ygtvtm{width:18px;height:22px;cursor:pointer;background:url(treeview-sprite.gif) 0 -4000px no-repeat;}.ygtvtmh,.ygtvtmhh{width:18px;height:22px;cursor:pointer;background:url(treeview-sprite.gif) 0 -4800px no-repeat;}.ygtvtp{width:18px;height:22px;cursor:pointer;background:url(treeview-sprite.gif) 0 -6400px no-repeat;}.ygtvtph,.ygtvtphh{width:18px;height:22px;cursor:pointer;background:url(treeview-sprite.gif) 0 -7200px no-repeat;}.ygtvln{width:18px;height:22px;background:url(treeview-sprite.gif) 0 -1600px no-repeat;}.ygtvlm{width:18px;height:22px;cursor:pointer;background:url(treeview-sprite.gif) 0 0px no-repeat;}.ygtvlmh,.ygtvlmhh{width:18px;height:22px;cursor:pointer;background:url(treeview-sprite.gif) 0 -800px no-repeat;}.ygtvlp{width:18px;height:22px;cursor:pointer;background:url(treeview-sprite.gif) 0 -2400px no-repeat;}.ygtvlph,.ygtvlphh{width:18px;height:22px;cursor:pointer;background:url(treeview-sprite.gif) 0 -3200px no-repeat;}.ygtvloading{width:18px;height:22px;background:url(treeview-loading.gif) 0 0 no-repeat;}.ygtvdepthcell{width:18px;height:22px;background:url(treeview-sprite.gif) 0 -8000px no-repeat;}.ygtvblankdepthcell{width:18px;height:22px;}.ygtvchildren{}* html .ygtvchildren{height:2%;}.ygtvlabel,.ygtvlabel:link,.ygtvlabel:visited,.ygtvlabel:hover{margin-left:2px;text-decoration:none;background-color:white;cursor:pointer;}.ygtvcontent{cursor:default;}.ygtvspacer{height:22px;width:12px;}.ygtvfocus{background-color:#c0e0e0;border:none;}.ygtvfocus .ygtvlabel,.ygtvfocus .ygtvlabel:link,.ygtvfocus .ygtvlabel:visited,.ygtvfocus .ygtvlabel:hover{background-color:#c0e0e0;}.ygtvfocus a,.ygtvrow td a{outline-style:none;}.ygtvok{width:18px;height:22px;background:url(treeview-sprite.gif) 0 -8800px no-repeat;}.ygtvok:hover{background:url(treeview-sprite.gif) 0 -8844px no-repeat;}.ygtvcancel{width:18px;height:22px;background:url(treeview-sprite.gif) 0 -8822px no-repeat;}.ygtvcancel:hover{background:url(treeview-sprite.gif) 0 -8866px no-repeat;}.ygtv-label-editor{background-color:#f2f2f2;border:1px solid silver;position:absolute;display:none;overflow:hidden;margin:auto;z-index:9000;}.ygtv-edit-TextNode{width:190px;}.ygtv-edit-TextNode .ygtvcancel,.ygtv-edit-TextNode .ygtvok{border:none;}.ygtv-edit-TextNode .ygtv-button-container{float:right;}.ygtv-edit-TextNode .ygtv-input input{width:140px;}.ygtv-edit-DateNode .ygtvcancel{border:none;}.ygtv-edit-DateNode .ygtvok{display:none;}.ygtv-edit-DateNode .ygtv-button-container{text-align:right;margin:auto;} diff --git a/public/css/yui/build/assets/skins/sam/wait.gif b/public/css/yui/build/assets/skins/sam/wait.gif new file mode 100644 index 0000000000000000000000000000000000000000..471c1a4f93f2cabf0b3a85c3ff8e0a8aadefc548 GIT binary patch literal 1100 zcmZwFZA@EL90u^)S14;kcS~P51JcqXyBK7YjR|$m*3qt)1nqFnf*+(nyIT_zZIrbc zP70+hE$ePOAcE2K4FU;V;KM+=xUiQtnG(k(Qx;;(oQVNl47kM11c$9(j7iV=cuw*= z&;L26aeaM*8AVX!4nUmF3luezO5JukyN8Fbj*JY)E9#Hd|0*@ZIv{eO*Nb# z12yCIrOhLLJlbn33DTB}t(F_b2bV4~y*j=}%v9m90(t13QX1^b_==P$D+H{5*5Mu? z8gKY>BXXf^7@!+sCzFj+>XgJsqfc(1Ya(r=#J=3 zlZtj9{~(p*xA$9X2mMtN6e0bM#^36uHAhJ9Q&;+@HQ_ThCJ=yPPcaaStzMs1DHP_0 zvw_E92pgO+s83$0SnZp{u*pvQ$A3#Rftg(VD(=52XCTzUftd4T-22$PQrgIR*gHx4 z{43C_yk?5j?(i$Mual4dFf?{<9Wn}qfaB%>iNwkdu&q!m&h2IcZ$2Th!C8}<*_&Pr zyKl`OZw8N)3D^4?RK}UoD=o00gbKYHy=yv32mZ9Dl8aIS8x^Z$2?NwcBLzFmZOtoW zzN62&u*QDIz{Fy}^YAXY&Txmg7ATSAhAr8K5fZbFZ*SFa$_qE2L|VVFHOI{wKE8B_ zGXV2p-56OO`rc4Z7g3zbj)2_3YjK$((`OUqD%*mgvS`YELYsVW1or1)YW%;)D$oE>#r zQ3z|D(W$Eg`c?NY^+fD&+nctrc25@u47U__J8-QW7NqK!$T9C@*SpuaHyFRRpIGae rj_Lao#za}+eaj_<`F9!mRdtBiaY8;H + *
  • Navigate with up/down arrow keys and/or mouse to pick a selection
  • + *
  • The drop down container can "roll down" or "fly out" via configurable + * animation
  • + *
  • UI look-and-feel customizable through CSS, including container + * attributes, borders, position, fonts, etc
  • + * + * + * @class AutoComplete + * @constructor + * @param elInput {HTMLElement} DOM element reference of an input field. + * @param elInput {String} String ID of an input field. + * @param elContainer {HTMLElement} DOM element reference of an existing DIV. + * @param elContainer {String} String ID of an existing DIV. + * @param oDataSource {YAHOO.widget.DataSource} DataSource instance. + * @param oConfigs {Object} (optional) Object literal of configuration params. + */ +YAHOO.widget.AutoComplete = function(elInput,elContainer,oDataSource,oConfigs) { + if(elInput && elContainer && oDataSource) { + // Validate DataSource + if(oDataSource instanceof YAHOO.util.DataSourceBase) { + this.dataSource = oDataSource; + } + else { + YAHOO.log("Could not instantiate AutoComplete due to an invalid DataSource", "error", this.toString()); + return; + } + + // YAHOO.widget.DataSource schema backwards compatibility + // Converted deprecated schema into supported schema + // First assume key data is held in position 0 of results array + this.key = 0; + var schema = oDataSource.responseSchema; + // An old school schema has been defined in the deprecated DataSource constructor + if(oDataSource._aDeprecatedSchema) { + var aDeprecatedSchema = oDataSource._aDeprecatedSchema; + if(YAHOO.lang.isArray(aDeprecatedSchema)) { + + if((oDataSource.responseType === YAHOO.util.DataSourceBase.TYPE_JSON) || + (oDataSource.responseType === YAHOO.util.DataSourceBase.TYPE_UNKNOWN)) { // Used to default to unknown + // Store the resultsList + schema.resultsList = aDeprecatedSchema[0]; + // Store the key + this.key = aDeprecatedSchema[1]; + // Only resultsList and key are defined, so grab all the data + schema.fields = (aDeprecatedSchema.length < 3) ? null : aDeprecatedSchema.slice(1); + } + else if(oDataSource.responseType === YAHOO.util.DataSourceBase.TYPE_XML) { + schema.resultNode = aDeprecatedSchema[0]; + this.key = aDeprecatedSchema[1]; + schema.fields = aDeprecatedSchema.slice(1); + } + else if(oDataSource.responseType === YAHOO.util.DataSourceBase.TYPE_TEXT) { + schema.recordDelim = aDeprecatedSchema[0]; + schema.fieldDelim = aDeprecatedSchema[1]; + } + oDataSource.responseSchema = schema; + } + } + + // Validate input element + if(YAHOO.util.Dom.inDocument(elInput)) { + if(YAHOO.lang.isString(elInput)) { + this._sName = "instance" + YAHOO.widget.AutoComplete._nIndex + " " + elInput; + this._elTextbox = document.getElementById(elInput); + } + else { + this._sName = (elInput.id) ? + "instance" + YAHOO.widget.AutoComplete._nIndex + " " + elInput.id: + "instance" + YAHOO.widget.AutoComplete._nIndex; + this._elTextbox = elInput; + } + YAHOO.util.Dom.addClass(this._elTextbox, "yui-ac-input"); + } + else { + YAHOO.log("Could not instantiate AutoComplete due to an invalid input element", "error", this.toString()); + return; + } + + // Validate container element + if(YAHOO.util.Dom.inDocument(elContainer)) { + if(YAHOO.lang.isString(elContainer)) { + this._elContainer = document.getElementById(elContainer); + } + else { + this._elContainer = elContainer; + } + if(this._elContainer.style.display == "none") { + YAHOO.log("The container may not display properly if display is set to \"none\" in CSS", "warn", this.toString()); + } + + // For skinning + var elParent = this._elContainer.parentNode; + var elTag = elParent.tagName.toLowerCase(); + if(elTag == "div") { + YAHOO.util.Dom.addClass(elParent, "yui-ac"); + } + else { + YAHOO.log("Could not find the wrapper element for skinning", "warn", this.toString()); + } + } + else { + YAHOO.log("Could not instantiate AutoComplete due to an invalid container element", "error", this.toString()); + return; + } + + // Default applyLocalFilter setting is to enable for local sources + if(this.dataSource.dataType === YAHOO.util.DataSourceBase.TYPE_LOCAL) { + this.applyLocalFilter = true; + } + + // Set any config params passed in to override defaults + if(oConfigs && (oConfigs.constructor == Object)) { + for(var sConfig in oConfigs) { + if(sConfig) { + this[sConfig] = oConfigs[sConfig]; + } + } + } + + // Initialization sequence + this._initContainerEl(); + this._initProps(); + this._initListEl(); + this._initContainerHelperEls(); + + // Set up events + var oSelf = this; + var elTextbox = this._elTextbox; + + // Dom events + YAHOO.util.Event.addListener(elTextbox,"keyup",oSelf._onTextboxKeyUp,oSelf); + YAHOO.util.Event.addListener(elTextbox,"keydown",oSelf._onTextboxKeyDown,oSelf); + YAHOO.util.Event.addListener(elTextbox,"focus",oSelf._onTextboxFocus,oSelf); + YAHOO.util.Event.addListener(elTextbox,"blur",oSelf._onTextboxBlur,oSelf); + YAHOO.util.Event.addListener(elContainer,"mouseover",oSelf._onContainerMouseover,oSelf); + YAHOO.util.Event.addListener(elContainer,"mouseout",oSelf._onContainerMouseout,oSelf); + YAHOO.util.Event.addListener(elContainer,"click",oSelf._onContainerClick,oSelf); + YAHOO.util.Event.addListener(elContainer,"scroll",oSelf._onContainerScroll,oSelf); + YAHOO.util.Event.addListener(elContainer,"resize",oSelf._onContainerResize,oSelf); + YAHOO.util.Event.addListener(elTextbox,"keypress",oSelf._onTextboxKeyPress,oSelf); + YAHOO.util.Event.addListener(window,"unload",oSelf._onWindowUnload,oSelf); + + // Custom events + this.textboxFocusEvent = new YAHOO.util.CustomEvent("textboxFocus", this); + this.textboxKeyEvent = new YAHOO.util.CustomEvent("textboxKey", this); + this.dataRequestEvent = new YAHOO.util.CustomEvent("dataRequest", this); + this.dataReturnEvent = new YAHOO.util.CustomEvent("dataReturn", this); + this.dataErrorEvent = new YAHOO.util.CustomEvent("dataError", this); + this.containerPopulateEvent = new YAHOO.util.CustomEvent("containerPopulate", this); + this.containerExpandEvent = new YAHOO.util.CustomEvent("containerExpand", this); + this.typeAheadEvent = new YAHOO.util.CustomEvent("typeAhead", this); + this.itemMouseOverEvent = new YAHOO.util.CustomEvent("itemMouseOver", this); + this.itemMouseOutEvent = new YAHOO.util.CustomEvent("itemMouseOut", this); + this.itemArrowToEvent = new YAHOO.util.CustomEvent("itemArrowTo", this); + this.itemArrowFromEvent = new YAHOO.util.CustomEvent("itemArrowFrom", this); + this.itemSelectEvent = new YAHOO.util.CustomEvent("itemSelect", this); + this.unmatchedItemSelectEvent = new YAHOO.util.CustomEvent("unmatchedItemSelect", this); + this.selectionEnforceEvent = new YAHOO.util.CustomEvent("selectionEnforce", this); + this.containerCollapseEvent = new YAHOO.util.CustomEvent("containerCollapse", this); + this.textboxBlurEvent = new YAHOO.util.CustomEvent("textboxBlur", this); + this.textboxChangeEvent = new YAHOO.util.CustomEvent("textboxChange", this); + + // Finish up + elTextbox.setAttribute("autocomplete","off"); + YAHOO.widget.AutoComplete._nIndex++; + YAHOO.log("AutoComplete initialized","info",this.toString()); + } + // Required arguments were not found + else { + YAHOO.log("Could not instantiate AutoComplete due invalid arguments", "error", this.toString()); + } +}; + +///////////////////////////////////////////////////////////////////////////// +// +// Public member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * The DataSource object that encapsulates the data used for auto completion. + * This object should be an inherited object from YAHOO.widget.DataSource. + * + * @property dataSource + * @type YAHOO.widget.DataSource + */ +YAHOO.widget.AutoComplete.prototype.dataSource = null; + +/** + * By default, results from local DataSources will pass through the filterResults + * method to apply a client-side matching algorithm. + * + * @property applyLocalFilter + * @type Boolean + * @default true for local arrays and json, otherwise false + */ +YAHOO.widget.AutoComplete.prototype.applyLocalFilter = null; + +/** + * When applyLocalFilter is true, the local filtering algorthim can have case sensitivity + * enabled. + * + * @property queryMatchCase + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.queryMatchCase = false; + +/** + * When applyLocalFilter is true, results can be locally filtered to return + * matching strings that "contain" the query string rather than simply "start with" + * the query string. + * + * @property queryMatchContains + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.queryMatchContains = false; + +/** + * Enables query subset matching. When the DataSource's cache is enabled and queryMatchSubset is + * true, substrings of queries will return matching cached results. For + * instance, if the first query is for "abc" susequent queries that start with + * "abc", like "abcd", will be queried against the cache, and not the live data + * source. Recommended only for DataSources that return comprehensive results + * for queries with very few characters. + * + * @property queryMatchSubset + * @type Boolean + * @default false + * + */ +YAHOO.widget.AutoComplete.prototype.queryMatchSubset = false; + +/** + * Number of characters that must be entered before querying for results. A negative value + * effectively turns off the widget. A value of 0 allows queries of null or empty string + * values. + * + * @property minQueryLength + * @type Number + * @default 1 + */ +YAHOO.widget.AutoComplete.prototype.minQueryLength = 1; + +/** + * Maximum number of results to display in results container. + * + * @property maxResultsDisplayed + * @type Number + * @default 10 + */ +YAHOO.widget.AutoComplete.prototype.maxResultsDisplayed = 10; + +/** + * Number of seconds to delay before submitting a query request. If a query + * request is received before a previous one has completed its delay, the + * previous request is cancelled and the new request is set to the delay. If + * typeAhead is also enabled, this value must always be less than the typeAheadDelay + * in order to avoid certain race conditions. + * + * @property queryDelay + * @type Number + * @default 0.2 + */ +YAHOO.widget.AutoComplete.prototype.queryDelay = 0.2; + +/** + * If typeAhead is true, number of seconds to delay before updating input with + * typeAhead value. In order to prevent certain race conditions, this value must + * always be greater than the queryDelay. + * + * @property typeAheadDelay + * @type Number + * @default 0.5 + */ +YAHOO.widget.AutoComplete.prototype.typeAheadDelay = 0.5; + +/** + * When IME usage is detected, AutoComplete will switch to querying the input + * value at the given interval rather than per key event. + * + * @property queryInterval + * @type Number + * @default 500 + */ +YAHOO.widget.AutoComplete.prototype.queryInterval = 500; + +/** + * Class name of a highlighted item within results container. + * + * @property highlightClassName + * @type String + * @default "yui-ac-highlight" + */ +YAHOO.widget.AutoComplete.prototype.highlightClassName = "yui-ac-highlight"; + +/** + * Class name of a pre-highlighted item within results container. + * + * @property prehighlightClassName + * @type String + */ +YAHOO.widget.AutoComplete.prototype.prehighlightClassName = null; + +/** + * Query delimiter. A single character separator for multiple delimited + * selections. Multiple delimiter characteres may be defined as an array of + * strings. A null value or empty string indicates that query results cannot + * be delimited. This feature is not recommended if you need forceSelection to + * be true. + * + * @property delimChar + * @type String | String[] + */ +YAHOO.widget.AutoComplete.prototype.delimChar = null; + +/** + * Whether or not the first item in results container should be automatically highlighted + * on expand. + * + * @property autoHighlight + * @type Boolean + * @default true + */ +YAHOO.widget.AutoComplete.prototype.autoHighlight = true; + +/** + * If autohighlight is enabled, whether or not the input field should be automatically updated + * with the first query result as the user types, auto-selecting the substring portion + * of the first result that the user has not yet typed. + * + * @property typeAhead + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.typeAhead = false; + +/** + * Whether or not to animate the expansion/collapse of the results container in the + * horizontal direction. + * + * @property animHoriz + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.animHoriz = false; + +/** + * Whether or not to animate the expansion/collapse of the results container in the + * vertical direction. + * + * @property animVert + * @type Boolean + * @default true + */ +YAHOO.widget.AutoComplete.prototype.animVert = true; + +/** + * Speed of container expand/collapse animation, in seconds.. + * + * @property animSpeed + * @type Number + * @default 0.3 + */ +YAHOO.widget.AutoComplete.prototype.animSpeed = 0.3; + +/** + * Whether or not to force the user's selection to match one of the query + * results. Enabling this feature essentially transforms the input field into a + * <select> field. This feature is not recommended with delimiter character(s) + * defined. + * + * @property forceSelection + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.forceSelection = false; + +/** + * Whether or not to allow browsers to cache user-typed input in the input + * field. Disabling this feature will prevent the widget from setting the + * autocomplete="off" on the input field. When autocomplete="off" + * and users click the back button after form submission, user-typed input can + * be prefilled by the browser from its cache. This caching of user input may + * not be desired for sensitive data, such as credit card numbers, in which + * case, implementers should consider setting allowBrowserAutocomplete to false. + * + * @property allowBrowserAutocomplete + * @type Boolean + * @default true + */ +YAHOO.widget.AutoComplete.prototype.allowBrowserAutocomplete = true; + +/** + * Enabling this feature prevents the toggling of the container to a collapsed state. + * Setting to true does not automatically trigger the opening of the container. + * Implementers are advised to pre-load the container with an explicit "sendQuery()" call. + * + * @property alwaysShowContainer + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.alwaysShowContainer = false; + +/** + * Whether or not to use an iFrame to layer over Windows form elements in + * IE. Set to true only when the results container will be on top of a + * <select> field in IE and thus exposed to the IE z-index bug (i.e., + * 5.5 < IE < 7). + * + * @property useIFrame + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.useIFrame = false; + +/** + * Whether or not the results container should have a shadow. + * + * @property useShadow + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.useShadow = false; + +/** + * Whether or not the input field should be updated with selections. + * + * @property suppressInputUpdate + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.suppressInputUpdate = false; + +/** + * For backward compatibility to pre-2.6.0 formatResults() signatures, setting + * resultsTypeList to true will take each object literal result returned by + * DataSource and flatten into an array. + * + * @property resultTypeList + * @type Boolean + * @default true + */ +YAHOO.widget.AutoComplete.prototype.resultTypeList = true; + +/** + * For XHR DataSources, AutoComplete will automatically insert a "?" between the server URI and + * the "query" param/value pair. To prevent this behavior, implementers should + * set this value to false. To more fully customize the query syntax, implementers + * should override the generateRequest() method. + * + * @property queryQuestionMark + * @type Boolean + * @default true + */ +YAHOO.widget.AutoComplete.prototype.queryQuestionMark = true; + +///////////////////////////////////////////////////////////////////////////// +// +// Public methods +// +///////////////////////////////////////////////////////////////////////////// + + /** + * Public accessor to the unique name of the AutoComplete instance. + * + * @method toString + * @return {String} Unique name of the AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.toString = function() { + return "AutoComplete " + this._sName; +}; + + /** + * Returns DOM reference to input element. + * + * @method getInputEl + * @return {HTMLELement} DOM reference to input element. + */ +YAHOO.widget.AutoComplete.prototype.getInputEl = function() { + return this._elTextbox; +}; + + /** + * Returns DOM reference to container element. + * + * @method getContainerEl + * @return {HTMLELement} DOM reference to container element. + */ +YAHOO.widget.AutoComplete.prototype.getContainerEl = function() { + return this._elContainer; +}; + + /** + * Returns true if widget instance is currently focused. + * + * @method isFocused + * @return {Boolean} Returns true if widget instance is currently focused. + */ +YAHOO.widget.AutoComplete.prototype.isFocused = function() { + return (this._bFocused === null) ? false : this._bFocused; +}; + + /** + * Returns true if container is in an expanded state, false otherwise. + * + * @method isContainerOpen + * @return {Boolean} Returns true if container is in an expanded state, false otherwise. + */ +YAHOO.widget.AutoComplete.prototype.isContainerOpen = function() { + return this._bContainerOpen; +}; + +/** + * Public accessor to the <ul> element that displays query results within the results container. + * + * @method getListEl + * @return {HTMLElement[]} Reference to <ul> element within the results container. + */ +YAHOO.widget.AutoComplete.prototype.getListEl = function() { + return this._elList; +}; + +/** + * Public accessor to the matching string associated with a given <li> result. + * + * @method getListItemMatch + * @param elListItem {HTMLElement} Reference to <LI> element. + * @return {String} Matching string. + */ +YAHOO.widget.AutoComplete.prototype.getListItemMatch = function(elListItem) { + if(elListItem._sResultMatch) { + return elListItem._sResultMatch; + } + else { + return null; + } +}; + +/** + * Public accessor to the result data associated with a given <li> result. + * + * @method getListItemData + * @param elListItem {HTMLElement} Reference to <LI> element. + * @return {Object} Result data. + */ +YAHOO.widget.AutoComplete.prototype.getListItemData = function(elListItem) { + if(elListItem._oResultData) { + return elListItem._oResultData; + } + else { + return null; + } +}; + +/** + * Public accessor to the index of the associated with a given <li> result. + * + * @method getListItemIndex + * @param elListItem {HTMLElement} Reference to <LI> element. + * @return {Number} Index. + */ +YAHOO.widget.AutoComplete.prototype.getListItemIndex = function(elListItem) { + if(YAHOO.lang.isNumber(elListItem._nItemIndex)) { + return elListItem._nItemIndex; + } + else { + return null; + } +}; + +/** + * Sets HTML markup for the results container header. This markup will be + * inserted within a <div> tag with a class of "yui-ac-hd". + * + * @method setHeader + * @param sHeader {String} HTML markup for results container header. + */ +YAHOO.widget.AutoComplete.prototype.setHeader = function(sHeader) { + if(this._elHeader) { + var elHeader = this._elHeader; + if(sHeader) { + elHeader.innerHTML = sHeader; + elHeader.style.display = "block"; + } + else { + elHeader.innerHTML = ""; + elHeader.style.display = "none"; + } + } +}; + +/** + * Sets HTML markup for the results container footer. This markup will be + * inserted within a <div> tag with a class of "yui-ac-ft". + * + * @method setFooter + * @param sFooter {String} HTML markup for results container footer. + */ +YAHOO.widget.AutoComplete.prototype.setFooter = function(sFooter) { + if(this._elFooter) { + var elFooter = this._elFooter; + if(sFooter) { + elFooter.innerHTML = sFooter; + elFooter.style.display = "block"; + } + else { + elFooter.innerHTML = ""; + elFooter.style.display = "none"; + } + } +}; + +/** + * Sets HTML markup for the results container body. This markup will be + * inserted within a <div> tag with a class of "yui-ac-bd". + * + * @method setBody + * @param sBody {String} HTML markup for results container body. + */ +YAHOO.widget.AutoComplete.prototype.setBody = function(sBody) { + if(this._elBody) { + var elBody = this._elBody; + YAHOO.util.Event.purgeElement(elBody, true); + if(sBody) { + elBody.innerHTML = sBody; + elBody.style.display = "block"; + } + else { + elBody.innerHTML = ""; + elBody.style.display = "none"; + } + this._elList = null; + } +}; + +/** +* A function that converts an AutoComplete query into a request value which is then +* passed to the DataSource's sendRequest method in order to retrieve data for +* the query. By default, returns a String with the syntax: "query={query}" +* Implementers can customize this method for custom request syntaxes. +* +* @method generateRequest +* @param sQuery {String} Query string +* @return {MIXED} Request +*/ +YAHOO.widget.AutoComplete.prototype.generateRequest = function(sQuery) { + var dataType = this.dataSource.dataType; + + // Transform query string in to a request for remote data + // By default, local data doesn't need a transformation, just passes along the query as is. + if(dataType === YAHOO.util.DataSourceBase.TYPE_XHR) { + // By default, XHR GET requests look like "{scriptURI}?{scriptQueryParam}={sQuery}&{scriptQueryAppend}" + if(!this.dataSource.connMethodPost) { + sQuery = (this.queryQuestionMark ? "?" : "") + (this.dataSource.scriptQueryParam || "query") + "=" + sQuery + + (this.dataSource.scriptQueryAppend ? ("&" + this.dataSource.scriptQueryAppend) : ""); + } + // By default, XHR POST bodies are sent to the {scriptURI} like "{scriptQueryParam}={sQuery}&{scriptQueryAppend}" + else { + sQuery = (this.dataSource.scriptQueryParam || "query") + "=" + sQuery + + (this.dataSource.scriptQueryAppend ? ("&" + this.dataSource.scriptQueryAppend) : ""); + } + } + // By default, remote script node requests look like "{scriptURI}&{scriptCallbackParam}={callbackString}&{scriptQueryParam}={sQuery}&{scriptQueryAppend}" + else if(dataType === YAHOO.util.DataSourceBase.TYPE_SCRIPTNODE) { + sQuery = "&" + (this.dataSource.scriptQueryParam || "query") + "=" + sQuery + + (this.dataSource.scriptQueryAppend ? ("&" + this.dataSource.scriptQueryAppend) : ""); + } + + return sQuery; +}; + +/** + * Makes query request to the DataSource. + * + * @method sendQuery + * @param sQuery {String} Query string. + */ +YAHOO.widget.AutoComplete.prototype.sendQuery = function(sQuery) { + // Reset focus for a new interaction + this._bFocused = null; + + // Adjust programatically sent queries to look like they were input by user + // when delimiters are enabled + var newQuery = (this.delimChar) ? this._elTextbox.value + sQuery : sQuery; + this._sendQuery(newQuery); +}; + +/** + * Collapses container. + * + * @method collapseContainer + */ +YAHOO.widget.AutoComplete.prototype.collapseContainer = function() { + this._toggleContainer(false); +}; + +/** + * Handles subset matching for when queryMatchSubset is enabled. + * + * @method getSubsetMatches + * @param sQuery {String} Query string. + * @return {Object} oParsedResponse or null. + */ +YAHOO.widget.AutoComplete.prototype.getSubsetMatches = function(sQuery) { + var subQuery, oCachedResponse, subRequest; + // Loop through substrings of each cached element's query property... + for(var i = sQuery.length; i >= this.minQueryLength ; i--) { + subRequest = this.generateRequest(sQuery.substr(0,i)); + this.dataRequestEvent.fire(this, subQuery, subRequest); + YAHOO.log("Searching for query subset \"" + subQuery + "\" in cache", "info", this.toString()); + + // If a substring of the query is found in the cache + oCachedResponse = this.dataSource.getCachedResponse(subRequest); + if(oCachedResponse) { + YAHOO.log("Found match for query subset \"" + subQuery + "\": " + YAHOO.lang.dump(oCachedResponse), "info", this.toString()); + return this.filterResults.apply(this.dataSource, [sQuery, oCachedResponse, oCachedResponse, {scope:this}]); + } + } + YAHOO.log("Did not find subset match for query subset \"" + sQuery + "\"" , "info", this.toString()); + return null; +}; + +/** + * Executed by DataSource (within DataSource scope via doBeforeParseData()) to + * handle responseStripAfter cleanup. + * + * @method preparseRawResponse + * @param sQuery {String} Query string. + * @return {Object} oParsedResponse or null. + */ +YAHOO.widget.AutoComplete.prototype.preparseRawResponse = function(oRequest, oFullResponse, oCallback) { + var nEnd = ((this.responseStripAfter !== "") && (oFullResponse.indexOf)) ? + oFullResponse.indexOf(this.responseStripAfter) : -1; + if(nEnd != -1) { + oFullResponse = oFullResponse.substring(0,nEnd); + } + return oFullResponse; +}; + +/** + * Executed by DataSource (within DataSource scope via doBeforeCallback()) to + * filter results through a simple client-side matching algorithm. + * + * @method filterResults + * @param sQuery {String} Original request. + * @param oFullResponse {Object} Full response object. + * @param oParsedResponse {Object} Parsed response object. + * @param oCallback {Object} Callback object. + * @return {Object} Filtered response object. + */ + +YAHOO.widget.AutoComplete.prototype.filterResults = function(sQuery, oFullResponse, oParsedResponse, oCallback) { + // If AC has passed a query string value back to itself, grab it + if(oCallback && oCallback.argument && oCallback.argument.query) { + sQuery = oCallback.argument.query; + } + + // Only if a query string is available to match against + if(sQuery && sQuery !== "") { + // First make a copy of the oParseResponse + oParsedResponse = YAHOO.widget.AutoComplete._cloneObject(oParsedResponse); + + var oAC = oCallback.scope, + oDS = this, + allResults = oParsedResponse.results, // the array of results + filteredResults = [], // container for filtered results + bMatchFound = false, + bMatchCase = (oDS.queryMatchCase || oAC.queryMatchCase), // backward compat + bMatchContains = (oDS.queryMatchContains || oAC.queryMatchContains); // backward compat + + // Loop through each result object... + for(var i = allResults.length-1; i >= 0; i--) { + var oResult = allResults[i]; + + // Grab the data to match against from the result object... + var sResult = null; + + // Result object is a simple string already + if(YAHOO.lang.isString(oResult)) { + sResult = oResult; + } + // Result object is an array of strings + else if(YAHOO.lang.isArray(oResult)) { + sResult = oResult[0]; + + } + // Result object is an object literal of strings + else if(this.responseSchema.fields) { + var key = this.responseSchema.fields[0].key || this.responseSchema.fields[0]; + sResult = oResult[key]; + } + // Backwards compatibility + else if(this.key) { + sResult = oResult[this.key]; + } + + if(YAHOO.lang.isString(sResult)) { + + var sKeyIndex = (bMatchCase) ? + sResult.indexOf(decodeURIComponent(sQuery)) : + sResult.toLowerCase().indexOf(decodeURIComponent(sQuery).toLowerCase()); + + // A STARTSWITH match is when the query is found at the beginning of the key string... + if((!bMatchContains && (sKeyIndex === 0)) || + // A CONTAINS match is when the query is found anywhere within the key string... + (bMatchContains && (sKeyIndex > -1))) { + // Stash the match + filteredResults.unshift(oResult); + } + } + } + oParsedResponse.results = filteredResults; + YAHOO.log("Filtered " + filteredResults.length + " results against query \"" + sQuery + "\": " + YAHOO.lang.dump(filteredResults), "info", this.toString()); + } + else { + YAHOO.log("Did not filter results against query", "info", this.toString()); + } + + return oParsedResponse; +}; + +/** + * Handles response for display. This is the callback function method passed to + * YAHOO.util.DataSourceBase#sendRequest so results from the DataSource are + * returned to the AutoComplete instance. + * + * @method handleResponse + * @param sQuery {String} Original request. + * @param oResponse {Object} Response object. + * @param oPayload {MIXED} (optional) Additional argument(s) + */ +YAHOO.widget.AutoComplete.prototype.handleResponse = function(sQuery, oResponse, oPayload) { + if((this instanceof YAHOO.widget.AutoComplete) && this._sName) { + this._populateList(sQuery, oResponse, oPayload); + } +}; + +/** + * Overridable method called before container is loaded with result data. + * + * @method doBeforeLoadData + * @param sQuery {String} Original request. + * @param oResponse {Object} Response object. + * @param oPayload {MIXED} (optional) Additional argument(s) + * @return {Boolean} Return true to continue loading data, false to cancel. + */ +YAHOO.widget.AutoComplete.prototype.doBeforeLoadData = function(sQuery, oResponse, oPayload) { + return true; +}; + +/** + * Overridable method that returns HTML markup for one result to be populated + * as innerHTML of an <LI> element. + * + * @method formatResult + * @param oResultData {Object} Result data object. + * @param sQuery {String} The corresponding query string. + * @param sResultMatch {HTMLElement} The current query string. + * @return {String} HTML markup of formatted result data. + */ +YAHOO.widget.AutoComplete.prototype.formatResult = function(oResultData, sQuery, sResultMatch) { + var sMarkup = (sResultMatch) ? sResultMatch : ""; + return sMarkup; +}; + +/** + * Overridable method called before container expands allows implementers to access data + * and DOM elements. + * + * @method doBeforeExpandContainer + * @param elTextbox {HTMLElement} The text input box. + * @param elContainer {HTMLElement} The container element. + * @param sQuery {String} The query string. + * @param aResults {Object[]} An array of query results. + * @return {Boolean} Return true to continue expanding container, false to cancel the expand. + */ +YAHOO.widget.AutoComplete.prototype.doBeforeExpandContainer = function(elTextbox, elContainer, sQuery, aResults) { + return true; +}; + + +/** + * Nulls out the entire AutoComplete instance and related objects, removes attached + * event listeners, and clears out DOM elements inside the container. After + * calling this method, the instance reference should be expliclitly nulled by + * implementer, as in myAutoComplete = null. Use with caution! + * + * @method destroy + */ +YAHOO.widget.AutoComplete.prototype.destroy = function() { + var instanceName = this.toString(); + var elInput = this._elTextbox; + var elContainer = this._elContainer; + + // Unhook custom events + this.textboxFocusEvent.unsubscribeAll(); + this.textboxKeyEvent.unsubscribeAll(); + this.dataRequestEvent.unsubscribeAll(); + this.dataReturnEvent.unsubscribeAll(); + this.dataErrorEvent.unsubscribeAll(); + this.containerPopulateEvent.unsubscribeAll(); + this.containerExpandEvent.unsubscribeAll(); + this.typeAheadEvent.unsubscribeAll(); + this.itemMouseOverEvent.unsubscribeAll(); + this.itemMouseOutEvent.unsubscribeAll(); + this.itemArrowToEvent.unsubscribeAll(); + this.itemArrowFromEvent.unsubscribeAll(); + this.itemSelectEvent.unsubscribeAll(); + this.unmatchedItemSelectEvent.unsubscribeAll(); + this.selectionEnforceEvent.unsubscribeAll(); + this.containerCollapseEvent.unsubscribeAll(); + this.textboxBlurEvent.unsubscribeAll(); + this.textboxChangeEvent.unsubscribeAll(); + + // Unhook DOM events + YAHOO.util.Event.purgeElement(elInput, true); + YAHOO.util.Event.purgeElement(elContainer, true); + + // Remove DOM elements + elContainer.innerHTML = ""; + + // Null out objects + for(var key in this) { + if(YAHOO.lang.hasOwnProperty(this, key)) { + this[key] = null; + } + } + + YAHOO.log("AutoComplete instance destroyed: " + instanceName); +}; + +///////////////////////////////////////////////////////////////////////////// +// +// Public events +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Fired when the input field receives focus. + * + * @event textboxFocusEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.textboxFocusEvent = null; + +/** + * Fired when the input field receives key input. + * + * @event textboxKeyEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param nKeycode {Number} The keycode number. + */ +YAHOO.widget.AutoComplete.prototype.textboxKeyEvent = null; + +/** + * Fired when the AutoComplete instance makes a request to the DataSource. + * + * @event dataRequestEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param sQuery {String} The query string. + * @param oRequest {Object} The request. + */ +YAHOO.widget.AutoComplete.prototype.dataRequestEvent = null; + +/** + * Fired when the AutoComplete instance receives query results from the data + * source. + * + * @event dataReturnEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param sQuery {String} The query string. + * @param aResults {Object[]} Results array. + */ +YAHOO.widget.AutoComplete.prototype.dataReturnEvent = null; + +/** + * Fired when the AutoComplete instance does not receive query results from the + * DataSource due to an error. + * + * @event dataErrorEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param sQuery {String} The query string. + */ +YAHOO.widget.AutoComplete.prototype.dataErrorEvent = null; + +/** + * Fired when the results container is populated. + * + * @event containerPopulateEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.containerPopulateEvent = null; + +/** + * Fired when the results container is expanded. + * + * @event containerExpandEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.containerExpandEvent = null; + +/** + * Fired when the input field has been prefilled by the type-ahead + * feature. + * + * @event typeAheadEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param sQuery {String} The query string. + * @param sPrefill {String} The prefill string. + */ +YAHOO.widget.AutoComplete.prototype.typeAheadEvent = null; + +/** + * Fired when result item has been moused over. + * + * @event itemMouseOverEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param elItem {HTMLElement} The <li> element item moused to. + */ +YAHOO.widget.AutoComplete.prototype.itemMouseOverEvent = null; + +/** + * Fired when result item has been moused out. + * + * @event itemMouseOutEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param elItem {HTMLElement} The <li> element item moused from. + */ +YAHOO.widget.AutoComplete.prototype.itemMouseOutEvent = null; + +/** + * Fired when result item has been arrowed to. + * + * @event itemArrowToEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param elItem {HTMLElement} The <li> element item arrowed to. + */ +YAHOO.widget.AutoComplete.prototype.itemArrowToEvent = null; + +/** + * Fired when result item has been arrowed away from. + * + * @event itemArrowFromEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param elItem {HTMLElement} The <li> element item arrowed from. + */ +YAHOO.widget.AutoComplete.prototype.itemArrowFromEvent = null; + +/** + * Fired when an item is selected via mouse click, ENTER key, or TAB key. + * + * @event itemSelectEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param elItem {HTMLElement} The selected <li> element item. + * @param oData {Object} The data returned for the item, either as an object, + * or mapped from the schema into an array. + */ +YAHOO.widget.AutoComplete.prototype.itemSelectEvent = null; + +/** + * Fired when a user selection does not match any of the displayed result items. + * + * @event unmatchedItemSelectEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param sSelection {String} The selected string. + */ +YAHOO.widget.AutoComplete.prototype.unmatchedItemSelectEvent = null; + +/** + * Fired if forceSelection is enabled and the user's input has been cleared + * because it did not match one of the returned query results. + * + * @event selectionEnforceEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param sClearedValue {String} The cleared value (including delimiters if applicable). + */ +YAHOO.widget.AutoComplete.prototype.selectionEnforceEvent = null; + +/** + * Fired when the results container is collapsed. + * + * @event containerCollapseEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.containerCollapseEvent = null; + +/** + * Fired when the input field loses focus. + * + * @event textboxBlurEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.textboxBlurEvent = null; + +/** + * Fired when the input field value has changed when it loses focus. + * + * @event textboxChangeEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.textboxChangeEvent = null; + +///////////////////////////////////////////////////////////////////////////// +// +// Private member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Internal class variable to index multiple AutoComplete instances. + * + * @property _nIndex + * @type Number + * @default 0 + * @private + */ +YAHOO.widget.AutoComplete._nIndex = 0; + +/** + * Name of AutoComplete instance. + * + * @property _sName + * @type String + * @private + */ +YAHOO.widget.AutoComplete.prototype._sName = null; + +/** + * Text input field DOM element. + * + * @property _elTextbox + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._elTextbox = null; + +/** + * Container DOM element. + * + * @property _elContainer + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._elContainer = null; + +/** + * Reference to content element within container element. + * + * @property _elContent + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._elContent = null; + +/** + * Reference to header element within content element. + * + * @property _elHeader + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._elHeader = null; + +/** + * Reference to body element within content element. + * + * @property _elBody + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._elBody = null; + +/** + * Reference to footer element within content element. + * + * @property _elFooter + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._elFooter = null; + +/** + * Reference to shadow element within container element. + * + * @property _elShadow + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._elShadow = null; + +/** + * Reference to iframe element within container element. + * + * @property _elIFrame + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._elIFrame = null; + +/** + * Whether or not the input field is currently in focus. If query results come back + * but the user has already moved on, do not proceed with auto complete behavior. + * + * @property _bFocused + * @type Boolean + * @private + */ +YAHOO.widget.AutoComplete.prototype._bFocused = null; + +/** + * Animation instance for container expand/collapse. + * + * @property _oAnim + * @type Boolean + * @private + */ +YAHOO.widget.AutoComplete.prototype._oAnim = null; + +/** + * Whether or not the results container is currently open. + * + * @property _bContainerOpen + * @type Boolean + * @private + */ +YAHOO.widget.AutoComplete.prototype._bContainerOpen = false; + +/** + * Whether or not the mouse is currently over the results + * container. This is necessary in order to prevent clicks on container items + * from being text input field blur events. + * + * @property _bOverContainer + * @type Boolean + * @private + */ +YAHOO.widget.AutoComplete.prototype._bOverContainer = false; + +/** + * Internal reference to <ul> elements that contains query results within the + * results container. + * + * @property _elList + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._elList = null; + +/* + * Array of <li> elements references that contain query results within the + * results container. + * + * @property _aListItemEls + * @type HTMLElement[] + * @private + */ +//YAHOO.widget.AutoComplete.prototype._aListItemEls = null; + +/** + * Number of <li> elements currently displayed in results container. + * + * @property _nDisplayedItems + * @type Number + * @private + */ +YAHOO.widget.AutoComplete.prototype._nDisplayedItems = 0; + +/* + * Internal count of <li> elements displayed and hidden in results container. + * + * @property _maxResultsDisplayed + * @type Number + * @private + */ +//YAHOO.widget.AutoComplete.prototype._maxResultsDisplayed = 0; + +/** + * Current query string + * + * @property _sCurQuery + * @type String + * @private + */ +YAHOO.widget.AutoComplete.prototype._sCurQuery = null; + +/** + * Selections from previous queries (for saving delimited queries). + * + * @property _sPastSelections + * @type String + * @default "" + * @private + */ +YAHOO.widget.AutoComplete.prototype._sPastSelections = ""; + +/** + * Stores initial input value used to determine if textboxChangeEvent should be fired. + * + * @property _sInitInputValue + * @type String + * @private + */ +YAHOO.widget.AutoComplete.prototype._sInitInputValue = null; + +/** + * Pointer to the currently highlighted <li> element in the container. + * + * @property _elCurListItem + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._elCurListItem = null; + +/** + * Whether or not an item has been selected since the container was populated + * with results. Reset to false by _populateList, and set to true when item is + * selected. + * + * @property _bItemSelected + * @type Boolean + * @private + */ +YAHOO.widget.AutoComplete.prototype._bItemSelected = false; + +/** + * Key code of the last key pressed in textbox. + * + * @property _nKeyCode + * @type Number + * @private + */ +YAHOO.widget.AutoComplete.prototype._nKeyCode = null; + +/** + * Delay timeout ID. + * + * @property _nDelayID + * @type Number + * @private + */ +YAHOO.widget.AutoComplete.prototype._nDelayID = -1; + +/** + * TypeAhead delay timeout ID. + * + * @property _nTypeAheadDelayID + * @type Number + * @private + */ +YAHOO.widget.AutoComplete.prototype._nTypeAheadDelayID = -1; + +/** + * Src to iFrame used when useIFrame = true. Supports implementations over SSL + * as well. + * + * @property _iFrameSrc + * @type String + * @private + */ +YAHOO.widget.AutoComplete.prototype._iFrameSrc = "javascript:false;"; + +/** + * For users typing via certain IMEs, queries must be triggered by intervals, + * since key events yet supported across all browsers for all IMEs. + * + * @property _queryInterval + * @type Object + * @private + */ +YAHOO.widget.AutoComplete.prototype._queryInterval = null; + +/** + * Internal tracker to last known textbox value, used to determine whether or not + * to trigger a query via interval for certain IME users. + * + * @event _sLastTextboxValue + * @type String + * @private + */ +YAHOO.widget.AutoComplete.prototype._sLastTextboxValue = null; + +///////////////////////////////////////////////////////////////////////////// +// +// Private methods +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Updates and validates latest public config properties. + * + * @method __initProps + * @private + */ +YAHOO.widget.AutoComplete.prototype._initProps = function() { + // Correct any invalid values + var minQueryLength = this.minQueryLength; + if(!YAHOO.lang.isNumber(minQueryLength)) { + this.minQueryLength = 1; + } + var maxResultsDisplayed = this.maxResultsDisplayed; + if(!YAHOO.lang.isNumber(maxResultsDisplayed) || (maxResultsDisplayed < 1)) { + this.maxResultsDisplayed = 10; + } + var queryDelay = this.queryDelay; + if(!YAHOO.lang.isNumber(queryDelay) || (queryDelay < 0)) { + this.queryDelay = 0.2; + } + var typeAheadDelay = this.typeAheadDelay; + if(!YAHOO.lang.isNumber(typeAheadDelay) || (typeAheadDelay < 0)) { + this.typeAheadDelay = 0.2; + } + var delimChar = this.delimChar; + if(YAHOO.lang.isString(delimChar) && (delimChar.length > 0)) { + this.delimChar = [delimChar]; + } + else if(!YAHOO.lang.isArray(delimChar)) { + this.delimChar = null; + } + var animSpeed = this.animSpeed; + if((this.animHoriz || this.animVert) && YAHOO.util.Anim) { + if(!YAHOO.lang.isNumber(animSpeed) || (animSpeed < 0)) { + this.animSpeed = 0.3; + } + if(!this._oAnim ) { + this._oAnim = new YAHOO.util.Anim(this._elContent, {}, this.animSpeed); + } + else { + this._oAnim.duration = this.animSpeed; + } + } + if(this.forceSelection && delimChar) { + YAHOO.log("The forceSelection feature has been enabled with delimChar defined.","warn", this.toString()); + } +}; + +/** + * Initializes the results container helpers if they are enabled and do + * not exist + * + * @method _initContainerHelperEls + * @private + */ +YAHOO.widget.AutoComplete.prototype._initContainerHelperEls = function() { + if(this.useShadow && !this._elShadow) { + var elShadow = document.createElement("div"); + elShadow.className = "yui-ac-shadow"; + elShadow.style.width = 0; + elShadow.style.height = 0; + this._elShadow = this._elContainer.appendChild(elShadow); + } + if(this.useIFrame && !this._elIFrame) { + var elIFrame = document.createElement("iframe"); + elIFrame.src = this._iFrameSrc; + elIFrame.frameBorder = 0; + elIFrame.scrolling = "no"; + elIFrame.style.position = "absolute"; + elIFrame.style.width = 0; + elIFrame.style.height = 0; + elIFrame.tabIndex = -1; + elIFrame.style.padding = 0; + this._elIFrame = this._elContainer.appendChild(elIFrame); + } +}; + +/** + * Initializes the results container once at object creation + * + * @method _initContainerEl + * @private + */ +YAHOO.widget.AutoComplete.prototype._initContainerEl = function() { + YAHOO.util.Dom.addClass(this._elContainer, "yui-ac-container"); + + if(!this._elContent) { + // The elContent div is assigned DOM listeners and + // helps size the iframe and shadow properly + var elContent = document.createElement("div"); + elContent.className = "yui-ac-content"; + elContent.style.display = "none"; + + this._elContent = this._elContainer.appendChild(elContent); + + var elHeader = document.createElement("div"); + elHeader.className = "yui-ac-hd"; + elHeader.style.display = "none"; + this._elHeader = this._elContent.appendChild(elHeader); + + var elBody = document.createElement("div"); + elBody.className = "yui-ac-bd"; + this._elBody = this._elContent.appendChild(elBody); + + var elFooter = document.createElement("div"); + elFooter.className = "yui-ac-ft"; + elFooter.style.display = "none"; + this._elFooter = this._elContent.appendChild(elFooter); + } + else { + YAHOO.log("Could not initialize the container","warn",this.toString()); + } +}; + +/** + * Clears out contents of container body and creates up to + * YAHOO.widget.AutoComplete#maxResultsDisplayed <li> elements in an + * <ul> element. + * + * @method _initListEl + * @private + */ +YAHOO.widget.AutoComplete.prototype._initListEl = function() { + var nListLength = this.maxResultsDisplayed; + + var elList = this._elList || document.createElement("ul"); + var elListItem; + while(elList.childNodes.length < nListLength) { + elListItem = document.createElement("li"); + elListItem.style.display = "none"; + elListItem._nItemIndex = elList.childNodes.length; + elList.appendChild(elListItem); + } + if(!this._elList) { + var elBody = this._elBody; + YAHOO.util.Event.purgeElement(elBody, true); + elBody.innerHTML = ""; + this._elList = elBody.appendChild(elList); + } + +}; + +/** + * Focuses input field. + * + * @method _focus + * @private + */ +YAHOO.widget.AutoComplete.prototype._focus = function() { + // http://developer.mozilla.org/en/docs/index.php?title=Key-navigable_custom_DHTML_widgets + var oSelf = this; + setTimeout(function() { + try { + oSelf._elTextbox.focus(); + } + catch(e) { + } + },0); +}; + +/** + * Enables interval detection for IME support. + * + * @method _enableIntervalDetection + * @private + */ +YAHOO.widget.AutoComplete.prototype._enableIntervalDetection = function() { + var oSelf = this; + if(!oSelf._queryInterval && oSelf.queryInterval) { + oSelf._queryInterval = setInterval(function() { oSelf._onInterval(); }, oSelf.queryInterval); + YAHOO.log("Interval set", "info", this.toString()); + } +}; + +/** + * Enables query triggers based on text input detection by intervals (rather + * than by key events). + * + * @method _onInterval + * @private + */ +YAHOO.widget.AutoComplete.prototype._onInterval = function() { + var currValue = this._elTextbox.value; + var lastValue = this._sLastTextboxValue; + if(currValue != lastValue) { + this._sLastTextboxValue = currValue; + this._sendQuery(currValue); + } +}; + +/** + * Cancels text input detection by intervals. + * + * @method _clearInterval + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._clearInterval = function() { + if(this._queryInterval) { + clearInterval(this._queryInterval); + this._queryInterval = null; + YAHOO.log("Interval cleared", "info", this.toString()); + } +}; + +/** + * Whether or not key is functional or should be ignored. Note that the right + * arrow key is NOT an ignored key since it triggers queries for certain intl + * charsets. + * + * @method _isIgnoreKey + * @param nKeycode {Number} Code of key pressed. + * @return {Boolean} True if key should be ignored, false otherwise. + * @private + */ +YAHOO.widget.AutoComplete.prototype._isIgnoreKey = function(nKeyCode) { + if((nKeyCode == 9) || (nKeyCode == 13) || // tab, enter + (nKeyCode == 16) || (nKeyCode == 17) || // shift, ctl + (nKeyCode >= 18 && nKeyCode <= 20) || // alt, pause/break,caps lock + (nKeyCode == 27) || // esc + (nKeyCode >= 33 && nKeyCode <= 35) || // page up,page down,end + /*(nKeyCode >= 36 && nKeyCode <= 38) || // home,left,up + (nKeyCode == 40) || // down*/ + (nKeyCode >= 36 && nKeyCode <= 40) || // home,left,up, right, down + (nKeyCode >= 44 && nKeyCode <= 45) || // print screen,insert + (nKeyCode == 229) // Bug 2041973: Korean XP fires 2 keyup events, the key and 229 + ) { + return true; + } + return false; +}; + +/** + * Makes query request to the DataSource. + * + * @method _sendQuery + * @param sQuery {String} Query string. + * @private + */ +YAHOO.widget.AutoComplete.prototype._sendQuery = function(sQuery) { + // Widget has been effectively turned off + if(this.minQueryLength < 0) { + this._toggleContainer(false); + YAHOO.log("Property minQueryLength is less than 0", "info", this.toString()); + return; + } + // Delimiter has been enabled + if(this.delimChar) { + var extraction = this._extractQuery(sQuery); + // Here is the query itself + sQuery = extraction.query; + // ...and save the rest of the string for later + this._sPastSelections = extraction.previous; + } + + // Don't search queries that are too short + if((sQuery && (sQuery.length < this.minQueryLength)) || (!sQuery && this.minQueryLength > 0)) { + if(this._nDelayID != -1) { + clearTimeout(this._nDelayID); + } + this._toggleContainer(false); + YAHOO.log("Query \"" + sQuery + "\" is too short", "info", this.toString()); + return; + } + + sQuery = encodeURIComponent(sQuery); + this._nDelayID = -1; // Reset timeout ID because request is being made + + // Subset matching + if(this.dataSource.queryMatchSubset || this.queryMatchSubset) { // backward compat + var oResponse = this.getSubsetMatches(sQuery); + if(oResponse) { + this.handleResponse(sQuery, oResponse, {query: sQuery}); + return; + } + } + + if(this.responseStripAfter) { + this.dataSource.doBeforeParseData = this.preparseRawResponse; + } + if(this.applyLocalFilter) { + this.dataSource.doBeforeCallback = this.filterResults; + } + + var sRequest = this.generateRequest(sQuery); + this.dataRequestEvent.fire(this, sQuery, sRequest); + YAHOO.log("Sending query \"" + sRequest + "\"", "info", this.toString()); + + this.dataSource.sendRequest(sRequest, { + success : this.handleResponse, + failure : this.handleResponse, + scope : this, + argument: { + query: sQuery + } + }); +}; + +/** + * Populates the array of <li> elements in the container with query + * results. + * + * @method _populateList + * @param sQuery {String} Original request. + * @param oResponse {Object} Response object. + * @param oPayload {MIXED} (optional) Additional argument(s) + * @private + */ +YAHOO.widget.AutoComplete.prototype._populateList = function(sQuery, oResponse, oPayload) { + // Clear previous timeout + if(this._nTypeAheadDelayID != -1) { + clearTimeout(this._nTypeAheadDelayID); + } + + sQuery = (oPayload && oPayload.query) ? oPayload.query : sQuery; + + // Pass data through abstract method for any transformations + var ok = this.doBeforeLoadData(sQuery, oResponse, oPayload); + + // Data is ok + if(ok && !oResponse.error) { + this.dataReturnEvent.fire(this, sQuery, oResponse.results); + + // Continue only if instance is still focused (i.e., user hasn't already moved on) + // Null indicates initialized state, which is ok too + if(this._bFocused || (this._bFocused === null)) { + + //TODO: is this still necessary? + /*var isOpera = (YAHOO.env.ua.opera); + var contentStyle = this._elContent.style; + contentStyle.width = (!isOpera) ? null : ""; + contentStyle.height = (!isOpera) ? null : "";*/ + + // Store state for this interaction + var sCurQuery = decodeURIComponent(sQuery); + this._sCurQuery = sCurQuery; + this._bItemSelected = false; + + var allResults = oResponse.results, + nItemsToShow = Math.min(allResults.length,this.maxResultsDisplayed), + sMatchKey = (this.dataSource.responseSchema.fields) ? + (this.dataSource.responseSchema.fields[0].key || this.dataSource.responseSchema.fields[0]) : 0; + + if(nItemsToShow > 0) { + // Make sure container and helpers are ready to go + if(!this._elList || (this._elList.childNodes.length < nItemsToShow)) { + this._initListEl(); + } + this._initContainerHelperEls(); + + var allListItemEls = this._elList.childNodes; + // Fill items with data from the bottom up + for(var i = nItemsToShow-1; i >= 0; i--) { + var elListItem = allListItemEls[i], + oResult = allResults[i]; + + // Backward compatibility + if(this.resultTypeList) { + // Results need to be converted back to an array + var aResult = []; + // Match key is first + aResult[0] = (YAHOO.lang.isString(oResult)) ? oResult : oResult[sMatchKey] || oResult[this.key]; + // Add additional data to the result array + var fields = this.dataSource.responseSchema.fields; + if(YAHOO.lang.isArray(fields) && (fields.length > 1)) { + for(var k=1, len=fields.length; k= nItemsToShow; j--) { + extraListItem = allListItemEls[j]; + extraListItem.style.display = "none"; + } + } + + this._nDisplayedItems = nItemsToShow; + + this.containerPopulateEvent.fire(this, sQuery, allResults); + + // Highlight the first item + if(this.autoHighlight) { + var elFirstListItem = this._elList.firstChild; + this._toggleHighlight(elFirstListItem,"to"); + this.itemArrowToEvent.fire(this, elFirstListItem); + YAHOO.log("Arrowed to first item", "info", this.toString()); + this._typeAhead(elFirstListItem,sQuery); + } + // Unhighlight any previous time + else { + this._toggleHighlight(this._elCurListItem,"from"); + } + + // Expand the container + ok = this.doBeforeExpandContainer(this._elTextbox, this._elContainer, sQuery, allResults); + this._toggleContainer(ok); + } + else { + this._toggleContainer(false); + } + + YAHOO.log("Container populated with " + nItemsToShow + " list items", "info", this.toString()); + return; + } + } + // Error + else { + this.dataErrorEvent.fire(this, sQuery); + } + + YAHOO.log("Could not populate list", "info", this.toString()); +}; + +/** + * When forceSelection is true and the user attempts + * leave the text input box without selecting an item from the query results, + * the user selection is cleared. + * + * @method _clearSelection + * @private + */ +YAHOO.widget.AutoComplete.prototype._clearSelection = function() { + var extraction = (this.delimChar) ? this._extractQuery(this._elTextbox.value) : + {previous:"",query:this._elTextbox.value}; + this._elTextbox.value = extraction.previous; + this.selectionEnforceEvent.fire(this, extraction.query); + YAHOO.log("Selection enforced", "info", this.toString()); +}; + +/** + * Whether or not user-typed value in the text input box matches any of the + * query results. + * + * @method _textMatchesOption + * @return {HTMLElement} Matching list item element if user-input text matches + * a result, null otherwise. + * @private + */ +YAHOO.widget.AutoComplete.prototype._textMatchesOption = function() { + var elMatch = null; + + for(var i=0; i= 0; i--) { + nNewIndex = sQuery.lastIndexOf(aDelimChar[i]); + if(nNewIndex > nDelimIndex) { + nDelimIndex = nNewIndex; + } + } + // If we think the last delimiter is a space (" "), make sure it is NOT + // a false positive by also checking the char directly before it + if(aDelimChar[i] == " ") { + for (var j = aDelimChar.length-1; j >= 0; j--) { + if(sQuery[nDelimIndex - 1] == aDelimChar[j]) { + nDelimIndex--; + break; + } + } + } + // A delimiter has been found in the query so extract the latest query from past selections + if(nDelimIndex > -1) { + nQueryStart = nDelimIndex + 1; + // Trim any white space from the beginning... + while(sQuery.charAt(nQueryStart) == " ") { + nQueryStart += 1; + } + // ...and save the rest of the string for later + sPrevious = sQuery.substring(0,nQueryStart); + // Here is the query itself + sQuery = sQuery.substr(nQueryStart); + } + // No delimiter found in the query, so there are no selections from past queries + else { + sPrevious = ""; + } + + return { + previous: sPrevious, + query: sQuery + }; +}; + +/** + * Syncs results container with its helpers. + * + * @method _toggleContainerHelpers + * @param bShow {Boolean} True if container is expanded, false if collapsed + * @private + */ +YAHOO.widget.AutoComplete.prototype._toggleContainerHelpers = function(bShow) { + var width = this._elContent.offsetWidth + "px"; + var height = this._elContent.offsetHeight + "px"; + + if(this.useIFrame && this._elIFrame) { + var elIFrame = this._elIFrame; + if(bShow) { + elIFrame.style.width = width; + elIFrame.style.height = height; + elIFrame.style.padding = ""; + YAHOO.log("Iframe expanded", "info", this.toString()); + } + else { + elIFrame.style.width = 0; + elIFrame.style.height = 0; + elIFrame.style.padding = 0; + YAHOO.log("Iframe collapsed", "info", this.toString()); + } + } + if(this.useShadow && this._elShadow) { + var elShadow = this._elShadow; + if(bShow) { + elShadow.style.width = width; + elShadow.style.height = height; + YAHOO.log("Shadow expanded", "info", this.toString()); + } + else { + elShadow.style.width = 0; + elShadow.style.height = 0; + YAHOO.log("Shadow collapsed", "info", this.toString()); + } + } +}; + +/** + * Animates expansion or collapse of the container. + * + * @method _toggleContainer + * @param bShow {Boolean} True if container should be expanded, false if container should be collapsed + * @private + */ +YAHOO.widget.AutoComplete.prototype._toggleContainer = function(bShow) { + YAHOO.log("Toggling container " + ((bShow) ? "open" : "closed"), "info", this.toString()); + + var elContainer = this._elContainer; + + // If implementer has container always open and it's already open, don't mess with it + // Container is initialized with display "none" so it may need to be shown first time through + if(this.alwaysShowContainer && this._bContainerOpen) { + return; + } + + // Reset states + if(!bShow) { + this._toggleHighlight(this._elCurListItem,"from"); + this._nDisplayedItems = 0; + this._sCurQuery = null; + + // Container is already closed, so don't bother with changing the UI + if(this._elContent.style.display == "none") { + return; + } + } + + // If animation is enabled... + var oAnim = this._oAnim; + if(oAnim && oAnim.getEl() && (this.animHoriz || this.animVert)) { + if(oAnim.isAnimated()) { + oAnim.stop(true); + } + + // Clone container to grab current size offscreen + var oClone = this._elContent.cloneNode(true); + elContainer.appendChild(oClone); + oClone.style.top = "-9000px"; + oClone.style.width = ""; + oClone.style.height = ""; + oClone.style.display = ""; + + // Current size of the container is the EXPANDED size + var wExp = oClone.offsetWidth; + var hExp = oClone.offsetHeight; + + // Calculate COLLAPSED sizes based on horiz and vert anim + var wColl = (this.animHoriz) ? 0 : wExp; + var hColl = (this.animVert) ? 0 : hExp; + + // Set animation sizes + oAnim.attributes = (bShow) ? + {width: { to: wExp }, height: { to: hExp }} : + {width: { to: wColl}, height: { to: hColl }}; + + // If opening anew, set to a collapsed size... + if(bShow && !this._bContainerOpen) { + this._elContent.style.width = wColl+"px"; + this._elContent.style.height = hColl+"px"; + } + // Else, set it to its last known size. + else { + this._elContent.style.width = wExp+"px"; + this._elContent.style.height = hExp+"px"; + } + + elContainer.removeChild(oClone); + oClone = null; + + var oSelf = this; + var onAnimComplete = function() { + // Finish the collapse + oAnim.onComplete.unsubscribeAll(); + + if(bShow) { + oSelf._toggleContainerHelpers(true); + oSelf._bContainerOpen = bShow; + oSelf.containerExpandEvent.fire(oSelf); + YAHOO.log("Container expanded", "info", oSelf.toString()); + } + else { + oSelf._elContent.style.display = "none"; + oSelf._bContainerOpen = bShow; + oSelf.containerCollapseEvent.fire(oSelf); + YAHOO.log("Container collapsed", "info", oSelf.toString()); + } + }; + + // Display container and animate it + this._toggleContainerHelpers(false); // Bug 1424486: Be early to hide, late to show; + this._elContent.style.display = ""; + oAnim.onComplete.subscribe(onAnimComplete); + oAnim.animate(); + } + // Else don't animate, just show or hide + else { + if(bShow) { + this._elContent.style.display = ""; + this._toggleContainerHelpers(true); + this._bContainerOpen = bShow; + this.containerExpandEvent.fire(this); + YAHOO.log("Container expanded", "info", this.toString()); + } + else { + this._toggleContainerHelpers(false); + this._elContent.style.display = "none"; + this._bContainerOpen = bShow; + this.containerCollapseEvent.fire(this); + YAHOO.log("Container collapsed", "info", this.toString()); + } + } + +}; + +/** + * Toggles the highlight on or off for an item in the container, and also cleans + * up highlighting of any previous item. + * + * @method _toggleHighlight + * @param elNewListItem {HTMLElement} The <li> element item to receive highlight behavior. + * @param sType {String} Type "mouseover" will toggle highlight on, and "mouseout" will toggle highlight off. + * @private + */ +YAHOO.widget.AutoComplete.prototype._toggleHighlight = function(elNewListItem, sType) { + if(elNewListItem) { + var sHighlight = this.highlightClassName; + if(this._elCurListItem) { + // Remove highlight from old item + YAHOO.util.Dom.removeClass(this._elCurListItem, sHighlight); + this._elCurListItem = null; + } + + if((sType == "to") && sHighlight) { + // Apply highlight to new item + YAHOO.util.Dom.addClass(elNewListItem, sHighlight); + this._elCurListItem = elNewListItem; + } + } +}; + +/** + * Toggles the pre-highlight on or off for an item in the container. + * + * @method _togglePrehighlight + * @param elNewListItem {HTMLElement} The <li> element item to receive highlight behavior. + * @param sType {String} Type "mouseover" will toggle highlight on, and "mouseout" will toggle highlight off. + * @private + */ +YAHOO.widget.AutoComplete.prototype._togglePrehighlight = function(elNewListItem, sType) { + if(elNewListItem == this._elCurListItem) { + return; + } + + var sPrehighlight = this.prehighlightClassName; + if((sType == "mouseover") && sPrehighlight) { + // Apply prehighlight to new item + YAHOO.util.Dom.addClass(elNewListItem, sPrehighlight); + } + else { + // Remove prehighlight from old item + YAHOO.util.Dom.removeClass(elNewListItem, sPrehighlight); + } +}; + +/** + * Updates the text input box value with selected query result. If a delimiter + * has been defined, then the value gets appended with the delimiter. + * + * @method _updateValue + * @param elListItem {HTMLElement} The <li> element item with which to update the value. + * @private + */ +YAHOO.widget.AutoComplete.prototype._updateValue = function(elListItem) { + if(!this.suppressInputUpdate) { + var elTextbox = this._elTextbox; + var sDelimChar = (this.delimChar) ? (this.delimChar[0] || this.delimChar) : null; + var sResultMatch = elListItem._sResultMatch; + + // Calculate the new value + var sNewValue = ""; + if(sDelimChar) { + // Preserve selections from past queries + sNewValue = this._sPastSelections; + // Add new selection plus delimiter + sNewValue += sResultMatch + sDelimChar; + if(sDelimChar != " ") { + sNewValue += " "; + } + } + else { + sNewValue = sResultMatch; + } + + // Update input field + elTextbox.value = sNewValue; + + // Scroll to bottom of textarea if necessary + if(elTextbox.type == "textarea") { + elTextbox.scrollTop = elTextbox.scrollHeight; + } + + // Move cursor to end + var end = elTextbox.value.length; + this._selectText(elTextbox,end,end); + + this._elCurListItem = elListItem; + } +}; + +/** + * Selects a result item from the container + * + * @method _selectItem + * @param elListItem {HTMLElement} The selected <li> element item. + * @private + */ +YAHOO.widget.AutoComplete.prototype._selectItem = function(elListItem) { + this._bItemSelected = true; + this._updateValue(elListItem); + this._sPastSelections = this._elTextbox.value; + this._clearInterval(); + this.itemSelectEvent.fire(this, elListItem, elListItem._oResultData); + YAHOO.log("Item selected: " + YAHOO.lang.dump(elListItem._oResultData), "info", this.toString()); + this._toggleContainer(false); +}; + +/** + * If an item is highlighted in the container, the right arrow key jumps to the + * end of the textbox and selects the highlighted item, otherwise the container + * is closed. + * + * @method _jumpSelection + * @private + */ +YAHOO.widget.AutoComplete.prototype._jumpSelection = function() { + if(this._elCurListItem) { + this._selectItem(this._elCurListItem); + } + else { + this._toggleContainer(false); + } +}; + +/** + * Triggered by up and down arrow keys, changes the current highlighted + * <li> element item. Scrolls container if necessary. + * + * @method _moveSelection + * @param nKeyCode {Number} Code of key pressed. + * @private + */ +YAHOO.widget.AutoComplete.prototype._moveSelection = function(nKeyCode) { + if(this._bContainerOpen) { + // Determine current item's id number + var elCurListItem = this._elCurListItem, + nCurItemIndex = -1; + + if(elCurListItem) { + nCurItemIndex = elCurListItem._nItemIndex; + } + + var nNewItemIndex = (nKeyCode == 40) ? + (nCurItemIndex + 1) : (nCurItemIndex - 1); + + // Out of bounds + if(nNewItemIndex < -2 || nNewItemIndex >= this._nDisplayedItems) { + return; + } + + if(elCurListItem) { + // Unhighlight current item + this._toggleHighlight(elCurListItem, "from"); + this.itemArrowFromEvent.fire(this, elCurListItem); + YAHOO.log("Item arrowed from: " + elCurListItem._nItemIndex, "info", this.toString()); + } + if(nNewItemIndex == -1) { + // Go back to query (remove type-ahead string) + if(this.delimChar) { + this._elTextbox.value = this._sPastSelections + this._sCurQuery; + } + else { + this._elTextbox.value = this._sCurQuery; + } + return; + } + if(nNewItemIndex == -2) { + // Close container + this._toggleContainer(false); + return; + } + + var elNewListItem = this._elList.childNodes[nNewItemIndex], + + // Scroll the container if necessary + elContent = this._elContent, + sOF = YAHOO.util.Dom.getStyle(elContent,"overflow"), + sOFY = YAHOO.util.Dom.getStyle(elContent,"overflowY"), + scrollOn = ((sOF == "auto") || (sOF == "scroll") || (sOFY == "auto") || (sOFY == "scroll")); + if(scrollOn && (nNewItemIndex > -1) && + (nNewItemIndex < this._nDisplayedItems)) { + // User is keying down + if(nKeyCode == 40) { + // Bottom of selected item is below scroll area... + if((elNewListItem.offsetTop+elNewListItem.offsetHeight) > (elContent.scrollTop + elContent.offsetHeight)) { + // Set bottom of scroll area to bottom of selected item + elContent.scrollTop = (elNewListItem.offsetTop+elNewListItem.offsetHeight) - elContent.offsetHeight; + } + // Bottom of selected item is above scroll area... + else if((elNewListItem.offsetTop+elNewListItem.offsetHeight) < elContent.scrollTop) { + // Set top of selected item to top of scroll area + elContent.scrollTop = elNewListItem.offsetTop; + + } + } + // User is keying up + else { + // Top of selected item is above scroll area + if(elNewListItem.offsetTop < elContent.scrollTop) { + // Set top of scroll area to top of selected item + this._elContent.scrollTop = elNewListItem.offsetTop; + } + // Top of selected item is below scroll area + else if(elNewListItem.offsetTop > (elContent.scrollTop + elContent.offsetHeight)) { + // Set bottom of selected item to bottom of scroll area + this._elContent.scrollTop = (elNewListItem.offsetTop+elNewListItem.offsetHeight) - elContent.offsetHeight; + } + } + } + + this._toggleHighlight(elNewListItem, "to"); + this.itemArrowToEvent.fire(this, elNewListItem); + YAHOO.log("Item arrowed to " + elNewListItem._nItemIndex, "info", this.toString()); + if(this.typeAhead) { + this._updateValue(elNewListItem); + } + } +}; + +///////////////////////////////////////////////////////////////////////////// +// +// Private event handlers +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Handles container mouseover events. + * + * @method _onContainerMouseover + * @param v {HTMLEvent} The mouseover event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onContainerMouseover = function(v,oSelf) { + var elTarget = YAHOO.util.Event.getTarget(v); + var elTag = elTarget.nodeName.toLowerCase(); + while(elTarget && (elTag != "table")) { + switch(elTag) { + case "body": + return; + case "li": + if(oSelf.prehighlightClassName) { + oSelf._togglePrehighlight(elTarget,"mouseover"); + } + else { + oSelf._toggleHighlight(elTarget,"to"); + } + + oSelf.itemMouseOverEvent.fire(oSelf, elTarget); + YAHOO.log("Item moused over " + elTarget._nItemIndex, "info", oSelf.toString()); + break; + case "div": + if(YAHOO.util.Dom.hasClass(elTarget,"yui-ac-container")) { + oSelf._bOverContainer = true; + return; + } + break; + default: + break; + } + + elTarget = elTarget.parentNode; + if(elTarget) { + elTag = elTarget.nodeName.toLowerCase(); + } + } +}; + +/** + * Handles container mouseout events. + * + * @method _onContainerMouseout + * @param v {HTMLEvent} The mouseout event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onContainerMouseout = function(v,oSelf) { + var elTarget = YAHOO.util.Event.getTarget(v); + var elTag = elTarget.nodeName.toLowerCase(); + while(elTarget && (elTag != "table")) { + switch(elTag) { + case "body": + return; + case "li": + if(oSelf.prehighlightClassName) { + oSelf._togglePrehighlight(elTarget,"mouseout"); + } + else { + oSelf._toggleHighlight(elTarget,"from"); + } + + oSelf.itemMouseOutEvent.fire(oSelf, elTarget); + YAHOO.log("Item moused out " + elTarget._nItemIndex, "info", oSelf.toString()); + break; + case "ul": + oSelf._toggleHighlight(oSelf._elCurListItem,"to"); + break; + case "div": + if(YAHOO.util.Dom.hasClass(elTarget,"yui-ac-container")) { + oSelf._bOverContainer = false; + return; + } + break; + default: + break; + } + + elTarget = elTarget.parentNode; + if(elTarget) { + elTag = elTarget.nodeName.toLowerCase(); + } + } +}; + +/** + * Handles container click events. + * + * @method _onContainerClick + * @param v {HTMLEvent} The click event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onContainerClick = function(v,oSelf) { + var elTarget = YAHOO.util.Event.getTarget(v); + var elTag = elTarget.nodeName.toLowerCase(); + while(elTarget && (elTag != "table")) { + switch(elTag) { + case "body": + return; + case "li": + // In case item has not been moused over + oSelf._toggleHighlight(elTarget,"to"); + oSelf._selectItem(elTarget); + return; + default: + break; + } + + elTarget = elTarget.parentNode; + if(elTarget) { + elTag = elTarget.nodeName.toLowerCase(); + } + } +}; + + +/** + * Handles container scroll events. + * + * @method _onContainerScroll + * @param v {HTMLEvent} The scroll event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onContainerScroll = function(v,oSelf) { + oSelf._focus(); +}; + +/** + * Handles container resize events. + * + * @method _onContainerResize + * @param v {HTMLEvent} The resize event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onContainerResize = function(v,oSelf) { + oSelf._toggleContainerHelpers(oSelf._bContainerOpen); +}; + + +/** + * Handles textbox keydown events of functional keys, mainly for UI behavior. + * + * @method _onTextboxKeyDown + * @param v {HTMLEvent} The keydown event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onTextboxKeyDown = function(v,oSelf) { + var nKeyCode = v.keyCode; + + // Clear timeout + if(oSelf._nTypeAheadDelayID != -1) { + clearTimeout(oSelf._nTypeAheadDelayID); + } + + switch (nKeyCode) { + case 9: // tab + if(!YAHOO.env.ua.opera && (navigator.userAgent.toLowerCase().indexOf("mac") == -1) || (YAHOO.env.ua.webkit>420)) { + // select an item or clear out + if(oSelf._elCurListItem) { + if(oSelf.delimChar && (oSelf._nKeyCode != nKeyCode)) { + if(oSelf._bContainerOpen) { + YAHOO.util.Event.stopEvent(v); + } + } + oSelf._selectItem(oSelf._elCurListItem); + } + else { + oSelf._toggleContainer(false); + } + } + break; + case 13: // enter + if(!YAHOO.env.ua.opera && (navigator.userAgent.toLowerCase().indexOf("mac") == -1) || (YAHOO.env.ua.webkit>420)) { + if(oSelf._elCurListItem) { + if(oSelf._nKeyCode != nKeyCode) { + if(oSelf._bContainerOpen) { + YAHOO.util.Event.stopEvent(v); + } + } + oSelf._selectItem(oSelf._elCurListItem); + } + else { + oSelf._toggleContainer(false); + } + } + break; + case 27: // esc + oSelf._toggleContainer(false); + return; + case 39: // right + oSelf._jumpSelection(); + break; + case 38: // up + if(oSelf._bContainerOpen) { + YAHOO.util.Event.stopEvent(v); + oSelf._moveSelection(nKeyCode); + } + break; + case 40: // down + if(oSelf._bContainerOpen) { + YAHOO.util.Event.stopEvent(v); + oSelf._moveSelection(nKeyCode); + } + break; + default: + oSelf._bItemSelected = false; + oSelf._toggleHighlight(oSelf._elCurListItem, "from"); + + oSelf.textboxKeyEvent.fire(oSelf, nKeyCode); + YAHOO.log("Textbox keyed", "info", oSelf.toString()); + break; + } + + if(nKeyCode === 18){ + oSelf._enableIntervalDetection(); + } + oSelf._nKeyCode = nKeyCode; +}; + +/** + * Handles textbox keypress events. + * @method _onTextboxKeyPress + * @param v {HTMLEvent} The keypress event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onTextboxKeyPress = function(v,oSelf) { + var nKeyCode = v.keyCode; + + // Expose only to non SF3 (bug 1978549) Mac browsers (bug 790337) and Opera browsers (bug 583531), + // where stopEvent is ineffective on keydown events + if(YAHOO.env.ua.opera || (navigator.userAgent.toLowerCase().indexOf("mac") != -1) && (YAHOO.env.ua.webkit < 420)) { + switch (nKeyCode) { + case 9: // tab + // select an item or clear out + if(oSelf._bContainerOpen) { + if(oSelf.delimChar) { + YAHOO.util.Event.stopEvent(v); + } + if(oSelf._elCurListItem) { + oSelf._selectItem(oSelf._elCurListItem); + } + else { + oSelf._toggleContainer(false); + } + } + break; + case 13: // enter + if(oSelf._bContainerOpen) { + YAHOO.util.Event.stopEvent(v); + if(oSelf._elCurListItem) { + oSelf._selectItem(oSelf._elCurListItem); + } + else { + oSelf._toggleContainer(false); + } + } + break; + default: + break; + } + } + + //TODO: (?) limit only to non-IE, non-Mac-FF for Korean IME support (bug 811948) + // Korean IME detected + else if(nKeyCode == 229) { + oSelf._enableIntervalDetection(); + } +}; + +/** + * Handles textbox keyup events to trigger queries. + * + * @method _onTextboxKeyUp + * @param v {HTMLEvent} The keyup event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onTextboxKeyUp = function(v,oSelf) { + var sText = this.value; //string in textbox + + // Check to see if any of the public properties have been updated + oSelf._initProps(); + + // Filter out chars that don't trigger queries + var nKeyCode = v.keyCode; + if(oSelf._isIgnoreKey(nKeyCode)) { + return; + } + + // Clear previous timeout + /*if(oSelf._nTypeAheadDelayID != -1) { + clearTimeout(oSelf._nTypeAheadDelayID); + }*/ + if(oSelf._nDelayID != -1) { + clearTimeout(oSelf._nDelayID); + } + + // Set new timeout + oSelf._nDelayID = setTimeout(function(){ + oSelf._sendQuery(sText); + },(oSelf.queryDelay * 1000)); + + //= nDelayID; + //else { + // No delay so send request immediately + //oSelf._sendQuery(sText); + //} +}; + +/** + * Handles text input box receiving focus. + * + * @method _onTextboxFocus + * @param v {HTMLEvent} The focus event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onTextboxFocus = function (v,oSelf) { + // Start of a new interaction + if(!oSelf._bFocused) { + oSelf._elTextbox.setAttribute("autocomplete","off"); + oSelf._bFocused = true; + oSelf._sInitInputValue = oSelf._elTextbox.value; + oSelf.textboxFocusEvent.fire(oSelf); + YAHOO.log("Textbox focused", "info", oSelf.toString()); + } +}; + +/** + * Handles text input box losing focus. + * + * @method _onTextboxBlur + * @param v {HTMLEvent} The focus event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onTextboxBlur = function (v,oSelf) { + // Is a true blur + if(!oSelf._bOverContainer || (oSelf._nKeyCode == 9)) { + // Current query needs to be validated as a selection + if(!oSelf._bItemSelected) { + var elMatchListItem = oSelf._textMatchesOption(); + // Container is closed or current query doesn't match any result + if(!oSelf._bContainerOpen || (oSelf._bContainerOpen && (elMatchListItem === null))) { + // Force selection is enabled so clear the current query + if(oSelf.forceSelection) { + oSelf._clearSelection(); + } + // Treat current query as a valid selection + else { + oSelf.unmatchedItemSelectEvent.fire(oSelf, oSelf._sCurQuery); + YAHOO.log("Unmatched item selected: " + oSelf._sCurQuery, "info", oSelf.toString()); + } + } + // Container is open and current query matches a result + else { + // Force a selection when textbox is blurred with a match + if(oSelf.forceSelection) { + oSelf._selectItem(elMatchListItem); + } + } + } + + oSelf._clearInterval(); + oSelf._bFocused = false; + if(oSelf._sInitInputValue !== oSelf._elTextbox.value) { + oSelf.textboxChangeEvent.fire(oSelf); + } + oSelf.textboxBlurEvent.fire(oSelf); + YAHOO.log("Textbox blurred", "info", oSelf.toString()); + + oSelf._toggleContainer(false); + } + // Not a true blur if it was a selection via mouse click + else { + oSelf._focus(); + } +}; + +/** + * Handles window unload event. + * + * @method _onWindowUnload + * @param v {HTMLEvent} The unload event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onWindowUnload = function(v,oSelf) { + if(oSelf && oSelf._elTextbox && oSelf.allowBrowserAutocomplete) { + oSelf._elTextbox.setAttribute("autocomplete","on"); + } +}; + +///////////////////////////////////////////////////////////////////////////// +// +// Deprecated for Backwards Compatibility +// +///////////////////////////////////////////////////////////////////////////// +/** + * @method doBeforeSendQuery + * @deprecated Use generateRequest. + */ +YAHOO.widget.AutoComplete.prototype.doBeforeSendQuery = function(sQuery) { + return this.generateRequest(sQuery); +}; + +/** + * @method getListItems + * @deprecated Use getListEl().childNodes. + */ +YAHOO.widget.AutoComplete.prototype.getListItems = function() { + var allListItemEls = [], + els = this._elList.childNodes; + for(var i=els.length-1; i>=0; i--) { + allListItemEls[i] = els[i]; + } + return allListItemEls; +}; + +///////////////////////////////////////////////////////////////////////// +// +// Private static methods +// +///////////////////////////////////////////////////////////////////////// + +/** + * Clones object literal or array of object literals. + * + * @method AutoComplete._cloneObject + * @param o {Object} Object. + * @private + * @static + */ +YAHOO.widget.AutoComplete._cloneObject = function(o) { + if(!YAHOO.lang.isValue(o)) { + return o; + } + + var copy = {}; + + if(YAHOO.lang.isFunction(o)) { + copy = o; + } + else if(YAHOO.lang.isArray(o)) { + var array = []; + for(var i=0,len=o.length;i=this.minQueryLength;B--){A=this.generateRequest(E.substr(0,B));this.dataRequestEvent.fire(this,D,A);C=this.dataSource.getCachedResponse(A);if(C){return this.filterResults.apply(this.dataSource,[E,C,C,{scope:this}]);}}return null;};YAHOO.widget.AutoComplete.prototype.preparseRawResponse=function(C,B,A){var D=((this.responseStripAfter!=="")&&(B.indexOf))?B.indexOf(this.responseStripAfter):-1;if(D!=-1){B=B.substring(0,D);}return B;};YAHOO.widget.AutoComplete.prototype.filterResults=function(J,L,P,K){if(K&&K.argument&&K.argument.query){J=K.argument.query;}if(J&&J!==""){P=YAHOO.widget.AutoComplete._cloneObject(P);var H=K.scope,O=this,B=P.results,M=[],D=false,I=(O.queryMatchCase||H.queryMatchCase),A=(O.queryMatchContains||H.queryMatchContains);for(var C=B.length-1;C>=0;C--){var F=B[C];var E=null;if(YAHOO.lang.isString(F)){E=F;}else{if(YAHOO.lang.isArray(F)){E=F[0];}else{if(this.responseSchema.fields){var N=this.responseSchema.fields[0].key||this.responseSchema.fields[0];E=F[N];}else{if(this.key){E=F[this.key];}}}}if(YAHOO.lang.isString(E)){var G=(I)?E.indexOf(decodeURIComponent(J)):E.toLowerCase().indexOf(decodeURIComponent(J).toLowerCase());if((!A&&(G===0))||(A&&(G>-1))){M.unshift(F);}}}P.results=M;}else{}return P;};YAHOO.widget.AutoComplete.prototype.handleResponse=function(C,A,B){if((this instanceof YAHOO.widget.AutoComplete)&&this._sName){this._populateList(C,A,B);}};YAHOO.widget.AutoComplete.prototype.doBeforeLoadData=function(C,A,B){return true;};YAHOO.widget.AutoComplete.prototype.formatResult=function(B,D,A){var C=(A)?A:"";return C;};YAHOO.widget.AutoComplete.prototype.doBeforeExpandContainer=function(D,A,C,B){return true;};YAHOO.widget.AutoComplete.prototype.destroy=function(){var B=this.toString();var A=this._elTextbox;var D=this._elContainer;this.textboxFocusEvent.unsubscribeAll();this.textboxKeyEvent.unsubscribeAll();this.dataRequestEvent.unsubscribeAll();this.dataReturnEvent.unsubscribeAll();this.dataErrorEvent.unsubscribeAll();this.containerPopulateEvent.unsubscribeAll();this.containerExpandEvent.unsubscribeAll();this.typeAheadEvent.unsubscribeAll();this.itemMouseOverEvent.unsubscribeAll();this.itemMouseOutEvent.unsubscribeAll();this.itemArrowToEvent.unsubscribeAll();this.itemArrowFromEvent.unsubscribeAll();this.itemSelectEvent.unsubscribeAll();this.unmatchedItemSelectEvent.unsubscribeAll();this.selectionEnforceEvent.unsubscribeAll();this.containerCollapseEvent.unsubscribeAll();this.textboxBlurEvent.unsubscribeAll();this.textboxChangeEvent.unsubscribeAll();YAHOO.util.Event.purgeElement(A,true);YAHOO.util.Event.purgeElement(D,true);D.innerHTML="";for(var C in this){if(YAHOO.lang.hasOwnProperty(this,C)){this[C]=null;}}};YAHOO.widget.AutoComplete.prototype.textboxFocusEvent=null;YAHOO.widget.AutoComplete.prototype.textboxKeyEvent=null;YAHOO.widget.AutoComplete.prototype.dataRequestEvent=null;YAHOO.widget.AutoComplete.prototype.dataReturnEvent=null;YAHOO.widget.AutoComplete.prototype.dataErrorEvent=null;YAHOO.widget.AutoComplete.prototype.containerPopulateEvent=null;YAHOO.widget.AutoComplete.prototype.containerExpandEvent=null;YAHOO.widget.AutoComplete.prototype.typeAheadEvent=null;YAHOO.widget.AutoComplete.prototype.itemMouseOverEvent=null;YAHOO.widget.AutoComplete.prototype.itemMouseOutEvent=null;YAHOO.widget.AutoComplete.prototype.itemArrowToEvent=null;YAHOO.widget.AutoComplete.prototype.itemArrowFromEvent=null;YAHOO.widget.AutoComplete.prototype.itemSelectEvent=null;YAHOO.widget.AutoComplete.prototype.unmatchedItemSelectEvent=null;YAHOO.widget.AutoComplete.prototype.selectionEnforceEvent=null;YAHOO.widget.AutoComplete.prototype.containerCollapseEvent=null;YAHOO.widget.AutoComplete.prototype.textboxBlurEvent=null; +YAHOO.widget.AutoComplete.prototype.textboxChangeEvent=null;YAHOO.widget.AutoComplete._nIndex=0;YAHOO.widget.AutoComplete.prototype._sName=null;YAHOO.widget.AutoComplete.prototype._elTextbox=null;YAHOO.widget.AutoComplete.prototype._elContainer=null;YAHOO.widget.AutoComplete.prototype._elContent=null;YAHOO.widget.AutoComplete.prototype._elHeader=null;YAHOO.widget.AutoComplete.prototype._elBody=null;YAHOO.widget.AutoComplete.prototype._elFooter=null;YAHOO.widget.AutoComplete.prototype._elShadow=null;YAHOO.widget.AutoComplete.prototype._elIFrame=null;YAHOO.widget.AutoComplete.prototype._bFocused=null;YAHOO.widget.AutoComplete.prototype._oAnim=null;YAHOO.widget.AutoComplete.prototype._bContainerOpen=false;YAHOO.widget.AutoComplete.prototype._bOverContainer=false;YAHOO.widget.AutoComplete.prototype._elList=null;YAHOO.widget.AutoComplete.prototype._nDisplayedItems=0;YAHOO.widget.AutoComplete.prototype._sCurQuery=null;YAHOO.widget.AutoComplete.prototype._sPastSelections="";YAHOO.widget.AutoComplete.prototype._sInitInputValue=null;YAHOO.widget.AutoComplete.prototype._elCurListItem=null;YAHOO.widget.AutoComplete.prototype._bItemSelected=false;YAHOO.widget.AutoComplete.prototype._nKeyCode=null;YAHOO.widget.AutoComplete.prototype._nDelayID=-1;YAHOO.widget.AutoComplete.prototype._nTypeAheadDelayID=-1;YAHOO.widget.AutoComplete.prototype._iFrameSrc="javascript:false;";YAHOO.widget.AutoComplete.prototype._queryInterval=null;YAHOO.widget.AutoComplete.prototype._sLastTextboxValue=null;YAHOO.widget.AutoComplete.prototype._initProps=function(){var B=this.minQueryLength;if(!YAHOO.lang.isNumber(B)){this.minQueryLength=1;}var E=this.maxResultsDisplayed;if(!YAHOO.lang.isNumber(E)||(E<1)){this.maxResultsDisplayed=10;}var F=this.queryDelay;if(!YAHOO.lang.isNumber(F)||(F<0)){this.queryDelay=0.2;}var C=this.typeAheadDelay;if(!YAHOO.lang.isNumber(C)||(C<0)){this.typeAheadDelay=0.2;}var A=this.delimChar;if(YAHOO.lang.isString(A)&&(A.length>0)){this.delimChar=[A];}else{if(!YAHOO.lang.isArray(A)){this.delimChar=null;}}var D=this.animSpeed;if((this.animHoriz||this.animVert)&&YAHOO.util.Anim){if(!YAHOO.lang.isNumber(D)||(D<0)){this.animSpeed=0.3;}if(!this._oAnim){this._oAnim=new YAHOO.util.Anim(this._elContent,{},this.animSpeed);}else{this._oAnim.duration=this.animSpeed;}}if(this.forceSelection&&A){}};YAHOO.widget.AutoComplete.prototype._initContainerHelperEls=function(){if(this.useShadow&&!this._elShadow){var A=document.createElement("div");A.className="yui-ac-shadow";A.style.width=0;A.style.height=0;this._elShadow=this._elContainer.appendChild(A);}if(this.useIFrame&&!this._elIFrame){var B=document.createElement("iframe");B.src=this._iFrameSrc;B.frameBorder=0;B.scrolling="no";B.style.position="absolute";B.style.width=0;B.style.height=0;B.tabIndex=-1;B.style.padding=0;this._elIFrame=this._elContainer.appendChild(B);}};YAHOO.widget.AutoComplete.prototype._initContainerEl=function(){YAHOO.util.Dom.addClass(this._elContainer,"yui-ac-container");if(!this._elContent){var C=document.createElement("div");C.className="yui-ac-content";C.style.display="none";this._elContent=this._elContainer.appendChild(C);var B=document.createElement("div");B.className="yui-ac-hd";B.style.display="none";this._elHeader=this._elContent.appendChild(B);var D=document.createElement("div");D.className="yui-ac-bd";this._elBody=this._elContent.appendChild(D);var A=document.createElement("div");A.className="yui-ac-ft";A.style.display="none";this._elFooter=this._elContent.appendChild(A);}else{}};YAHOO.widget.AutoComplete.prototype._initListEl=function(){var C=this.maxResultsDisplayed;var A=this._elList||document.createElement("ul");var B;while(A.childNodes.length=18&&A<=20)||(A==27)||(A>=33&&A<=35)||(A>=36&&A<=40)||(A>=44&&A<=45)||(A==229)){return true;}return false;};YAHOO.widget.AutoComplete.prototype._sendQuery=function(D){if(this.minQueryLength<0){this._toggleContainer(false);return;}if(this.delimChar){var A=this._extractQuery(D);D=A.query;this._sPastSelections=A.previous;}if((D&&(D.length0)){if(this._nDelayID!=-1){clearTimeout(this._nDelayID);}this._toggleContainer(false);return;}D=encodeURIComponent(D);this._nDelayID=-1;if(this.dataSource.queryMatchSubset||this.queryMatchSubset){var C=this.getSubsetMatches(D);if(C){this.handleResponse(D,C,{query:D});return;}}if(this.responseStripAfter){this.dataSource.doBeforeParseData=this.preparseRawResponse;}if(this.applyLocalFilter){this.dataSource.doBeforeCallback=this.filterResults;}var B=this.generateRequest(D);this.dataRequestEvent.fire(this,D,B);this.dataSource.sendRequest(B,{success:this.handleResponse,failure:this.handleResponse,scope:this,argument:{query:D}});};YAHOO.widget.AutoComplete.prototype._populateList=function(K,F,C){if(this._nTypeAheadDelayID!=-1){clearTimeout(this._nTypeAheadDelayID);}K=(C&&C.query)?C.query:K;var H=this.doBeforeLoadData(K,F,C);if(H&&!F.error){this.dataReturnEvent.fire(this,K,F.results);if(this._bFocused||(this._bFocused===null)){var M=decodeURIComponent(K);this._sCurQuery=M; +this._bItemSelected=false;var R=F.results,A=Math.min(R.length,this.maxResultsDisplayed),J=(this.dataSource.responseSchema.fields)?(this.dataSource.responseSchema.fields[0].key||this.dataSource.responseSchema.fields[0]):0;if(A>0){if(!this._elList||(this._elList.childNodes.length=0;Q--){var P=I[Q],E=R[Q];if(this.resultTypeList){var B=[];B[0]=(YAHOO.lang.isString(E))?E:E[J]||E[this.key];var L=this.dataSource.responseSchema.fields;if(YAHOO.lang.isArray(L)&&(L.length>1)){for(var N=1,S=L.length;N=A;O--){G=I[O];G.style.display="none";}}this._nDisplayedItems=A;this.containerPopulateEvent.fire(this,K,R);if(this.autoHighlight){var D=this._elList.firstChild;this._toggleHighlight(D,"to");this.itemArrowToEvent.fire(this,D);this._typeAhead(D,K);}else{this._toggleHighlight(this._elCurListItem,"from");}H=this.doBeforeExpandContainer(this._elTextbox,this._elContainer,K,R);this._toggleContainer(H);}else{this._toggleContainer(false);}return;}}else{this.dataErrorEvent.fire(this,K);}};YAHOO.widget.AutoComplete.prototype._clearSelection=function(){var A=(this.delimChar)?this._extractQuery(this._elTextbox.value):{previous:"",query:this._elTextbox.value};this._elTextbox.value=A.previous;this.selectionEnforceEvent.fire(this,A.query);};YAHOO.widget.AutoComplete.prototype._textMatchesOption=function(){var A=null;for(var B=0;B=0;B--){G=H.lastIndexOf(C[B]);if(G>F){F=G;}}if(C[B]==" "){for(var A=C.length-1;A>=0;A--){if(H[F-1]==C[A]){F--;break;}}}if(F>-1){E=F+1;while(H.charAt(E)==" "){E+=1;}D=H.substring(0,E);H=H.substr(E);}else{D="";}return{previous:D,query:H};};YAHOO.widget.AutoComplete.prototype._toggleContainerHelpers=function(D){var E=this._elContent.offsetWidth+"px";var B=this._elContent.offsetHeight+"px";if(this.useIFrame&&this._elIFrame){var C=this._elIFrame;if(D){C.style.width=E;C.style.height=B;C.style.padding="";}else{C.style.width=0;C.style.height=0;C.style.padding=0;}}if(this.useShadow&&this._elShadow){var A=this._elShadow;if(D){A.style.width=E;A.style.height=B;}else{A.style.width=0;A.style.height=0;}}};YAHOO.widget.AutoComplete.prototype._toggleContainer=function(I){var D=this._elContainer;if(this.alwaysShowContainer&&this._bContainerOpen){return;}if(!I){this._toggleHighlight(this._elCurListItem,"from");this._nDisplayedItems=0;this._sCurQuery=null;if(this._elContent.style.display=="none"){return;}}var A=this._oAnim;if(A&&A.getEl()&&(this.animHoriz||this.animVert)){if(A.isAnimated()){A.stop(true);}var G=this._elContent.cloneNode(true);D.appendChild(G);G.style.top="-9000px";G.style.width="";G.style.height="";G.style.display="";var F=G.offsetWidth;var C=G.offsetHeight;var B=(this.animHoriz)?0:F;var E=(this.animVert)?0:C;A.attributes=(I)?{width:{to:F},height:{to:C}}:{width:{to:B},height:{to:E}};if(I&&!this._bContainerOpen){this._elContent.style.width=B+"px";this._elContent.style.height=E+"px";}else{this._elContent.style.width=F+"px";this._elContent.style.height=C+"px";}D.removeChild(G);G=null;var H=this;var J=function(){A.onComplete.unsubscribeAll();if(I){H._toggleContainerHelpers(true);H._bContainerOpen=I;H.containerExpandEvent.fire(H);}else{H._elContent.style.display="none";H._bContainerOpen=I;H.containerCollapseEvent.fire(H);}};this._toggleContainerHelpers(false);this._elContent.style.display="";A.onComplete.subscribe(J);A.animate();}else{if(I){this._elContent.style.display="";this._toggleContainerHelpers(true);this._bContainerOpen=I;this.containerExpandEvent.fire(this);}else{this._toggleContainerHelpers(false);this._elContent.style.display="none";this._bContainerOpen=I;this.containerCollapseEvent.fire(this);}}};YAHOO.widget.AutoComplete.prototype._toggleHighlight=function(A,C){if(A){var B=this.highlightClassName;if(this._elCurListItem){YAHOO.util.Dom.removeClass(this._elCurListItem,B);this._elCurListItem=null;}if((C=="to")&&B){YAHOO.util.Dom.addClass(A,B);this._elCurListItem=A;}}};YAHOO.widget.AutoComplete.prototype._togglePrehighlight=function(B,C){if(B==this._elCurListItem){return;}var A=this.prehighlightClassName;if((C=="mouseover")&&A){YAHOO.util.Dom.addClass(B,A);}else{YAHOO.util.Dom.removeClass(B,A);}};YAHOO.widget.AutoComplete.prototype._updateValue=function(C){if(!this.suppressInputUpdate){var F=this._elTextbox;var E=(this.delimChar)?(this.delimChar[0]||this.delimChar):null;var B=C._sResultMatch;var D="";if(E){D=this._sPastSelections;D+=B+E;if(E!=" "){D+=" ";}}else{D=B;}F.value=D;if(F.type=="textarea"){F.scrollTop=F.scrollHeight;}var A=F.value.length;this._selectText(F,A,A);this._elCurListItem=C;}};YAHOO.widget.AutoComplete.prototype._selectItem=function(A){this._bItemSelected=true;this._updateValue(A);this._sPastSelections=this._elTextbox.value; +this._clearInterval();this.itemSelectEvent.fire(this,A,A._oResultData);this._toggleContainer(false);};YAHOO.widget.AutoComplete.prototype._jumpSelection=function(){if(this._elCurListItem){this._selectItem(this._elCurListItem);}else{this._toggleContainer(false);}};YAHOO.widget.AutoComplete.prototype._moveSelection=function(G){if(this._bContainerOpen){var H=this._elCurListItem,D=-1;if(H){D=H._nItemIndex;}var E=(G==40)?(D+1):(D-1);if(E<-2||E>=this._nDisplayedItems){return;}if(H){this._toggleHighlight(H,"from");this.itemArrowFromEvent.fire(this,H);}if(E==-1){if(this.delimChar){this._elTextbox.value=this._sPastSelections+this._sCurQuery;}else{this._elTextbox.value=this._sCurQuery;}return;}if(E==-2){this._toggleContainer(false);return;}var F=this._elList.childNodes[E],B=this._elContent,C=YAHOO.util.Dom.getStyle(B,"overflow"),I=YAHOO.util.Dom.getStyle(B,"overflowY"),A=((C=="auto")||(C=="scroll")||(I=="auto")||(I=="scroll"));if(A&&(E>-1)&&(E(B.scrollTop+B.offsetHeight)){B.scrollTop=(F.offsetTop+F.offsetHeight)-B.offsetHeight;}else{if((F.offsetTop+F.offsetHeight)(B.scrollTop+B.offsetHeight)){this._elContent.scrollTop=(F.offsetTop+F.offsetHeight)-B.offsetHeight;}}}}this._toggleHighlight(F,"to");this.itemArrowToEvent.fire(this,F);if(this.typeAhead){this._updateValue(F);}}};YAHOO.widget.AutoComplete.prototype._onContainerMouseover=function(A,C){var D=YAHOO.util.Event.getTarget(A);var B=D.nodeName.toLowerCase();while(D&&(B!="table")){switch(B){case"body":return;case"li":if(C.prehighlightClassName){C._togglePrehighlight(D,"mouseover");}else{C._toggleHighlight(D,"to");}C.itemMouseOverEvent.fire(C,D);break;case"div":if(YAHOO.util.Dom.hasClass(D,"yui-ac-container")){C._bOverContainer=true;return;}break;default:break;}D=D.parentNode;if(D){B=D.nodeName.toLowerCase();}}};YAHOO.widget.AutoComplete.prototype._onContainerMouseout=function(A,C){var D=YAHOO.util.Event.getTarget(A);var B=D.nodeName.toLowerCase();while(D&&(B!="table")){switch(B){case"body":return;case"li":if(C.prehighlightClassName){C._togglePrehighlight(D,"mouseout");}else{C._toggleHighlight(D,"from");}C.itemMouseOutEvent.fire(C,D);break;case"ul":C._toggleHighlight(C._elCurListItem,"to");break;case"div":if(YAHOO.util.Dom.hasClass(D,"yui-ac-container")){C._bOverContainer=false;return;}break;default:break;}D=D.parentNode;if(D){B=D.nodeName.toLowerCase();}}};YAHOO.widget.AutoComplete.prototype._onContainerClick=function(A,C){var D=YAHOO.util.Event.getTarget(A);var B=D.nodeName.toLowerCase();while(D&&(B!="table")){switch(B){case"body":return;case"li":C._toggleHighlight(D,"to");C._selectItem(D);return;default:break;}D=D.parentNode;if(D){B=D.nodeName.toLowerCase();}}};YAHOO.widget.AutoComplete.prototype._onContainerScroll=function(A,B){B._focus();};YAHOO.widget.AutoComplete.prototype._onContainerResize=function(A,B){B._toggleContainerHelpers(B._bContainerOpen);};YAHOO.widget.AutoComplete.prototype._onTextboxKeyDown=function(A,B){var C=A.keyCode;if(B._nTypeAheadDelayID!=-1){clearTimeout(B._nTypeAheadDelayID);}switch(C){case 9:if(!YAHOO.env.ua.opera&&(navigator.userAgent.toLowerCase().indexOf("mac")==-1)||(YAHOO.env.ua.webkit>420)){if(B._elCurListItem){if(B.delimChar&&(B._nKeyCode!=C)){if(B._bContainerOpen){YAHOO.util.Event.stopEvent(A);}}B._selectItem(B._elCurListItem);}else{B._toggleContainer(false);}}break;case 13:if(!YAHOO.env.ua.opera&&(navigator.userAgent.toLowerCase().indexOf("mac")==-1)||(YAHOO.env.ua.webkit>420)){if(B._elCurListItem){if(B._nKeyCode!=C){if(B._bContainerOpen){YAHOO.util.Event.stopEvent(A);}}B._selectItem(B._elCurListItem);}else{B._toggleContainer(false);}}break;case 27:B._toggleContainer(false);return;case 39:B._jumpSelection();break;case 38:if(B._bContainerOpen){YAHOO.util.Event.stopEvent(A);B._moveSelection(C);}break;case 40:if(B._bContainerOpen){YAHOO.util.Event.stopEvent(A);B._moveSelection(C);}break;default:B._bItemSelected=false;B._toggleHighlight(B._elCurListItem,"from");B.textboxKeyEvent.fire(B,C);break;}if(C===18){B._enableIntervalDetection();}B._nKeyCode=C;};YAHOO.widget.AutoComplete.prototype._onTextboxKeyPress=function(A,B){var C=A.keyCode;if(YAHOO.env.ua.opera||(navigator.userAgent.toLowerCase().indexOf("mac")!=-1)&&(YAHOO.env.ua.webkit<420)){switch(C){case 9:if(B._bContainerOpen){if(B.delimChar){YAHOO.util.Event.stopEvent(A);}if(B._elCurListItem){B._selectItem(B._elCurListItem);}else{B._toggleContainer(false);}}break;case 13:if(B._bContainerOpen){YAHOO.util.Event.stopEvent(A);if(B._elCurListItem){B._selectItem(B._elCurListItem);}else{B._toggleContainer(false);}}break;default:break;}}else{if(C==229){B._enableIntervalDetection();}}};YAHOO.widget.AutoComplete.prototype._onTextboxKeyUp=function(A,C){var B=this.value;C._initProps();var D=A.keyCode;if(C._isIgnoreKey(D)){return;}if(C._nDelayID!=-1){clearTimeout(C._nDelayID);}C._nDelayID=setTimeout(function(){C._sendQuery(B);},(C.queryDelay*1000));};YAHOO.widget.AutoComplete.prototype._onTextboxFocus=function(A,B){if(!B._bFocused){B._elTextbox.setAttribute("autocomplete","off");B._bFocused=true;B._sInitInputValue=B._elTextbox.value;B.textboxFocusEvent.fire(B);}};YAHOO.widget.AutoComplete.prototype._onTextboxBlur=function(A,C){if(!C._bOverContainer||(C._nKeyCode==9)){if(!C._bItemSelected){var B=C._textMatchesOption();if(!C._bContainerOpen||(C._bContainerOpen&&(B===null))){if(C.forceSelection){C._clearSelection();}else{C.unmatchedItemSelectEvent.fire(C,C._sCurQuery);}}else{if(C.forceSelection){C._selectItem(B);}}}C._clearInterval();C._bFocused=false;if(C._sInitInputValue!==C._elTextbox.value){C.textboxChangeEvent.fire(C);}C.textboxBlurEvent.fire(C);C._toggleContainer(false);}else{C._focus();}};YAHOO.widget.AutoComplete.prototype._onWindowUnload=function(A,B){if(B&&B._elTextbox&&B.allowBrowserAutocomplete){B._elTextbox.setAttribute("autocomplete","on");}};YAHOO.widget.AutoComplete.prototype.doBeforeSendQuery=function(A){return this.generateRequest(A); +};YAHOO.widget.AutoComplete.prototype.getListItems=function(){var C=[],B=this._elList.childNodes;for(var A=B.length-1;A>=0;A--){C[A]=B[A];}return C;};YAHOO.widget.AutoComplete._cloneObject=function(D){if(!YAHOO.lang.isValue(D)){return D;}var F={};if(YAHOO.lang.isFunction(D)){F=D;}else{if(YAHOO.lang.isArray(D)){var E=[];for(var C=0,B=D.length;C + *
  • Navigate with up/down arrow keys and/or mouse to pick a selection
  • + *
  • The drop down container can "roll down" or "fly out" via configurable + * animation
  • + *
  • UI look-and-feel customizable through CSS, including container + * attributes, borders, position, fonts, etc
  • + * + * + * @class AutoComplete + * @constructor + * @param elInput {HTMLElement} DOM element reference of an input field. + * @param elInput {String} String ID of an input field. + * @param elContainer {HTMLElement} DOM element reference of an existing DIV. + * @param elContainer {String} String ID of an existing DIV. + * @param oDataSource {YAHOO.widget.DataSource} DataSource instance. + * @param oConfigs {Object} (optional) Object literal of configuration params. + */ +YAHOO.widget.AutoComplete = function(elInput,elContainer,oDataSource,oConfigs) { + if(elInput && elContainer && oDataSource) { + // Validate DataSource + if(oDataSource instanceof YAHOO.util.DataSourceBase) { + this.dataSource = oDataSource; + } + else { + return; + } + + // YAHOO.widget.DataSource schema backwards compatibility + // Converted deprecated schema into supported schema + // First assume key data is held in position 0 of results array + this.key = 0; + var schema = oDataSource.responseSchema; + // An old school schema has been defined in the deprecated DataSource constructor + if(oDataSource._aDeprecatedSchema) { + var aDeprecatedSchema = oDataSource._aDeprecatedSchema; + if(YAHOO.lang.isArray(aDeprecatedSchema)) { + + if((oDataSource.responseType === YAHOO.util.DataSourceBase.TYPE_JSON) || + (oDataSource.responseType === YAHOO.util.DataSourceBase.TYPE_UNKNOWN)) { // Used to default to unknown + // Store the resultsList + schema.resultsList = aDeprecatedSchema[0]; + // Store the key + this.key = aDeprecatedSchema[1]; + // Only resultsList and key are defined, so grab all the data + schema.fields = (aDeprecatedSchema.length < 3) ? null : aDeprecatedSchema.slice(1); + } + else if(oDataSource.responseType === YAHOO.util.DataSourceBase.TYPE_XML) { + schema.resultNode = aDeprecatedSchema[0]; + this.key = aDeprecatedSchema[1]; + schema.fields = aDeprecatedSchema.slice(1); + } + else if(oDataSource.responseType === YAHOO.util.DataSourceBase.TYPE_TEXT) { + schema.recordDelim = aDeprecatedSchema[0]; + schema.fieldDelim = aDeprecatedSchema[1]; + } + oDataSource.responseSchema = schema; + } + } + + // Validate input element + if(YAHOO.util.Dom.inDocument(elInput)) { + if(YAHOO.lang.isString(elInput)) { + this._sName = "instance" + YAHOO.widget.AutoComplete._nIndex + " " + elInput; + this._elTextbox = document.getElementById(elInput); + } + else { + this._sName = (elInput.id) ? + "instance" + YAHOO.widget.AutoComplete._nIndex + " " + elInput.id: + "instance" + YAHOO.widget.AutoComplete._nIndex; + this._elTextbox = elInput; + } + YAHOO.util.Dom.addClass(this._elTextbox, "yui-ac-input"); + } + else { + return; + } + + // Validate container element + if(YAHOO.util.Dom.inDocument(elContainer)) { + if(YAHOO.lang.isString(elContainer)) { + this._elContainer = document.getElementById(elContainer); + } + else { + this._elContainer = elContainer; + } + if(this._elContainer.style.display == "none") { + } + + // For skinning + var elParent = this._elContainer.parentNode; + var elTag = elParent.tagName.toLowerCase(); + if(elTag == "div") { + YAHOO.util.Dom.addClass(elParent, "yui-ac"); + } + else { + } + } + else { + return; + } + + // Default applyLocalFilter setting is to enable for local sources + if(this.dataSource.dataType === YAHOO.util.DataSourceBase.TYPE_LOCAL) { + this.applyLocalFilter = true; + } + + // Set any config params passed in to override defaults + if(oConfigs && (oConfigs.constructor == Object)) { + for(var sConfig in oConfigs) { + if(sConfig) { + this[sConfig] = oConfigs[sConfig]; + } + } + } + + // Initialization sequence + this._initContainerEl(); + this._initProps(); + this._initListEl(); + this._initContainerHelperEls(); + + // Set up events + var oSelf = this; + var elTextbox = this._elTextbox; + + // Dom events + YAHOO.util.Event.addListener(elTextbox,"keyup",oSelf._onTextboxKeyUp,oSelf); + YAHOO.util.Event.addListener(elTextbox,"keydown",oSelf._onTextboxKeyDown,oSelf); + YAHOO.util.Event.addListener(elTextbox,"focus",oSelf._onTextboxFocus,oSelf); + YAHOO.util.Event.addListener(elTextbox,"blur",oSelf._onTextboxBlur,oSelf); + YAHOO.util.Event.addListener(elContainer,"mouseover",oSelf._onContainerMouseover,oSelf); + YAHOO.util.Event.addListener(elContainer,"mouseout",oSelf._onContainerMouseout,oSelf); + YAHOO.util.Event.addListener(elContainer,"click",oSelf._onContainerClick,oSelf); + YAHOO.util.Event.addListener(elContainer,"scroll",oSelf._onContainerScroll,oSelf); + YAHOO.util.Event.addListener(elContainer,"resize",oSelf._onContainerResize,oSelf); + YAHOO.util.Event.addListener(elTextbox,"keypress",oSelf._onTextboxKeyPress,oSelf); + YAHOO.util.Event.addListener(window,"unload",oSelf._onWindowUnload,oSelf); + + // Custom events + this.textboxFocusEvent = new YAHOO.util.CustomEvent("textboxFocus", this); + this.textboxKeyEvent = new YAHOO.util.CustomEvent("textboxKey", this); + this.dataRequestEvent = new YAHOO.util.CustomEvent("dataRequest", this); + this.dataReturnEvent = new YAHOO.util.CustomEvent("dataReturn", this); + this.dataErrorEvent = new YAHOO.util.CustomEvent("dataError", this); + this.containerPopulateEvent = new YAHOO.util.CustomEvent("containerPopulate", this); + this.containerExpandEvent = new YAHOO.util.CustomEvent("containerExpand", this); + this.typeAheadEvent = new YAHOO.util.CustomEvent("typeAhead", this); + this.itemMouseOverEvent = new YAHOO.util.CustomEvent("itemMouseOver", this); + this.itemMouseOutEvent = new YAHOO.util.CustomEvent("itemMouseOut", this); + this.itemArrowToEvent = new YAHOO.util.CustomEvent("itemArrowTo", this); + this.itemArrowFromEvent = new YAHOO.util.CustomEvent("itemArrowFrom", this); + this.itemSelectEvent = new YAHOO.util.CustomEvent("itemSelect", this); + this.unmatchedItemSelectEvent = new YAHOO.util.CustomEvent("unmatchedItemSelect", this); + this.selectionEnforceEvent = new YAHOO.util.CustomEvent("selectionEnforce", this); + this.containerCollapseEvent = new YAHOO.util.CustomEvent("containerCollapse", this); + this.textboxBlurEvent = new YAHOO.util.CustomEvent("textboxBlur", this); + this.textboxChangeEvent = new YAHOO.util.CustomEvent("textboxChange", this); + + // Finish up + elTextbox.setAttribute("autocomplete","off"); + YAHOO.widget.AutoComplete._nIndex++; + } + // Required arguments were not found + else { + } +}; + +///////////////////////////////////////////////////////////////////////////// +// +// Public member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * The DataSource object that encapsulates the data used for auto completion. + * This object should be an inherited object from YAHOO.widget.DataSource. + * + * @property dataSource + * @type YAHOO.widget.DataSource + */ +YAHOO.widget.AutoComplete.prototype.dataSource = null; + +/** + * By default, results from local DataSources will pass through the filterResults + * method to apply a client-side matching algorithm. + * + * @property applyLocalFilter + * @type Boolean + * @default true for local arrays and json, otherwise false + */ +YAHOO.widget.AutoComplete.prototype.applyLocalFilter = null; + +/** + * When applyLocalFilter is true, the local filtering algorthim can have case sensitivity + * enabled. + * + * @property queryMatchCase + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.queryMatchCase = false; + +/** + * When applyLocalFilter is true, results can be locally filtered to return + * matching strings that "contain" the query string rather than simply "start with" + * the query string. + * + * @property queryMatchContains + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.queryMatchContains = false; + +/** + * Enables query subset matching. When the DataSource's cache is enabled and queryMatchSubset is + * true, substrings of queries will return matching cached results. For + * instance, if the first query is for "abc" susequent queries that start with + * "abc", like "abcd", will be queried against the cache, and not the live data + * source. Recommended only for DataSources that return comprehensive results + * for queries with very few characters. + * + * @property queryMatchSubset + * @type Boolean + * @default false + * + */ +YAHOO.widget.AutoComplete.prototype.queryMatchSubset = false; + +/** + * Number of characters that must be entered before querying for results. A negative value + * effectively turns off the widget. A value of 0 allows queries of null or empty string + * values. + * + * @property minQueryLength + * @type Number + * @default 1 + */ +YAHOO.widget.AutoComplete.prototype.minQueryLength = 1; + +/** + * Maximum number of results to display in results container. + * + * @property maxResultsDisplayed + * @type Number + * @default 10 + */ +YAHOO.widget.AutoComplete.prototype.maxResultsDisplayed = 10; + +/** + * Number of seconds to delay before submitting a query request. If a query + * request is received before a previous one has completed its delay, the + * previous request is cancelled and the new request is set to the delay. If + * typeAhead is also enabled, this value must always be less than the typeAheadDelay + * in order to avoid certain race conditions. + * + * @property queryDelay + * @type Number + * @default 0.2 + */ +YAHOO.widget.AutoComplete.prototype.queryDelay = 0.2; + +/** + * If typeAhead is true, number of seconds to delay before updating input with + * typeAhead value. In order to prevent certain race conditions, this value must + * always be greater than the queryDelay. + * + * @property typeAheadDelay + * @type Number + * @default 0.5 + */ +YAHOO.widget.AutoComplete.prototype.typeAheadDelay = 0.5; + +/** + * When IME usage is detected, AutoComplete will switch to querying the input + * value at the given interval rather than per key event. + * + * @property queryInterval + * @type Number + * @default 500 + */ +YAHOO.widget.AutoComplete.prototype.queryInterval = 500; + +/** + * Class name of a highlighted item within results container. + * + * @property highlightClassName + * @type String + * @default "yui-ac-highlight" + */ +YAHOO.widget.AutoComplete.prototype.highlightClassName = "yui-ac-highlight"; + +/** + * Class name of a pre-highlighted item within results container. + * + * @property prehighlightClassName + * @type String + */ +YAHOO.widget.AutoComplete.prototype.prehighlightClassName = null; + +/** + * Query delimiter. A single character separator for multiple delimited + * selections. Multiple delimiter characteres may be defined as an array of + * strings. A null value or empty string indicates that query results cannot + * be delimited. This feature is not recommended if you need forceSelection to + * be true. + * + * @property delimChar + * @type String | String[] + */ +YAHOO.widget.AutoComplete.prototype.delimChar = null; + +/** + * Whether or not the first item in results container should be automatically highlighted + * on expand. + * + * @property autoHighlight + * @type Boolean + * @default true + */ +YAHOO.widget.AutoComplete.prototype.autoHighlight = true; + +/** + * If autohighlight is enabled, whether or not the input field should be automatically updated + * with the first query result as the user types, auto-selecting the substring portion + * of the first result that the user has not yet typed. + * + * @property typeAhead + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.typeAhead = false; + +/** + * Whether or not to animate the expansion/collapse of the results container in the + * horizontal direction. + * + * @property animHoriz + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.animHoriz = false; + +/** + * Whether or not to animate the expansion/collapse of the results container in the + * vertical direction. + * + * @property animVert + * @type Boolean + * @default true + */ +YAHOO.widget.AutoComplete.prototype.animVert = true; + +/** + * Speed of container expand/collapse animation, in seconds.. + * + * @property animSpeed + * @type Number + * @default 0.3 + */ +YAHOO.widget.AutoComplete.prototype.animSpeed = 0.3; + +/** + * Whether or not to force the user's selection to match one of the query + * results. Enabling this feature essentially transforms the input field into a + * <select> field. This feature is not recommended with delimiter character(s) + * defined. + * + * @property forceSelection + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.forceSelection = false; + +/** + * Whether or not to allow browsers to cache user-typed input in the input + * field. Disabling this feature will prevent the widget from setting the + * autocomplete="off" on the input field. When autocomplete="off" + * and users click the back button after form submission, user-typed input can + * be prefilled by the browser from its cache. This caching of user input may + * not be desired for sensitive data, such as credit card numbers, in which + * case, implementers should consider setting allowBrowserAutocomplete to false. + * + * @property allowBrowserAutocomplete + * @type Boolean + * @default true + */ +YAHOO.widget.AutoComplete.prototype.allowBrowserAutocomplete = true; + +/** + * Enabling this feature prevents the toggling of the container to a collapsed state. + * Setting to true does not automatically trigger the opening of the container. + * Implementers are advised to pre-load the container with an explicit "sendQuery()" call. + * + * @property alwaysShowContainer + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.alwaysShowContainer = false; + +/** + * Whether or not to use an iFrame to layer over Windows form elements in + * IE. Set to true only when the results container will be on top of a + * <select> field in IE and thus exposed to the IE z-index bug (i.e., + * 5.5 < IE < 7). + * + * @property useIFrame + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.useIFrame = false; + +/** + * Whether or not the results container should have a shadow. + * + * @property useShadow + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.useShadow = false; + +/** + * Whether or not the input field should be updated with selections. + * + * @property suppressInputUpdate + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.suppressInputUpdate = false; + +/** + * For backward compatibility to pre-2.6.0 formatResults() signatures, setting + * resultsTypeList to true will take each object literal result returned by + * DataSource and flatten into an array. + * + * @property resultTypeList + * @type Boolean + * @default true + */ +YAHOO.widget.AutoComplete.prototype.resultTypeList = true; + +/** + * For XHR DataSources, AutoComplete will automatically insert a "?" between the server URI and + * the "query" param/value pair. To prevent this behavior, implementers should + * set this value to false. To more fully customize the query syntax, implementers + * should override the generateRequest() method. + * + * @property queryQuestionMark + * @type Boolean + * @default true + */ +YAHOO.widget.AutoComplete.prototype.queryQuestionMark = true; + +///////////////////////////////////////////////////////////////////////////// +// +// Public methods +// +///////////////////////////////////////////////////////////////////////////// + + /** + * Public accessor to the unique name of the AutoComplete instance. + * + * @method toString + * @return {String} Unique name of the AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.toString = function() { + return "AutoComplete " + this._sName; +}; + + /** + * Returns DOM reference to input element. + * + * @method getInputEl + * @return {HTMLELement} DOM reference to input element. + */ +YAHOO.widget.AutoComplete.prototype.getInputEl = function() { + return this._elTextbox; +}; + + /** + * Returns DOM reference to container element. + * + * @method getContainerEl + * @return {HTMLELement} DOM reference to container element. + */ +YAHOO.widget.AutoComplete.prototype.getContainerEl = function() { + return this._elContainer; +}; + + /** + * Returns true if widget instance is currently focused. + * + * @method isFocused + * @return {Boolean} Returns true if widget instance is currently focused. + */ +YAHOO.widget.AutoComplete.prototype.isFocused = function() { + return (this._bFocused === null) ? false : this._bFocused; +}; + + /** + * Returns true if container is in an expanded state, false otherwise. + * + * @method isContainerOpen + * @return {Boolean} Returns true if container is in an expanded state, false otherwise. + */ +YAHOO.widget.AutoComplete.prototype.isContainerOpen = function() { + return this._bContainerOpen; +}; + +/** + * Public accessor to the <ul> element that displays query results within the results container. + * + * @method getListEl + * @return {HTMLElement[]} Reference to <ul> element within the results container. + */ +YAHOO.widget.AutoComplete.prototype.getListEl = function() { + return this._elList; +}; + +/** + * Public accessor to the matching string associated with a given <li> result. + * + * @method getListItemMatch + * @param elListItem {HTMLElement} Reference to <LI> element. + * @return {String} Matching string. + */ +YAHOO.widget.AutoComplete.prototype.getListItemMatch = function(elListItem) { + if(elListItem._sResultMatch) { + return elListItem._sResultMatch; + } + else { + return null; + } +}; + +/** + * Public accessor to the result data associated with a given <li> result. + * + * @method getListItemData + * @param elListItem {HTMLElement} Reference to <LI> element. + * @return {Object} Result data. + */ +YAHOO.widget.AutoComplete.prototype.getListItemData = function(elListItem) { + if(elListItem._oResultData) { + return elListItem._oResultData; + } + else { + return null; + } +}; + +/** + * Public accessor to the index of the associated with a given <li> result. + * + * @method getListItemIndex + * @param elListItem {HTMLElement} Reference to <LI> element. + * @return {Number} Index. + */ +YAHOO.widget.AutoComplete.prototype.getListItemIndex = function(elListItem) { + if(YAHOO.lang.isNumber(elListItem._nItemIndex)) { + return elListItem._nItemIndex; + } + else { + return null; + } +}; + +/** + * Sets HTML markup for the results container header. This markup will be + * inserted within a <div> tag with a class of "yui-ac-hd". + * + * @method setHeader + * @param sHeader {String} HTML markup for results container header. + */ +YAHOO.widget.AutoComplete.prototype.setHeader = function(sHeader) { + if(this._elHeader) { + var elHeader = this._elHeader; + if(sHeader) { + elHeader.innerHTML = sHeader; + elHeader.style.display = "block"; + } + else { + elHeader.innerHTML = ""; + elHeader.style.display = "none"; + } + } +}; + +/** + * Sets HTML markup for the results container footer. This markup will be + * inserted within a <div> tag with a class of "yui-ac-ft". + * + * @method setFooter + * @param sFooter {String} HTML markup for results container footer. + */ +YAHOO.widget.AutoComplete.prototype.setFooter = function(sFooter) { + if(this._elFooter) { + var elFooter = this._elFooter; + if(sFooter) { + elFooter.innerHTML = sFooter; + elFooter.style.display = "block"; + } + else { + elFooter.innerHTML = ""; + elFooter.style.display = "none"; + } + } +}; + +/** + * Sets HTML markup for the results container body. This markup will be + * inserted within a <div> tag with a class of "yui-ac-bd". + * + * @method setBody + * @param sBody {String} HTML markup for results container body. + */ +YAHOO.widget.AutoComplete.prototype.setBody = function(sBody) { + if(this._elBody) { + var elBody = this._elBody; + YAHOO.util.Event.purgeElement(elBody, true); + if(sBody) { + elBody.innerHTML = sBody; + elBody.style.display = "block"; + } + else { + elBody.innerHTML = ""; + elBody.style.display = "none"; + } + this._elList = null; + } +}; + +/** +* A function that converts an AutoComplete query into a request value which is then +* passed to the DataSource's sendRequest method in order to retrieve data for +* the query. By default, returns a String with the syntax: "query={query}" +* Implementers can customize this method for custom request syntaxes. +* +* @method generateRequest +* @param sQuery {String} Query string +* @return {MIXED} Request +*/ +YAHOO.widget.AutoComplete.prototype.generateRequest = function(sQuery) { + var dataType = this.dataSource.dataType; + + // Transform query string in to a request for remote data + // By default, local data doesn't need a transformation, just passes along the query as is. + if(dataType === YAHOO.util.DataSourceBase.TYPE_XHR) { + // By default, XHR GET requests look like "{scriptURI}?{scriptQueryParam}={sQuery}&{scriptQueryAppend}" + if(!this.dataSource.connMethodPost) { + sQuery = (this.queryQuestionMark ? "?" : "") + (this.dataSource.scriptQueryParam || "query") + "=" + sQuery + + (this.dataSource.scriptQueryAppend ? ("&" + this.dataSource.scriptQueryAppend) : ""); + } + // By default, XHR POST bodies are sent to the {scriptURI} like "{scriptQueryParam}={sQuery}&{scriptQueryAppend}" + else { + sQuery = (this.dataSource.scriptQueryParam || "query") + "=" + sQuery + + (this.dataSource.scriptQueryAppend ? ("&" + this.dataSource.scriptQueryAppend) : ""); + } + } + // By default, remote script node requests look like "{scriptURI}&{scriptCallbackParam}={callbackString}&{scriptQueryParam}={sQuery}&{scriptQueryAppend}" + else if(dataType === YAHOO.util.DataSourceBase.TYPE_SCRIPTNODE) { + sQuery = "&" + (this.dataSource.scriptQueryParam || "query") + "=" + sQuery + + (this.dataSource.scriptQueryAppend ? ("&" + this.dataSource.scriptQueryAppend) : ""); + } + + return sQuery; +}; + +/** + * Makes query request to the DataSource. + * + * @method sendQuery + * @param sQuery {String} Query string. + */ +YAHOO.widget.AutoComplete.prototype.sendQuery = function(sQuery) { + // Reset focus for a new interaction + this._bFocused = null; + + // Adjust programatically sent queries to look like they were input by user + // when delimiters are enabled + var newQuery = (this.delimChar) ? this._elTextbox.value + sQuery : sQuery; + this._sendQuery(newQuery); +}; + +/** + * Collapses container. + * + * @method collapseContainer + */ +YAHOO.widget.AutoComplete.prototype.collapseContainer = function() { + this._toggleContainer(false); +}; + +/** + * Handles subset matching for when queryMatchSubset is enabled. + * + * @method getSubsetMatches + * @param sQuery {String} Query string. + * @return {Object} oParsedResponse or null. + */ +YAHOO.widget.AutoComplete.prototype.getSubsetMatches = function(sQuery) { + var subQuery, oCachedResponse, subRequest; + // Loop through substrings of each cached element's query property... + for(var i = sQuery.length; i >= this.minQueryLength ; i--) { + subRequest = this.generateRequest(sQuery.substr(0,i)); + this.dataRequestEvent.fire(this, subQuery, subRequest); + + // If a substring of the query is found in the cache + oCachedResponse = this.dataSource.getCachedResponse(subRequest); + if(oCachedResponse) { + return this.filterResults.apply(this.dataSource, [sQuery, oCachedResponse, oCachedResponse, {scope:this}]); + } + } + return null; +}; + +/** + * Executed by DataSource (within DataSource scope via doBeforeParseData()) to + * handle responseStripAfter cleanup. + * + * @method preparseRawResponse + * @param sQuery {String} Query string. + * @return {Object} oParsedResponse or null. + */ +YAHOO.widget.AutoComplete.prototype.preparseRawResponse = function(oRequest, oFullResponse, oCallback) { + var nEnd = ((this.responseStripAfter !== "") && (oFullResponse.indexOf)) ? + oFullResponse.indexOf(this.responseStripAfter) : -1; + if(nEnd != -1) { + oFullResponse = oFullResponse.substring(0,nEnd); + } + return oFullResponse; +}; + +/** + * Executed by DataSource (within DataSource scope via doBeforeCallback()) to + * filter results through a simple client-side matching algorithm. + * + * @method filterResults + * @param sQuery {String} Original request. + * @param oFullResponse {Object} Full response object. + * @param oParsedResponse {Object} Parsed response object. + * @param oCallback {Object} Callback object. + * @return {Object} Filtered response object. + */ + +YAHOO.widget.AutoComplete.prototype.filterResults = function(sQuery, oFullResponse, oParsedResponse, oCallback) { + // If AC has passed a query string value back to itself, grab it + if(oCallback && oCallback.argument && oCallback.argument.query) { + sQuery = oCallback.argument.query; + } + + // Only if a query string is available to match against + if(sQuery && sQuery !== "") { + // First make a copy of the oParseResponse + oParsedResponse = YAHOO.widget.AutoComplete._cloneObject(oParsedResponse); + + var oAC = oCallback.scope, + oDS = this, + allResults = oParsedResponse.results, // the array of results + filteredResults = [], // container for filtered results + bMatchFound = false, + bMatchCase = (oDS.queryMatchCase || oAC.queryMatchCase), // backward compat + bMatchContains = (oDS.queryMatchContains || oAC.queryMatchContains); // backward compat + + // Loop through each result object... + for(var i = allResults.length-1; i >= 0; i--) { + var oResult = allResults[i]; + + // Grab the data to match against from the result object... + var sResult = null; + + // Result object is a simple string already + if(YAHOO.lang.isString(oResult)) { + sResult = oResult; + } + // Result object is an array of strings + else if(YAHOO.lang.isArray(oResult)) { + sResult = oResult[0]; + + } + // Result object is an object literal of strings + else if(this.responseSchema.fields) { + var key = this.responseSchema.fields[0].key || this.responseSchema.fields[0]; + sResult = oResult[key]; + } + // Backwards compatibility + else if(this.key) { + sResult = oResult[this.key]; + } + + if(YAHOO.lang.isString(sResult)) { + + var sKeyIndex = (bMatchCase) ? + sResult.indexOf(decodeURIComponent(sQuery)) : + sResult.toLowerCase().indexOf(decodeURIComponent(sQuery).toLowerCase()); + + // A STARTSWITH match is when the query is found at the beginning of the key string... + if((!bMatchContains && (sKeyIndex === 0)) || + // A CONTAINS match is when the query is found anywhere within the key string... + (bMatchContains && (sKeyIndex > -1))) { + // Stash the match + filteredResults.unshift(oResult); + } + } + } + oParsedResponse.results = filteredResults; + } + else { + } + + return oParsedResponse; +}; + +/** + * Handles response for display. This is the callback function method passed to + * YAHOO.util.DataSourceBase#sendRequest so results from the DataSource are + * returned to the AutoComplete instance. + * + * @method handleResponse + * @param sQuery {String} Original request. + * @param oResponse {Object} Response object. + * @param oPayload {MIXED} (optional) Additional argument(s) + */ +YAHOO.widget.AutoComplete.prototype.handleResponse = function(sQuery, oResponse, oPayload) { + if((this instanceof YAHOO.widget.AutoComplete) && this._sName) { + this._populateList(sQuery, oResponse, oPayload); + } +}; + +/** + * Overridable method called before container is loaded with result data. + * + * @method doBeforeLoadData + * @param sQuery {String} Original request. + * @param oResponse {Object} Response object. + * @param oPayload {MIXED} (optional) Additional argument(s) + * @return {Boolean} Return true to continue loading data, false to cancel. + */ +YAHOO.widget.AutoComplete.prototype.doBeforeLoadData = function(sQuery, oResponse, oPayload) { + return true; +}; + +/** + * Overridable method that returns HTML markup for one result to be populated + * as innerHTML of an <LI> element. + * + * @method formatResult + * @param oResultData {Object} Result data object. + * @param sQuery {String} The corresponding query string. + * @param sResultMatch {HTMLElement} The current query string. + * @return {String} HTML markup of formatted result data. + */ +YAHOO.widget.AutoComplete.prototype.formatResult = function(oResultData, sQuery, sResultMatch) { + var sMarkup = (sResultMatch) ? sResultMatch : ""; + return sMarkup; +}; + +/** + * Overridable method called before container expands allows implementers to access data + * and DOM elements. + * + * @method doBeforeExpandContainer + * @param elTextbox {HTMLElement} The text input box. + * @param elContainer {HTMLElement} The container element. + * @param sQuery {String} The query string. + * @param aResults {Object[]} An array of query results. + * @return {Boolean} Return true to continue expanding container, false to cancel the expand. + */ +YAHOO.widget.AutoComplete.prototype.doBeforeExpandContainer = function(elTextbox, elContainer, sQuery, aResults) { + return true; +}; + + +/** + * Nulls out the entire AutoComplete instance and related objects, removes attached + * event listeners, and clears out DOM elements inside the container. After + * calling this method, the instance reference should be expliclitly nulled by + * implementer, as in myAutoComplete = null. Use with caution! + * + * @method destroy + */ +YAHOO.widget.AutoComplete.prototype.destroy = function() { + var instanceName = this.toString(); + var elInput = this._elTextbox; + var elContainer = this._elContainer; + + // Unhook custom events + this.textboxFocusEvent.unsubscribeAll(); + this.textboxKeyEvent.unsubscribeAll(); + this.dataRequestEvent.unsubscribeAll(); + this.dataReturnEvent.unsubscribeAll(); + this.dataErrorEvent.unsubscribeAll(); + this.containerPopulateEvent.unsubscribeAll(); + this.containerExpandEvent.unsubscribeAll(); + this.typeAheadEvent.unsubscribeAll(); + this.itemMouseOverEvent.unsubscribeAll(); + this.itemMouseOutEvent.unsubscribeAll(); + this.itemArrowToEvent.unsubscribeAll(); + this.itemArrowFromEvent.unsubscribeAll(); + this.itemSelectEvent.unsubscribeAll(); + this.unmatchedItemSelectEvent.unsubscribeAll(); + this.selectionEnforceEvent.unsubscribeAll(); + this.containerCollapseEvent.unsubscribeAll(); + this.textboxBlurEvent.unsubscribeAll(); + this.textboxChangeEvent.unsubscribeAll(); + + // Unhook DOM events + YAHOO.util.Event.purgeElement(elInput, true); + YAHOO.util.Event.purgeElement(elContainer, true); + + // Remove DOM elements + elContainer.innerHTML = ""; + + // Null out objects + for(var key in this) { + if(YAHOO.lang.hasOwnProperty(this, key)) { + this[key] = null; + } + } + +}; + +///////////////////////////////////////////////////////////////////////////// +// +// Public events +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Fired when the input field receives focus. + * + * @event textboxFocusEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.textboxFocusEvent = null; + +/** + * Fired when the input field receives key input. + * + * @event textboxKeyEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param nKeycode {Number} The keycode number. + */ +YAHOO.widget.AutoComplete.prototype.textboxKeyEvent = null; + +/** + * Fired when the AutoComplete instance makes a request to the DataSource. + * + * @event dataRequestEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param sQuery {String} The query string. + * @param oRequest {Object} The request. + */ +YAHOO.widget.AutoComplete.prototype.dataRequestEvent = null; + +/** + * Fired when the AutoComplete instance receives query results from the data + * source. + * + * @event dataReturnEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param sQuery {String} The query string. + * @param aResults {Object[]} Results array. + */ +YAHOO.widget.AutoComplete.prototype.dataReturnEvent = null; + +/** + * Fired when the AutoComplete instance does not receive query results from the + * DataSource due to an error. + * + * @event dataErrorEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param sQuery {String} The query string. + */ +YAHOO.widget.AutoComplete.prototype.dataErrorEvent = null; + +/** + * Fired when the results container is populated. + * + * @event containerPopulateEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.containerPopulateEvent = null; + +/** + * Fired when the results container is expanded. + * + * @event containerExpandEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.containerExpandEvent = null; + +/** + * Fired when the input field has been prefilled by the type-ahead + * feature. + * + * @event typeAheadEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param sQuery {String} The query string. + * @param sPrefill {String} The prefill string. + */ +YAHOO.widget.AutoComplete.prototype.typeAheadEvent = null; + +/** + * Fired when result item has been moused over. + * + * @event itemMouseOverEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param elItem {HTMLElement} The <li> element item moused to. + */ +YAHOO.widget.AutoComplete.prototype.itemMouseOverEvent = null; + +/** + * Fired when result item has been moused out. + * + * @event itemMouseOutEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param elItem {HTMLElement} The <li> element item moused from. + */ +YAHOO.widget.AutoComplete.prototype.itemMouseOutEvent = null; + +/** + * Fired when result item has been arrowed to. + * + * @event itemArrowToEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param elItem {HTMLElement} The <li> element item arrowed to. + */ +YAHOO.widget.AutoComplete.prototype.itemArrowToEvent = null; + +/** + * Fired when result item has been arrowed away from. + * + * @event itemArrowFromEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param elItem {HTMLElement} The <li> element item arrowed from. + */ +YAHOO.widget.AutoComplete.prototype.itemArrowFromEvent = null; + +/** + * Fired when an item is selected via mouse click, ENTER key, or TAB key. + * + * @event itemSelectEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param elItem {HTMLElement} The selected <li> element item. + * @param oData {Object} The data returned for the item, either as an object, + * or mapped from the schema into an array. + */ +YAHOO.widget.AutoComplete.prototype.itemSelectEvent = null; + +/** + * Fired when a user selection does not match any of the displayed result items. + * + * @event unmatchedItemSelectEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param sSelection {String} The selected string. + */ +YAHOO.widget.AutoComplete.prototype.unmatchedItemSelectEvent = null; + +/** + * Fired if forceSelection is enabled and the user's input has been cleared + * because it did not match one of the returned query results. + * + * @event selectionEnforceEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @param sClearedValue {String} The cleared value (including delimiters if applicable). + */ +YAHOO.widget.AutoComplete.prototype.selectionEnforceEvent = null; + +/** + * Fired when the results container is collapsed. + * + * @event containerCollapseEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.containerCollapseEvent = null; + +/** + * Fired when the input field loses focus. + * + * @event textboxBlurEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.textboxBlurEvent = null; + +/** + * Fired when the input field value has changed when it loses focus. + * + * @event textboxChangeEvent + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.textboxChangeEvent = null; + +///////////////////////////////////////////////////////////////////////////// +// +// Private member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Internal class variable to index multiple AutoComplete instances. + * + * @property _nIndex + * @type Number + * @default 0 + * @private + */ +YAHOO.widget.AutoComplete._nIndex = 0; + +/** + * Name of AutoComplete instance. + * + * @property _sName + * @type String + * @private + */ +YAHOO.widget.AutoComplete.prototype._sName = null; + +/** + * Text input field DOM element. + * + * @property _elTextbox + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._elTextbox = null; + +/** + * Container DOM element. + * + * @property _elContainer + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._elContainer = null; + +/** + * Reference to content element within container element. + * + * @property _elContent + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._elContent = null; + +/** + * Reference to header element within content element. + * + * @property _elHeader + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._elHeader = null; + +/** + * Reference to body element within content element. + * + * @property _elBody + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._elBody = null; + +/** + * Reference to footer element within content element. + * + * @property _elFooter + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._elFooter = null; + +/** + * Reference to shadow element within container element. + * + * @property _elShadow + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._elShadow = null; + +/** + * Reference to iframe element within container element. + * + * @property _elIFrame + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._elIFrame = null; + +/** + * Whether or not the input field is currently in focus. If query results come back + * but the user has already moved on, do not proceed with auto complete behavior. + * + * @property _bFocused + * @type Boolean + * @private + */ +YAHOO.widget.AutoComplete.prototype._bFocused = null; + +/** + * Animation instance for container expand/collapse. + * + * @property _oAnim + * @type Boolean + * @private + */ +YAHOO.widget.AutoComplete.prototype._oAnim = null; + +/** + * Whether or not the results container is currently open. + * + * @property _bContainerOpen + * @type Boolean + * @private + */ +YAHOO.widget.AutoComplete.prototype._bContainerOpen = false; + +/** + * Whether or not the mouse is currently over the results + * container. This is necessary in order to prevent clicks on container items + * from being text input field blur events. + * + * @property _bOverContainer + * @type Boolean + * @private + */ +YAHOO.widget.AutoComplete.prototype._bOverContainer = false; + +/** + * Internal reference to <ul> elements that contains query results within the + * results container. + * + * @property _elList + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._elList = null; + +/* + * Array of <li> elements references that contain query results within the + * results container. + * + * @property _aListItemEls + * @type HTMLElement[] + * @private + */ +//YAHOO.widget.AutoComplete.prototype._aListItemEls = null; + +/** + * Number of <li> elements currently displayed in results container. + * + * @property _nDisplayedItems + * @type Number + * @private + */ +YAHOO.widget.AutoComplete.prototype._nDisplayedItems = 0; + +/* + * Internal count of <li> elements displayed and hidden in results container. + * + * @property _maxResultsDisplayed + * @type Number + * @private + */ +//YAHOO.widget.AutoComplete.prototype._maxResultsDisplayed = 0; + +/** + * Current query string + * + * @property _sCurQuery + * @type String + * @private + */ +YAHOO.widget.AutoComplete.prototype._sCurQuery = null; + +/** + * Selections from previous queries (for saving delimited queries). + * + * @property _sPastSelections + * @type String + * @default "" + * @private + */ +YAHOO.widget.AutoComplete.prototype._sPastSelections = ""; + +/** + * Stores initial input value used to determine if textboxChangeEvent should be fired. + * + * @property _sInitInputValue + * @type String + * @private + */ +YAHOO.widget.AutoComplete.prototype._sInitInputValue = null; + +/** + * Pointer to the currently highlighted <li> element in the container. + * + * @property _elCurListItem + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._elCurListItem = null; + +/** + * Whether or not an item has been selected since the container was populated + * with results. Reset to false by _populateList, and set to true when item is + * selected. + * + * @property _bItemSelected + * @type Boolean + * @private + */ +YAHOO.widget.AutoComplete.prototype._bItemSelected = false; + +/** + * Key code of the last key pressed in textbox. + * + * @property _nKeyCode + * @type Number + * @private + */ +YAHOO.widget.AutoComplete.prototype._nKeyCode = null; + +/** + * Delay timeout ID. + * + * @property _nDelayID + * @type Number + * @private + */ +YAHOO.widget.AutoComplete.prototype._nDelayID = -1; + +/** + * TypeAhead delay timeout ID. + * + * @property _nTypeAheadDelayID + * @type Number + * @private + */ +YAHOO.widget.AutoComplete.prototype._nTypeAheadDelayID = -1; + +/** + * Src to iFrame used when useIFrame = true. Supports implementations over SSL + * as well. + * + * @property _iFrameSrc + * @type String + * @private + */ +YAHOO.widget.AutoComplete.prototype._iFrameSrc = "javascript:false;"; + +/** + * For users typing via certain IMEs, queries must be triggered by intervals, + * since key events yet supported across all browsers for all IMEs. + * + * @property _queryInterval + * @type Object + * @private + */ +YAHOO.widget.AutoComplete.prototype._queryInterval = null; + +/** + * Internal tracker to last known textbox value, used to determine whether or not + * to trigger a query via interval for certain IME users. + * + * @event _sLastTextboxValue + * @type String + * @private + */ +YAHOO.widget.AutoComplete.prototype._sLastTextboxValue = null; + +///////////////////////////////////////////////////////////////////////////// +// +// Private methods +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Updates and validates latest public config properties. + * + * @method __initProps + * @private + */ +YAHOO.widget.AutoComplete.prototype._initProps = function() { + // Correct any invalid values + var minQueryLength = this.minQueryLength; + if(!YAHOO.lang.isNumber(minQueryLength)) { + this.minQueryLength = 1; + } + var maxResultsDisplayed = this.maxResultsDisplayed; + if(!YAHOO.lang.isNumber(maxResultsDisplayed) || (maxResultsDisplayed < 1)) { + this.maxResultsDisplayed = 10; + } + var queryDelay = this.queryDelay; + if(!YAHOO.lang.isNumber(queryDelay) || (queryDelay < 0)) { + this.queryDelay = 0.2; + } + var typeAheadDelay = this.typeAheadDelay; + if(!YAHOO.lang.isNumber(typeAheadDelay) || (typeAheadDelay < 0)) { + this.typeAheadDelay = 0.2; + } + var delimChar = this.delimChar; + if(YAHOO.lang.isString(delimChar) && (delimChar.length > 0)) { + this.delimChar = [delimChar]; + } + else if(!YAHOO.lang.isArray(delimChar)) { + this.delimChar = null; + } + var animSpeed = this.animSpeed; + if((this.animHoriz || this.animVert) && YAHOO.util.Anim) { + if(!YAHOO.lang.isNumber(animSpeed) || (animSpeed < 0)) { + this.animSpeed = 0.3; + } + if(!this._oAnim ) { + this._oAnim = new YAHOO.util.Anim(this._elContent, {}, this.animSpeed); + } + else { + this._oAnim.duration = this.animSpeed; + } + } + if(this.forceSelection && delimChar) { + } +}; + +/** + * Initializes the results container helpers if they are enabled and do + * not exist + * + * @method _initContainerHelperEls + * @private + */ +YAHOO.widget.AutoComplete.prototype._initContainerHelperEls = function() { + if(this.useShadow && !this._elShadow) { + var elShadow = document.createElement("div"); + elShadow.className = "yui-ac-shadow"; + elShadow.style.width = 0; + elShadow.style.height = 0; + this._elShadow = this._elContainer.appendChild(elShadow); + } + if(this.useIFrame && !this._elIFrame) { + var elIFrame = document.createElement("iframe"); + elIFrame.src = this._iFrameSrc; + elIFrame.frameBorder = 0; + elIFrame.scrolling = "no"; + elIFrame.style.position = "absolute"; + elIFrame.style.width = 0; + elIFrame.style.height = 0; + elIFrame.tabIndex = -1; + elIFrame.style.padding = 0; + this._elIFrame = this._elContainer.appendChild(elIFrame); + } +}; + +/** + * Initializes the results container once at object creation + * + * @method _initContainerEl + * @private + */ +YAHOO.widget.AutoComplete.prototype._initContainerEl = function() { + YAHOO.util.Dom.addClass(this._elContainer, "yui-ac-container"); + + if(!this._elContent) { + // The elContent div is assigned DOM listeners and + // helps size the iframe and shadow properly + var elContent = document.createElement("div"); + elContent.className = "yui-ac-content"; + elContent.style.display = "none"; + + this._elContent = this._elContainer.appendChild(elContent); + + var elHeader = document.createElement("div"); + elHeader.className = "yui-ac-hd"; + elHeader.style.display = "none"; + this._elHeader = this._elContent.appendChild(elHeader); + + var elBody = document.createElement("div"); + elBody.className = "yui-ac-bd"; + this._elBody = this._elContent.appendChild(elBody); + + var elFooter = document.createElement("div"); + elFooter.className = "yui-ac-ft"; + elFooter.style.display = "none"; + this._elFooter = this._elContent.appendChild(elFooter); + } + else { + } +}; + +/** + * Clears out contents of container body and creates up to + * YAHOO.widget.AutoComplete#maxResultsDisplayed <li> elements in an + * <ul> element. + * + * @method _initListEl + * @private + */ +YAHOO.widget.AutoComplete.prototype._initListEl = function() { + var nListLength = this.maxResultsDisplayed; + + var elList = this._elList || document.createElement("ul"); + var elListItem; + while(elList.childNodes.length < nListLength) { + elListItem = document.createElement("li"); + elListItem.style.display = "none"; + elListItem._nItemIndex = elList.childNodes.length; + elList.appendChild(elListItem); + } + if(!this._elList) { + var elBody = this._elBody; + YAHOO.util.Event.purgeElement(elBody, true); + elBody.innerHTML = ""; + this._elList = elBody.appendChild(elList); + } + +}; + +/** + * Focuses input field. + * + * @method _focus + * @private + */ +YAHOO.widget.AutoComplete.prototype._focus = function() { + // http://developer.mozilla.org/en/docs/index.php?title=Key-navigable_custom_DHTML_widgets + var oSelf = this; + setTimeout(function() { + try { + oSelf._elTextbox.focus(); + } + catch(e) { + } + },0); +}; + +/** + * Enables interval detection for IME support. + * + * @method _enableIntervalDetection + * @private + */ +YAHOO.widget.AutoComplete.prototype._enableIntervalDetection = function() { + var oSelf = this; + if(!oSelf._queryInterval && oSelf.queryInterval) { + oSelf._queryInterval = setInterval(function() { oSelf._onInterval(); }, oSelf.queryInterval); + } +}; + +/** + * Enables query triggers based on text input detection by intervals (rather + * than by key events). + * + * @method _onInterval + * @private + */ +YAHOO.widget.AutoComplete.prototype._onInterval = function() { + var currValue = this._elTextbox.value; + var lastValue = this._sLastTextboxValue; + if(currValue != lastValue) { + this._sLastTextboxValue = currValue; + this._sendQuery(currValue); + } +}; + +/** + * Cancels text input detection by intervals. + * + * @method _clearInterval + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._clearInterval = function() { + if(this._queryInterval) { + clearInterval(this._queryInterval); + this._queryInterval = null; + } +}; + +/** + * Whether or not key is functional or should be ignored. Note that the right + * arrow key is NOT an ignored key since it triggers queries for certain intl + * charsets. + * + * @method _isIgnoreKey + * @param nKeycode {Number} Code of key pressed. + * @return {Boolean} True if key should be ignored, false otherwise. + * @private + */ +YAHOO.widget.AutoComplete.prototype._isIgnoreKey = function(nKeyCode) { + if((nKeyCode == 9) || (nKeyCode == 13) || // tab, enter + (nKeyCode == 16) || (nKeyCode == 17) || // shift, ctl + (nKeyCode >= 18 && nKeyCode <= 20) || // alt, pause/break,caps lock + (nKeyCode == 27) || // esc + (nKeyCode >= 33 && nKeyCode <= 35) || // page up,page down,end + /*(nKeyCode >= 36 && nKeyCode <= 38) || // home,left,up + (nKeyCode == 40) || // down*/ + (nKeyCode >= 36 && nKeyCode <= 40) || // home,left,up, right, down + (nKeyCode >= 44 && nKeyCode <= 45) || // print screen,insert + (nKeyCode == 229) // Bug 2041973: Korean XP fires 2 keyup events, the key and 229 + ) { + return true; + } + return false; +}; + +/** + * Makes query request to the DataSource. + * + * @method _sendQuery + * @param sQuery {String} Query string. + * @private + */ +YAHOO.widget.AutoComplete.prototype._sendQuery = function(sQuery) { + // Widget has been effectively turned off + if(this.minQueryLength < 0) { + this._toggleContainer(false); + return; + } + // Delimiter has been enabled + if(this.delimChar) { + var extraction = this._extractQuery(sQuery); + // Here is the query itself + sQuery = extraction.query; + // ...and save the rest of the string for later + this._sPastSelections = extraction.previous; + } + + // Don't search queries that are too short + if((sQuery && (sQuery.length < this.minQueryLength)) || (!sQuery && this.minQueryLength > 0)) { + if(this._nDelayID != -1) { + clearTimeout(this._nDelayID); + } + this._toggleContainer(false); + return; + } + + sQuery = encodeURIComponent(sQuery); + this._nDelayID = -1; // Reset timeout ID because request is being made + + // Subset matching + if(this.dataSource.queryMatchSubset || this.queryMatchSubset) { // backward compat + var oResponse = this.getSubsetMatches(sQuery); + if(oResponse) { + this.handleResponse(sQuery, oResponse, {query: sQuery}); + return; + } + } + + if(this.responseStripAfter) { + this.dataSource.doBeforeParseData = this.preparseRawResponse; + } + if(this.applyLocalFilter) { + this.dataSource.doBeforeCallback = this.filterResults; + } + + var sRequest = this.generateRequest(sQuery); + this.dataRequestEvent.fire(this, sQuery, sRequest); + + this.dataSource.sendRequest(sRequest, { + success : this.handleResponse, + failure : this.handleResponse, + scope : this, + argument: { + query: sQuery + } + }); +}; + +/** + * Populates the array of <li> elements in the container with query + * results. + * + * @method _populateList + * @param sQuery {String} Original request. + * @param oResponse {Object} Response object. + * @param oPayload {MIXED} (optional) Additional argument(s) + * @private + */ +YAHOO.widget.AutoComplete.prototype._populateList = function(sQuery, oResponse, oPayload) { + // Clear previous timeout + if(this._nTypeAheadDelayID != -1) { + clearTimeout(this._nTypeAheadDelayID); + } + + sQuery = (oPayload && oPayload.query) ? oPayload.query : sQuery; + + // Pass data through abstract method for any transformations + var ok = this.doBeforeLoadData(sQuery, oResponse, oPayload); + + // Data is ok + if(ok && !oResponse.error) { + this.dataReturnEvent.fire(this, sQuery, oResponse.results); + + // Continue only if instance is still focused (i.e., user hasn't already moved on) + // Null indicates initialized state, which is ok too + if(this._bFocused || (this._bFocused === null)) { + + //TODO: is this still necessary? + /*var isOpera = (YAHOO.env.ua.opera); + var contentStyle = this._elContent.style; + contentStyle.width = (!isOpera) ? null : ""; + contentStyle.height = (!isOpera) ? null : "";*/ + + // Store state for this interaction + var sCurQuery = decodeURIComponent(sQuery); + this._sCurQuery = sCurQuery; + this._bItemSelected = false; + + var allResults = oResponse.results, + nItemsToShow = Math.min(allResults.length,this.maxResultsDisplayed), + sMatchKey = (this.dataSource.responseSchema.fields) ? + (this.dataSource.responseSchema.fields[0].key || this.dataSource.responseSchema.fields[0]) : 0; + + if(nItemsToShow > 0) { + // Make sure container and helpers are ready to go + if(!this._elList || (this._elList.childNodes.length < nItemsToShow)) { + this._initListEl(); + } + this._initContainerHelperEls(); + + var allListItemEls = this._elList.childNodes; + // Fill items with data from the bottom up + for(var i = nItemsToShow-1; i >= 0; i--) { + var elListItem = allListItemEls[i], + oResult = allResults[i]; + + // Backward compatibility + if(this.resultTypeList) { + // Results need to be converted back to an array + var aResult = []; + // Match key is first + aResult[0] = (YAHOO.lang.isString(oResult)) ? oResult : oResult[sMatchKey] || oResult[this.key]; + // Add additional data to the result array + var fields = this.dataSource.responseSchema.fields; + if(YAHOO.lang.isArray(fields) && (fields.length > 1)) { + for(var k=1, len=fields.length; k= nItemsToShow; j--) { + extraListItem = allListItemEls[j]; + extraListItem.style.display = "none"; + } + } + + this._nDisplayedItems = nItemsToShow; + + this.containerPopulateEvent.fire(this, sQuery, allResults); + + // Highlight the first item + if(this.autoHighlight) { + var elFirstListItem = this._elList.firstChild; + this._toggleHighlight(elFirstListItem,"to"); + this.itemArrowToEvent.fire(this, elFirstListItem); + this._typeAhead(elFirstListItem,sQuery); + } + // Unhighlight any previous time + else { + this._toggleHighlight(this._elCurListItem,"from"); + } + + // Expand the container + ok = this.doBeforeExpandContainer(this._elTextbox, this._elContainer, sQuery, allResults); + this._toggleContainer(ok); + } + else { + this._toggleContainer(false); + } + + return; + } + } + // Error + else { + this.dataErrorEvent.fire(this, sQuery); + } + +}; + +/** + * When forceSelection is true and the user attempts + * leave the text input box without selecting an item from the query results, + * the user selection is cleared. + * + * @method _clearSelection + * @private + */ +YAHOO.widget.AutoComplete.prototype._clearSelection = function() { + var extraction = (this.delimChar) ? this._extractQuery(this._elTextbox.value) : + {previous:"",query:this._elTextbox.value}; + this._elTextbox.value = extraction.previous; + this.selectionEnforceEvent.fire(this, extraction.query); +}; + +/** + * Whether or not user-typed value in the text input box matches any of the + * query results. + * + * @method _textMatchesOption + * @return {HTMLElement} Matching list item element if user-input text matches + * a result, null otherwise. + * @private + */ +YAHOO.widget.AutoComplete.prototype._textMatchesOption = function() { + var elMatch = null; + + for(var i=0; i= 0; i--) { + nNewIndex = sQuery.lastIndexOf(aDelimChar[i]); + if(nNewIndex > nDelimIndex) { + nDelimIndex = nNewIndex; + } + } + // If we think the last delimiter is a space (" "), make sure it is NOT + // a false positive by also checking the char directly before it + if(aDelimChar[i] == " ") { + for (var j = aDelimChar.length-1; j >= 0; j--) { + if(sQuery[nDelimIndex - 1] == aDelimChar[j]) { + nDelimIndex--; + break; + } + } + } + // A delimiter has been found in the query so extract the latest query from past selections + if(nDelimIndex > -1) { + nQueryStart = nDelimIndex + 1; + // Trim any white space from the beginning... + while(sQuery.charAt(nQueryStart) == " ") { + nQueryStart += 1; + } + // ...and save the rest of the string for later + sPrevious = sQuery.substring(0,nQueryStart); + // Here is the query itself + sQuery = sQuery.substr(nQueryStart); + } + // No delimiter found in the query, so there are no selections from past queries + else { + sPrevious = ""; + } + + return { + previous: sPrevious, + query: sQuery + }; +}; + +/** + * Syncs results container with its helpers. + * + * @method _toggleContainerHelpers + * @param bShow {Boolean} True if container is expanded, false if collapsed + * @private + */ +YAHOO.widget.AutoComplete.prototype._toggleContainerHelpers = function(bShow) { + var width = this._elContent.offsetWidth + "px"; + var height = this._elContent.offsetHeight + "px"; + + if(this.useIFrame && this._elIFrame) { + var elIFrame = this._elIFrame; + if(bShow) { + elIFrame.style.width = width; + elIFrame.style.height = height; + elIFrame.style.padding = ""; + } + else { + elIFrame.style.width = 0; + elIFrame.style.height = 0; + elIFrame.style.padding = 0; + } + } + if(this.useShadow && this._elShadow) { + var elShadow = this._elShadow; + if(bShow) { + elShadow.style.width = width; + elShadow.style.height = height; + } + else { + elShadow.style.width = 0; + elShadow.style.height = 0; + } + } +}; + +/** + * Animates expansion or collapse of the container. + * + * @method _toggleContainer + * @param bShow {Boolean} True if container should be expanded, false if container should be collapsed + * @private + */ +YAHOO.widget.AutoComplete.prototype._toggleContainer = function(bShow) { + + var elContainer = this._elContainer; + + // If implementer has container always open and it's already open, don't mess with it + // Container is initialized with display "none" so it may need to be shown first time through + if(this.alwaysShowContainer && this._bContainerOpen) { + return; + } + + // Reset states + if(!bShow) { + this._toggleHighlight(this._elCurListItem,"from"); + this._nDisplayedItems = 0; + this._sCurQuery = null; + + // Container is already closed, so don't bother with changing the UI + if(this._elContent.style.display == "none") { + return; + } + } + + // If animation is enabled... + var oAnim = this._oAnim; + if(oAnim && oAnim.getEl() && (this.animHoriz || this.animVert)) { + if(oAnim.isAnimated()) { + oAnim.stop(true); + } + + // Clone container to grab current size offscreen + var oClone = this._elContent.cloneNode(true); + elContainer.appendChild(oClone); + oClone.style.top = "-9000px"; + oClone.style.width = ""; + oClone.style.height = ""; + oClone.style.display = ""; + + // Current size of the container is the EXPANDED size + var wExp = oClone.offsetWidth; + var hExp = oClone.offsetHeight; + + // Calculate COLLAPSED sizes based on horiz and vert anim + var wColl = (this.animHoriz) ? 0 : wExp; + var hColl = (this.animVert) ? 0 : hExp; + + // Set animation sizes + oAnim.attributes = (bShow) ? + {width: { to: wExp }, height: { to: hExp }} : + {width: { to: wColl}, height: { to: hColl }}; + + // If opening anew, set to a collapsed size... + if(bShow && !this._bContainerOpen) { + this._elContent.style.width = wColl+"px"; + this._elContent.style.height = hColl+"px"; + } + // Else, set it to its last known size. + else { + this._elContent.style.width = wExp+"px"; + this._elContent.style.height = hExp+"px"; + } + + elContainer.removeChild(oClone); + oClone = null; + + var oSelf = this; + var onAnimComplete = function() { + // Finish the collapse + oAnim.onComplete.unsubscribeAll(); + + if(bShow) { + oSelf._toggleContainerHelpers(true); + oSelf._bContainerOpen = bShow; + oSelf.containerExpandEvent.fire(oSelf); + } + else { + oSelf._elContent.style.display = "none"; + oSelf._bContainerOpen = bShow; + oSelf.containerCollapseEvent.fire(oSelf); + } + }; + + // Display container and animate it + this._toggleContainerHelpers(false); // Bug 1424486: Be early to hide, late to show; + this._elContent.style.display = ""; + oAnim.onComplete.subscribe(onAnimComplete); + oAnim.animate(); + } + // Else don't animate, just show or hide + else { + if(bShow) { + this._elContent.style.display = ""; + this._toggleContainerHelpers(true); + this._bContainerOpen = bShow; + this.containerExpandEvent.fire(this); + } + else { + this._toggleContainerHelpers(false); + this._elContent.style.display = "none"; + this._bContainerOpen = bShow; + this.containerCollapseEvent.fire(this); + } + } + +}; + +/** + * Toggles the highlight on or off for an item in the container, and also cleans + * up highlighting of any previous item. + * + * @method _toggleHighlight + * @param elNewListItem {HTMLElement} The <li> element item to receive highlight behavior. + * @param sType {String} Type "mouseover" will toggle highlight on, and "mouseout" will toggle highlight off. + * @private + */ +YAHOO.widget.AutoComplete.prototype._toggleHighlight = function(elNewListItem, sType) { + if(elNewListItem) { + var sHighlight = this.highlightClassName; + if(this._elCurListItem) { + // Remove highlight from old item + YAHOO.util.Dom.removeClass(this._elCurListItem, sHighlight); + this._elCurListItem = null; + } + + if((sType == "to") && sHighlight) { + // Apply highlight to new item + YAHOO.util.Dom.addClass(elNewListItem, sHighlight); + this._elCurListItem = elNewListItem; + } + } +}; + +/** + * Toggles the pre-highlight on or off for an item in the container. + * + * @method _togglePrehighlight + * @param elNewListItem {HTMLElement} The <li> element item to receive highlight behavior. + * @param sType {String} Type "mouseover" will toggle highlight on, and "mouseout" will toggle highlight off. + * @private + */ +YAHOO.widget.AutoComplete.prototype._togglePrehighlight = function(elNewListItem, sType) { + if(elNewListItem == this._elCurListItem) { + return; + } + + var sPrehighlight = this.prehighlightClassName; + if((sType == "mouseover") && sPrehighlight) { + // Apply prehighlight to new item + YAHOO.util.Dom.addClass(elNewListItem, sPrehighlight); + } + else { + // Remove prehighlight from old item + YAHOO.util.Dom.removeClass(elNewListItem, sPrehighlight); + } +}; + +/** + * Updates the text input box value with selected query result. If a delimiter + * has been defined, then the value gets appended with the delimiter. + * + * @method _updateValue + * @param elListItem {HTMLElement} The <li> element item with which to update the value. + * @private + */ +YAHOO.widget.AutoComplete.prototype._updateValue = function(elListItem) { + if(!this.suppressInputUpdate) { + var elTextbox = this._elTextbox; + var sDelimChar = (this.delimChar) ? (this.delimChar[0] || this.delimChar) : null; + var sResultMatch = elListItem._sResultMatch; + + // Calculate the new value + var sNewValue = ""; + if(sDelimChar) { + // Preserve selections from past queries + sNewValue = this._sPastSelections; + // Add new selection plus delimiter + sNewValue += sResultMatch + sDelimChar; + if(sDelimChar != " ") { + sNewValue += " "; + } + } + else { + sNewValue = sResultMatch; + } + + // Update input field + elTextbox.value = sNewValue; + + // Scroll to bottom of textarea if necessary + if(elTextbox.type == "textarea") { + elTextbox.scrollTop = elTextbox.scrollHeight; + } + + // Move cursor to end + var end = elTextbox.value.length; + this._selectText(elTextbox,end,end); + + this._elCurListItem = elListItem; + } +}; + +/** + * Selects a result item from the container + * + * @method _selectItem + * @param elListItem {HTMLElement} The selected <li> element item. + * @private + */ +YAHOO.widget.AutoComplete.prototype._selectItem = function(elListItem) { + this._bItemSelected = true; + this._updateValue(elListItem); + this._sPastSelections = this._elTextbox.value; + this._clearInterval(); + this.itemSelectEvent.fire(this, elListItem, elListItem._oResultData); + this._toggleContainer(false); +}; + +/** + * If an item is highlighted in the container, the right arrow key jumps to the + * end of the textbox and selects the highlighted item, otherwise the container + * is closed. + * + * @method _jumpSelection + * @private + */ +YAHOO.widget.AutoComplete.prototype._jumpSelection = function() { + if(this._elCurListItem) { + this._selectItem(this._elCurListItem); + } + else { + this._toggleContainer(false); + } +}; + +/** + * Triggered by up and down arrow keys, changes the current highlighted + * <li> element item. Scrolls container if necessary. + * + * @method _moveSelection + * @param nKeyCode {Number} Code of key pressed. + * @private + */ +YAHOO.widget.AutoComplete.prototype._moveSelection = function(nKeyCode) { + if(this._bContainerOpen) { + // Determine current item's id number + var elCurListItem = this._elCurListItem, + nCurItemIndex = -1; + + if(elCurListItem) { + nCurItemIndex = elCurListItem._nItemIndex; + } + + var nNewItemIndex = (nKeyCode == 40) ? + (nCurItemIndex + 1) : (nCurItemIndex - 1); + + // Out of bounds + if(nNewItemIndex < -2 || nNewItemIndex >= this._nDisplayedItems) { + return; + } + + if(elCurListItem) { + // Unhighlight current item + this._toggleHighlight(elCurListItem, "from"); + this.itemArrowFromEvent.fire(this, elCurListItem); + } + if(nNewItemIndex == -1) { + // Go back to query (remove type-ahead string) + if(this.delimChar) { + this._elTextbox.value = this._sPastSelections + this._sCurQuery; + } + else { + this._elTextbox.value = this._sCurQuery; + } + return; + } + if(nNewItemIndex == -2) { + // Close container + this._toggleContainer(false); + return; + } + + var elNewListItem = this._elList.childNodes[nNewItemIndex], + + // Scroll the container if necessary + elContent = this._elContent, + sOF = YAHOO.util.Dom.getStyle(elContent,"overflow"), + sOFY = YAHOO.util.Dom.getStyle(elContent,"overflowY"), + scrollOn = ((sOF == "auto") || (sOF == "scroll") || (sOFY == "auto") || (sOFY == "scroll")); + if(scrollOn && (nNewItemIndex > -1) && + (nNewItemIndex < this._nDisplayedItems)) { + // User is keying down + if(nKeyCode == 40) { + // Bottom of selected item is below scroll area... + if((elNewListItem.offsetTop+elNewListItem.offsetHeight) > (elContent.scrollTop + elContent.offsetHeight)) { + // Set bottom of scroll area to bottom of selected item + elContent.scrollTop = (elNewListItem.offsetTop+elNewListItem.offsetHeight) - elContent.offsetHeight; + } + // Bottom of selected item is above scroll area... + else if((elNewListItem.offsetTop+elNewListItem.offsetHeight) < elContent.scrollTop) { + // Set top of selected item to top of scroll area + elContent.scrollTop = elNewListItem.offsetTop; + + } + } + // User is keying up + else { + // Top of selected item is above scroll area + if(elNewListItem.offsetTop < elContent.scrollTop) { + // Set top of scroll area to top of selected item + this._elContent.scrollTop = elNewListItem.offsetTop; + } + // Top of selected item is below scroll area + else if(elNewListItem.offsetTop > (elContent.scrollTop + elContent.offsetHeight)) { + // Set bottom of selected item to bottom of scroll area + this._elContent.scrollTop = (elNewListItem.offsetTop+elNewListItem.offsetHeight) - elContent.offsetHeight; + } + } + } + + this._toggleHighlight(elNewListItem, "to"); + this.itemArrowToEvent.fire(this, elNewListItem); + if(this.typeAhead) { + this._updateValue(elNewListItem); + } + } +}; + +///////////////////////////////////////////////////////////////////////////// +// +// Private event handlers +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Handles container mouseover events. + * + * @method _onContainerMouseover + * @param v {HTMLEvent} The mouseover event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onContainerMouseover = function(v,oSelf) { + var elTarget = YAHOO.util.Event.getTarget(v); + var elTag = elTarget.nodeName.toLowerCase(); + while(elTarget && (elTag != "table")) { + switch(elTag) { + case "body": + return; + case "li": + if(oSelf.prehighlightClassName) { + oSelf._togglePrehighlight(elTarget,"mouseover"); + } + else { + oSelf._toggleHighlight(elTarget,"to"); + } + + oSelf.itemMouseOverEvent.fire(oSelf, elTarget); + break; + case "div": + if(YAHOO.util.Dom.hasClass(elTarget,"yui-ac-container")) { + oSelf._bOverContainer = true; + return; + } + break; + default: + break; + } + + elTarget = elTarget.parentNode; + if(elTarget) { + elTag = elTarget.nodeName.toLowerCase(); + } + } +}; + +/** + * Handles container mouseout events. + * + * @method _onContainerMouseout + * @param v {HTMLEvent} The mouseout event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onContainerMouseout = function(v,oSelf) { + var elTarget = YAHOO.util.Event.getTarget(v); + var elTag = elTarget.nodeName.toLowerCase(); + while(elTarget && (elTag != "table")) { + switch(elTag) { + case "body": + return; + case "li": + if(oSelf.prehighlightClassName) { + oSelf._togglePrehighlight(elTarget,"mouseout"); + } + else { + oSelf._toggleHighlight(elTarget,"from"); + } + + oSelf.itemMouseOutEvent.fire(oSelf, elTarget); + break; + case "ul": + oSelf._toggleHighlight(oSelf._elCurListItem,"to"); + break; + case "div": + if(YAHOO.util.Dom.hasClass(elTarget,"yui-ac-container")) { + oSelf._bOverContainer = false; + return; + } + break; + default: + break; + } + + elTarget = elTarget.parentNode; + if(elTarget) { + elTag = elTarget.nodeName.toLowerCase(); + } + } +}; + +/** + * Handles container click events. + * + * @method _onContainerClick + * @param v {HTMLEvent} The click event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onContainerClick = function(v,oSelf) { + var elTarget = YAHOO.util.Event.getTarget(v); + var elTag = elTarget.nodeName.toLowerCase(); + while(elTarget && (elTag != "table")) { + switch(elTag) { + case "body": + return; + case "li": + // In case item has not been moused over + oSelf._toggleHighlight(elTarget,"to"); + oSelf._selectItem(elTarget); + return; + default: + break; + } + + elTarget = elTarget.parentNode; + if(elTarget) { + elTag = elTarget.nodeName.toLowerCase(); + } + } +}; + + +/** + * Handles container scroll events. + * + * @method _onContainerScroll + * @param v {HTMLEvent} The scroll event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onContainerScroll = function(v,oSelf) { + oSelf._focus(); +}; + +/** + * Handles container resize events. + * + * @method _onContainerResize + * @param v {HTMLEvent} The resize event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onContainerResize = function(v,oSelf) { + oSelf._toggleContainerHelpers(oSelf._bContainerOpen); +}; + + +/** + * Handles textbox keydown events of functional keys, mainly for UI behavior. + * + * @method _onTextboxKeyDown + * @param v {HTMLEvent} The keydown event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onTextboxKeyDown = function(v,oSelf) { + var nKeyCode = v.keyCode; + + // Clear timeout + if(oSelf._nTypeAheadDelayID != -1) { + clearTimeout(oSelf._nTypeAheadDelayID); + } + + switch (nKeyCode) { + case 9: // tab + if(!YAHOO.env.ua.opera && (navigator.userAgent.toLowerCase().indexOf("mac") == -1) || (YAHOO.env.ua.webkit>420)) { + // select an item or clear out + if(oSelf._elCurListItem) { + if(oSelf.delimChar && (oSelf._nKeyCode != nKeyCode)) { + if(oSelf._bContainerOpen) { + YAHOO.util.Event.stopEvent(v); + } + } + oSelf._selectItem(oSelf._elCurListItem); + } + else { + oSelf._toggleContainer(false); + } + } + break; + case 13: // enter + if(!YAHOO.env.ua.opera && (navigator.userAgent.toLowerCase().indexOf("mac") == -1) || (YAHOO.env.ua.webkit>420)) { + if(oSelf._elCurListItem) { + if(oSelf._nKeyCode != nKeyCode) { + if(oSelf._bContainerOpen) { + YAHOO.util.Event.stopEvent(v); + } + } + oSelf._selectItem(oSelf._elCurListItem); + } + else { + oSelf._toggleContainer(false); + } + } + break; + case 27: // esc + oSelf._toggleContainer(false); + return; + case 39: // right + oSelf._jumpSelection(); + break; + case 38: // up + if(oSelf._bContainerOpen) { + YAHOO.util.Event.stopEvent(v); + oSelf._moveSelection(nKeyCode); + } + break; + case 40: // down + if(oSelf._bContainerOpen) { + YAHOO.util.Event.stopEvent(v); + oSelf._moveSelection(nKeyCode); + } + break; + default: + oSelf._bItemSelected = false; + oSelf._toggleHighlight(oSelf._elCurListItem, "from"); + + oSelf.textboxKeyEvent.fire(oSelf, nKeyCode); + break; + } + + if(nKeyCode === 18){ + oSelf._enableIntervalDetection(); + } + oSelf._nKeyCode = nKeyCode; +}; + +/** + * Handles textbox keypress events. + * @method _onTextboxKeyPress + * @param v {HTMLEvent} The keypress event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onTextboxKeyPress = function(v,oSelf) { + var nKeyCode = v.keyCode; + + // Expose only to non SF3 (bug 1978549) Mac browsers (bug 790337) and Opera browsers (bug 583531), + // where stopEvent is ineffective on keydown events + if(YAHOO.env.ua.opera || (navigator.userAgent.toLowerCase().indexOf("mac") != -1) && (YAHOO.env.ua.webkit < 420)) { + switch (nKeyCode) { + case 9: // tab + // select an item or clear out + if(oSelf._bContainerOpen) { + if(oSelf.delimChar) { + YAHOO.util.Event.stopEvent(v); + } + if(oSelf._elCurListItem) { + oSelf._selectItem(oSelf._elCurListItem); + } + else { + oSelf._toggleContainer(false); + } + } + break; + case 13: // enter + if(oSelf._bContainerOpen) { + YAHOO.util.Event.stopEvent(v); + if(oSelf._elCurListItem) { + oSelf._selectItem(oSelf._elCurListItem); + } + else { + oSelf._toggleContainer(false); + } + } + break; + default: + break; + } + } + + //TODO: (?) limit only to non-IE, non-Mac-FF for Korean IME support (bug 811948) + // Korean IME detected + else if(nKeyCode == 229) { + oSelf._enableIntervalDetection(); + } +}; + +/** + * Handles textbox keyup events to trigger queries. + * + * @method _onTextboxKeyUp + * @param v {HTMLEvent} The keyup event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onTextboxKeyUp = function(v,oSelf) { + var sText = this.value; //string in textbox + + // Check to see if any of the public properties have been updated + oSelf._initProps(); + + // Filter out chars that don't trigger queries + var nKeyCode = v.keyCode; + if(oSelf._isIgnoreKey(nKeyCode)) { + return; + } + + // Clear previous timeout + /*if(oSelf._nTypeAheadDelayID != -1) { + clearTimeout(oSelf._nTypeAheadDelayID); + }*/ + if(oSelf._nDelayID != -1) { + clearTimeout(oSelf._nDelayID); + } + + // Set new timeout + oSelf._nDelayID = setTimeout(function(){ + oSelf._sendQuery(sText); + },(oSelf.queryDelay * 1000)); + + //= nDelayID; + //else { + // No delay so send request immediately + //oSelf._sendQuery(sText); + //} +}; + +/** + * Handles text input box receiving focus. + * + * @method _onTextboxFocus + * @param v {HTMLEvent} The focus event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onTextboxFocus = function (v,oSelf) { + // Start of a new interaction + if(!oSelf._bFocused) { + oSelf._elTextbox.setAttribute("autocomplete","off"); + oSelf._bFocused = true; + oSelf._sInitInputValue = oSelf._elTextbox.value; + oSelf.textboxFocusEvent.fire(oSelf); + } +}; + +/** + * Handles text input box losing focus. + * + * @method _onTextboxBlur + * @param v {HTMLEvent} The focus event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onTextboxBlur = function (v,oSelf) { + // Is a true blur + if(!oSelf._bOverContainer || (oSelf._nKeyCode == 9)) { + // Current query needs to be validated as a selection + if(!oSelf._bItemSelected) { + var elMatchListItem = oSelf._textMatchesOption(); + // Container is closed or current query doesn't match any result + if(!oSelf._bContainerOpen || (oSelf._bContainerOpen && (elMatchListItem === null))) { + // Force selection is enabled so clear the current query + if(oSelf.forceSelection) { + oSelf._clearSelection(); + } + // Treat current query as a valid selection + else { + oSelf.unmatchedItemSelectEvent.fire(oSelf, oSelf._sCurQuery); + } + } + // Container is open and current query matches a result + else { + // Force a selection when textbox is blurred with a match + if(oSelf.forceSelection) { + oSelf._selectItem(elMatchListItem); + } + } + } + + oSelf._clearInterval(); + oSelf._bFocused = false; + if(oSelf._sInitInputValue !== oSelf._elTextbox.value) { + oSelf.textboxChangeEvent.fire(oSelf); + } + oSelf.textboxBlurEvent.fire(oSelf); + + oSelf._toggleContainer(false); + } + // Not a true blur if it was a selection via mouse click + else { + oSelf._focus(); + } +}; + +/** + * Handles window unload event. + * + * @method _onWindowUnload + * @param v {HTMLEvent} The unload event. + * @param oSelf {YAHOO.widget.AutoComplete} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onWindowUnload = function(v,oSelf) { + if(oSelf && oSelf._elTextbox && oSelf.allowBrowserAutocomplete) { + oSelf._elTextbox.setAttribute("autocomplete","on"); + } +}; + +///////////////////////////////////////////////////////////////////////////// +// +// Deprecated for Backwards Compatibility +// +///////////////////////////////////////////////////////////////////////////// +/** + * @method doBeforeSendQuery + * @deprecated Use generateRequest. + */ +YAHOO.widget.AutoComplete.prototype.doBeforeSendQuery = function(sQuery) { + return this.generateRequest(sQuery); +}; + +/** + * @method getListItems + * @deprecated Use getListEl().childNodes. + */ +YAHOO.widget.AutoComplete.prototype.getListItems = function() { + var allListItemEls = [], + els = this._elList.childNodes; + for(var i=els.length-1; i>=0; i--) { + allListItemEls[i] = els[i]; + } + return allListItemEls; +}; + +///////////////////////////////////////////////////////////////////////// +// +// Private static methods +// +///////////////////////////////////////////////////////////////////////// + +/** + * Clones object literal or array of object literals. + * + * @method AutoComplete._cloneObject + * @param o {Object} Object. + * @private + * @static + */ +YAHOO.widget.AutoComplete._cloneObject = function(o) { + if(!YAHOO.lang.isValue(o)) { + return o; + } + + var copy = {}; + + if(YAHOO.lang.isFunction(o)) { + copy = o; + } + else if(YAHOO.lang.isArray(o)) { + var array = []; + for(var i=0,len=o.length;iC#5QQ<|d}62BjvZR2H60wE-$(3-AeXt*@{D|Np;u@pDC#5QQ<|d}62BjvZR2H60wE-$(3-AeX1=9cj|6h7@{#_u8sU*lR z_&>wb?FL>zp1h}vV@SoVq=W_rH;IGN~-|K;%i-0c73 z@c-iO|KRQa-|hd~QeFE1003M`L_t(|+U&?l5`sVg1i`WZK}Epr|6dhmytLs92=mel z9uoULP6;mwyM%qhIpHzkHQ|(SNO(*5TD8?y@wq9xG<+26t_AN^`$=39HtEMPCOjwP e%l`;(0R{kdKn;SADLBOd00006$Gh9E#3p9{H-P6S}q~camLV^=3&tj%#_Xa_x2_Xl57U&w-9pX85Q9;Im dv4Me^VIeE)+1pK9I)PdkJYD@<);T3K0RYcxInw|D literal 0 HcmV?d00001 diff --git a/public/css/yui/build/button/assets/skins/sam/split-button-arrow-focus.png b/public/css/yui/build/button/assets/skins/sam/split-button-arrow-focus.png new file mode 100644 index 0000000000000000000000000000000000000000..167d71eb721ba9b85c6601f9077d5c39faa4ebd2 GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^0zhoU!3-pmJXhxdDVB6cUq=RpYd5a=M;HP5k|nMY zCBgY=CFO}lsSJ)O`AMk?p1FzXsX?iUDV2pMQ*D5XI0Jk_Tx)0S05bpo|DSu#^)isf zToU9L{Qp10^;5h+0~ypkT^vIyZY3ooII;39W@>hC5M-JVa^Poyu7TYlo?{mkWE>b9 b7?>Frva+7N-L$0>sD;7P)z4*}Q$iB}D9ShR literal 0 HcmV?d00001 diff --git a/public/css/yui/build/button/assets/skins/sam/split-button-arrow-hover.png b/public/css/yui/build/button/assets/skins/sam/split-button-arrow-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..167d71eb721ba9b85c6601f9077d5c39faa4ebd2 GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^0zhoU!3-pmJXhxdDVB6cUq=RpYd5a=M;HP5k|nMY zCBgY=CFO}lsSJ)O`AMk?p1FzXsX?iUDV2pMQ*D5XI0Jk_Tx)0S05bpo|DSu#^)isf zToU9L{Qp10^;5h+0~ypkT^vIyZY3ooII;39W@>hC5M-JVa^Poyu7TYlo?{mkWE>b9 b7?>Frva+7N-L$0>sD;7P)z4*}Q$iB}D9ShR literal 0 HcmV?d00001 diff --git a/public/css/yui/build/button/assets/skins/sam/split-button-arrow.png b/public/css/yui/build/button/assets/skins/sam/split-button-arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..b33a93ff2dc2039bd24e4ea3b75ecf4bb3295f84 GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^0zhoU!3-pmJXhxdDVB6cUq=RpYd5a=M;HP5k|nMY zCBgY=CFO}lsSJ)O`AMk?p1FzXsX?iUDV2pMQ*D5XI0Jk_TpJo1fXx5@|JyBHuocK+ zE(!7r{{Nrh`YB$Zfeh-NE{-7;w~`VPoLG4lGc~(62r^9wIqgTe~DWM4f1sXSq literal 0 HcmV?d00001 diff --git a/public/css/yui/build/button/button-debug.js b/public/css/yui/build/button/button-debug.js new file mode 100644 index 000000000..59e7ad536 --- /dev/null +++ b/public/css/yui/build/button/button-debug.js @@ -0,0 +1,4810 @@ +/* +Copyright (c) 2009, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.7.0 +*/ +/** +* @module button +* @description

    The Button Control enables the creation of rich, graphical +* buttons that function like traditional HTML form buttons. Unlike +* traditional HTML form buttons, buttons created with the Button Control can have +* a label that is different from its value. With the inclusion of the optional +* Menu Control, the Button Control can also be +* used to create menu buttons and split buttons, controls that are not +* available natively in HTML. The Button Control can also be thought of as a +* way to create more visually engaging implementations of the browser's +* default radio-button and check-box controls.

    +*

    The Button Control supports the following types:

    +*
    +*
    push
    +*
    Basic push button that can execute a user-specified command when +* pressed.
    +*
    link
    +*
    Navigates to a specified url when pressed.
    +*
    submit
    +*
    Submits the parent form when pressed.
    +*
    reset
    +*
    Resets the parent form when pressed.
    +*
    checkbox
    +*
    Maintains a "checked" state that can be toggled on and off.
    +*
    radio
    +*
    Maintains a "checked" state that can be toggled on and off. Use with +* the ButtonGroup class to create a set of controls that are mutually +* exclusive; checking one button in the set will uncheck all others in +* the group.
    +*
    menu
    +*
    When pressed will show/hide a menu.
    +*
    split
    +*
    Can execute a user-specified command or display a menu when pressed.
    +*
    +* @title Button +* @namespace YAHOO.widget +* @requires yahoo, dom, element, event +* @optional container, menu +*/ + + +(function () { + + + /** + * The Button class creates a rich, graphical button. + * @param {String} p_oElement String specifying the id attribute of the + * <input>, <button>, + * <a>, or <span> element to + * be used to create the button. + * @param {HTMLInputElement| + * HTMLButtonElement|HTMLElement} p_oElement Object reference for the + * <input>, <button>, + * <a>, or <span> element to be + * used to create the button. + * @param {Object} p_oElement Object literal specifying a set of + * configuration attributes used to create the button. + * @param {Object} p_oAttributes Optional. Object literal specifying a set + * of configuration attributes used to create the button. + * @namespace YAHOO.widget + * @class Button + * @constructor + * @extends YAHOO.util.Element + */ + + + + // Shorthard for utilities + + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event, + Lang = YAHOO.lang, + UA = YAHOO.env.ua, + Overlay = YAHOO.widget.Overlay, + Menu = YAHOO.widget.Menu, + + + // Private member variables + + m_oButtons = {}, // Collection of all Button instances + m_oOverlayManager = null, // YAHOO.widget.OverlayManager instance + m_oSubmitTrigger = null, // The button that submitted the form + m_oFocusedButton = null; // The button that has focus + + + + // Private methods + + + + /** + * @method createInputElement + * @description Creates an <input> element of the + * specified type. + * @private + * @param {String} p_sType String specifying the type of + * <input> element to create. + * @param {String} p_sName String specifying the name of + * <input> element to create. + * @param {String} p_sValue String specifying the value of + * <input> element to create. + * @param {String} p_bChecked Boolean specifying if the + * <input> element is to be checked. + * @return {HTMLInputElement} + */ + function createInputElement(p_sType, p_sName, p_sValue, p_bChecked) { + + var oInput, + sInput; + + if (Lang.isString(p_sType) && Lang.isString(p_sName)) { + + if (UA.ie) { + + /* + For IE it is necessary to create the element with the + "type," "name," "value," and "checked" properties set all + at once. + */ + + sInput = "<input> or <a>) that + * map to Button configuration attributes and sets them into a collection + * that is passed to the Button constructor. + * @private + * @param {HTMLInputElement|HTMLAnchorElement} p_oElement Object reference to the HTML + * element (either <input> or <span> + * ) used to create the button. + * @param {Object} p_oAttributes Object reference for the collection of + * configuration attributes used to create the button. + */ + function setAttributesFromSrcElement(p_oElement, p_oAttributes) { + + var sSrcElementNodeName = p_oElement.nodeName.toUpperCase(), + me = this, + oAttribute, + oRootNode, + sText; + + + /** + * @method setAttributeFromDOMAttribute + * @description Gets the value of the specified DOM attribute and sets it + * into the collection of configuration attributes used to configure + * the button. + * @private + * @param {String} p_sAttribute String representing the name of the + * attribute to retrieve from the DOM element. + */ + function setAttributeFromDOMAttribute(p_sAttribute) { + + if (!(p_sAttribute in p_oAttributes)) { + + /* + Need to use "getAttributeNode" instead of "getAttribute" + because using "getAttribute," IE will return the innerText + of a <button> for the value attribute + rather than the value of the "value" attribute. + */ + + oAttribute = p_oElement.getAttributeNode(p_sAttribute); + + + if (oAttribute && ("value" in oAttribute)) { + + YAHOO.log("Setting attribute \"" + p_sAttribute + + "\" using source element's attribute value of \"" + + oAttribute.value + "\"", "info", me.toString()); + + p_oAttributes[p_sAttribute] = oAttribute.value; + + } + + } + + } + + + /** + * @method setFormElementProperties + * @description Gets the value of the attributes from the form element + * and sets them into the collection of configuration attributes used to + * configure the button. + * @private + */ + function setFormElementProperties() { + + setAttributeFromDOMAttribute("type"); + + if (p_oAttributes.type == "button") { + + p_oAttributes.type = "push"; + + } + + if (!("disabled" in p_oAttributes)) { + + p_oAttributes.disabled = p_oElement.disabled; + + } + + setAttributeFromDOMAttribute("name"); + setAttributeFromDOMAttribute("value"); + setAttributeFromDOMAttribute("title"); + + } + + + switch (sSrcElementNodeName) { + + case "A": + + p_oAttributes.type = "link"; + + setAttributeFromDOMAttribute("href"); + setAttributeFromDOMAttribute("target"); + + break; + + case "INPUT": + + setFormElementProperties(); + + if (!("checked" in p_oAttributes)) { + + p_oAttributes.checked = p_oElement.checked; + + } + + break; + + case "BUTTON": + + setFormElementProperties(); + + oRootNode = p_oElement.parentNode.parentNode; + + if (Dom.hasClass(oRootNode, this.CSS_CLASS_NAME + "-checked")) { + + p_oAttributes.checked = true; + + } + + if (Dom.hasClass(oRootNode, this.CSS_CLASS_NAME + "-disabled")) { + + p_oAttributes.disabled = true; + + } + + p_oElement.removeAttribute("value"); + + p_oElement.setAttribute("type", "button"); + + break; + + } + + p_oElement.removeAttribute("id"); + p_oElement.removeAttribute("name"); + + if (!("tabindex" in p_oAttributes)) { + + p_oAttributes.tabindex = p_oElement.tabIndex; + + } + + if (!("label" in p_oAttributes)) { + + // Set the "label" property + + sText = sSrcElementNodeName == "INPUT" ? + p_oElement.value : p_oElement.innerHTML; + + + if (sText && sText.length > 0) { + + p_oAttributes.label = sText; + + } + + } + + } + + + /** + * @method initConfig + * @description Initializes the set of configuration attributes that are + * used to instantiate the button. + * @private + * @param {Object} Object representing the button's set of + * configuration attributes. + */ + function initConfig(p_oConfig) { + + var oAttributes = p_oConfig.attributes, + oSrcElement = oAttributes.srcelement, + sSrcElementNodeName = oSrcElement.nodeName.toUpperCase(), + me = this; + + + if (sSrcElementNodeName == this.NODE_NAME) { + + p_oConfig.element = oSrcElement; + p_oConfig.id = oSrcElement.id; + + Dom.getElementsBy(function (p_oElement) { + + switch (p_oElement.nodeName.toUpperCase()) { + + case "BUTTON": + case "A": + case "INPUT": + + setAttributesFromSrcElement.call(me, p_oElement, + oAttributes); + + break; + + } + + }, "*", oSrcElement); + + } + else { + + switch (sSrcElementNodeName) { + + case "BUTTON": + case "A": + case "INPUT": + + setAttributesFromSrcElement.call(this, oSrcElement, + oAttributes); + + break; + + } + + } + + } + + + + // Constructor + + YAHOO.widget.Button = function (p_oElement, p_oAttributes) { + + if (!Overlay && YAHOO.widget.Overlay) { + + Overlay = YAHOO.widget.Overlay; + + } + + + if (!Menu && YAHOO.widget.Menu) { + + Menu = YAHOO.widget.Menu; + + } + + + var fnSuperClass = YAHOO.widget.Button.superclass.constructor, + oConfig, + oElement; + + + if (arguments.length == 1 && !Lang.isString(p_oElement) && !p_oElement.nodeName) { + + if (!p_oElement.id) { + + p_oElement.id = Dom.generateId(); + + YAHOO.log("No value specified for the button's \"id\" " + + "attribute. Setting button id to \"" + p_oElement.id + + "\".", "info", this.toString()); + + } + + YAHOO.log("No source HTML element. Building the button " + + "using the set of configuration attributes.", "info", this.toString()); + + fnSuperClass.call(this, (this.createButtonElement(p_oElement.type)), p_oElement); + + } + else { + + oConfig = { element: null, attributes: (p_oAttributes || {}) }; + + + if (Lang.isString(p_oElement)) { + + oElement = Dom.get(p_oElement); + + if (oElement) { + + if (!oConfig.attributes.id) { + + oConfig.attributes.id = p_oElement; + + } + + YAHOO.log("Building the button using an existing " + + "HTML element as a source element.", "info", this.toString()); + + + oConfig.attributes.srcelement = oElement; + + initConfig.call(this, oConfig); + + + if (!oConfig.element) { + + YAHOO.log("Source element could not be used " + + "as is. Creating a new HTML element for " + + "the button.", "info", this.toString()); + + oConfig.element = this.createButtonElement(oConfig.attributes.type); + + } + + fnSuperClass.call(this, oConfig.element, oConfig.attributes); + + } + + } + else if (p_oElement.nodeName) { + + if (!oConfig.attributes.id) { + + if (p_oElement.id) { + + oConfig.attributes.id = p_oElement.id; + + } + else { + + oConfig.attributes.id = Dom.generateId(); + + YAHOO.log("No value specified for the button's " + + "\"id\" attribute. Setting button id to \"" + + oConfig.attributes.id + "\".", "info", this.toString()); + + } + + } + + YAHOO.log("Building the button using an existing HTML " + + "element as a source element.", "info", this.toString()); + + + oConfig.attributes.srcelement = p_oElement; + + initConfig.call(this, oConfig); + + + if (!oConfig.element) { + + YAHOO.log("Source element could not be used as is." + + " Creating a new HTML element for the button.", + "info", this.toString()); + + oConfig.element = this.createButtonElement(oConfig.attributes.type); + + } + + fnSuperClass.call(this, oConfig.element, oConfig.attributes); + + } + + } + + }; + + + + YAHOO.extend(YAHOO.widget.Button, YAHOO.util.Element, { + + + // Protected properties + + + /** + * @property _button + * @description Object reference to the button's internal + * <a> or <button> element. + * @default null + * @protected + * @type HTMLAnchorElement|HTMLButtonElement + */ + _button: null, + + + /** + * @property _menu + * @description Object reference to the button's menu. + * @default null + * @protected + * @type {YAHOO.widget.Overlay| + * YAHOO.widget.Menu} + */ + _menu: null, + + + /** + * @property _hiddenFields + * @description Object reference to the <input> + * element, or array of HTML form elements used to represent the button + * when its parent form is submitted. + * @default null + * @protected + * @type HTMLInputElement|Array + */ + _hiddenFields: null, + + + /** + * @property _onclickAttributeValue + * @description Object reference to the button's current value for the + * "onclick" configuration attribute. + * @default null + * @protected + * @type Object + */ + _onclickAttributeValue: null, + + + /** + * @property _activationKeyPressed + * @description Boolean indicating if the key(s) that toggle the button's + * "active" state have been pressed. + * @default false + * @protected + * @type Boolean + */ + _activationKeyPressed: false, + + + /** + * @property _activationButtonPressed + * @description Boolean indicating if the mouse button that toggles + * the button's "active" state has been pressed. + * @default false + * @protected + * @type Boolean + */ + _activationButtonPressed: false, + + + /** + * @property _hasKeyEventHandlers + * @description Boolean indicating if the button's "blur", "keydown" and + * "keyup" event handlers are assigned + * @default false + * @protected + * @type Boolean + */ + _hasKeyEventHandlers: false, + + + /** + * @property _hasMouseEventHandlers + * @description Boolean indicating if the button's "mouseout," + * "mousedown," and "mouseup" event handlers are assigned + * @default false + * @protected + * @type Boolean + */ + _hasMouseEventHandlers: false, + + + /** + * @property _nOptionRegionX + * @description Number representing the X coordinate of the leftmost edge of the Button's + * option region. Applies only to Buttons of type "split". + * @default 0 + * @protected + * @type Number + */ + _nOptionRegionX: 0, + + + + // Constants + + + /** + * @property NODE_NAME + * @description The name of the node to be used for the button's + * root element. + * @default "SPAN" + * @final + * @type String + */ + NODE_NAME: "SPAN", + + + /** + * @property CHECK_ACTIVATION_KEYS + * @description Array of numbers representing keys that (when pressed) + * toggle the button's "checked" attribute. + * @default [32] + * @final + * @type Array + */ + CHECK_ACTIVATION_KEYS: [32], + + + /** + * @property ACTIVATION_KEYS + * @description Array of numbers representing keys that (when presed) + * toggle the button's "active" state. + * @default [13, 32] + * @final + * @type Array + */ + ACTIVATION_KEYS: [13, 32], + + + /** + * @property OPTION_AREA_WIDTH + * @description Width (in pixels) of the area of a split button that + * when pressed will display a menu. + * @default 20 + * @final + * @type Number + */ + OPTION_AREA_WIDTH: 20, + + + /** + * @property CSS_CLASS_NAME + * @description String representing the CSS class(es) to be applied to + * the button's root element. + * @default "yui-button" + * @final + * @type String + */ + CSS_CLASS_NAME: "yui-button", + + + /** + * @property RADIO_DEFAULT_TITLE + * @description String representing the default title applied to buttons + * of type "radio." + * @default "Unchecked. Click to check." + * @final + * @type String + */ + RADIO_DEFAULT_TITLE: "Unchecked. Click to check.", + + + /** + * @property RADIO_CHECKED_TITLE + * @description String representing the title applied to buttons of + * type "radio" when checked. + * @default "Checked. Click another button to uncheck" + * @final + * @type String + */ + RADIO_CHECKED_TITLE: "Checked. Click another button to uncheck", + + + /** + * @property CHECKBOX_DEFAULT_TITLE + * @description String representing the default title applied to + * buttons of type "checkbox." + * @default "Unchecked. Click to check." + * @final + * @type String + */ + CHECKBOX_DEFAULT_TITLE: "Unchecked. Click to check.", + + + /** + * @property CHECKBOX_CHECKED_TITLE + * @description String representing the title applied to buttons of type + * "checkbox" when checked. + * @default "Checked. Click to uncheck." + * @final + * @type String + */ + CHECKBOX_CHECKED_TITLE: "Checked. Click to uncheck.", + + + /** + * @property MENUBUTTON_DEFAULT_TITLE + * @description String representing the default title applied to + * buttons of type "menu." + * @default "Menu collapsed. Click to expand." + * @final + * @type String + */ + MENUBUTTON_DEFAULT_TITLE: "Menu collapsed. Click to expand.", + + + /** + * @property MENUBUTTON_MENU_VISIBLE_TITLE + * @description String representing the title applied to buttons of type + * "menu" when the button's menu is visible. + * @default "Menu expanded. Click or press Esc to collapse." + * @final + * @type String + */ + MENUBUTTON_MENU_VISIBLE_TITLE: + "Menu expanded. Click or press Esc to collapse.", + + + /** + * @property SPLITBUTTON_DEFAULT_TITLE + * @description String representing the default title applied to + * buttons of type "split." + * @default "Menu collapsed. Click inside option region or press + * Ctrl + Shift + M to show the menu." + * @final + * @type String + */ + SPLITBUTTON_DEFAULT_TITLE: ("Menu collapsed. Click inside option " + + "region or press down arrow key to show the menu."), + + + /** + * @property SPLITBUTTON_OPTION_VISIBLE_TITLE + * @description String representing the title applied to buttons of type + * "split" when the button's menu is visible. + * @default "Menu expanded. Press Esc or Ctrl + Shift + M to hide + * the menu." + * @final + * @type String + */ + SPLITBUTTON_OPTION_VISIBLE_TITLE: + "Menu expanded. Press Esc to hide the menu.", + + + /** + * @property SUBMIT_TITLE + * @description String representing the title applied to buttons of + * type "submit." + * @default "Click to submit form." + * @final + * @type String + */ + SUBMIT_TITLE: "Click to submit form.", + + + + // Protected attribute setter methods + + + /** + * @method _setType + * @description Sets the value of the button's "type" attribute. + * @protected + * @param {String} p_sType String indicating the value for the button's + * "type" attribute. + */ + _setType: function (p_sType) { + + if (p_sType == "split") { + + this.on("option", this._onOption); + + } + + }, + + + /** + * @method _setLabel + * @description Sets the value of the button's "label" attribute. + * @protected + * @param {String} p_sLabel String indicating the value for the button's + * "label" attribute. + */ + _setLabel: function (p_sLabel) { + + this._button.innerHTML = p_sLabel; + + + /* + Remove and add the default class name from the root element + for Gecko to ensure that the button shrinkwraps to the label. + Without this the button will not be rendered at the correct + width when the label changes. The most likely cause for this + bug is button's use of the Gecko-specific CSS display type of + "-moz-inline-box" to simulate "inline-block" supported by IE, + Safari and Opera. + */ + + var sClass, + nGeckoVersion = UA.gecko; + + + if (nGeckoVersion && nGeckoVersion < 1.9 && Dom.inDocument(this.get("element"))) { + + sClass = this.CSS_CLASS_NAME; + + this.removeClass(sClass); + + Lang.later(0, this, this.addClass, sClass); + + } + + }, + + + /** + * @method _setTabIndex + * @description Sets the value of the button's "tabindex" attribute. + * @protected + * @param {Number} p_nTabIndex Number indicating the value for the + * button's "tabindex" attribute. + */ + _setTabIndex: function (p_nTabIndex) { + + this._button.tabIndex = p_nTabIndex; + + }, + + + /** + * @method _setTitle + * @description Sets the value of the button's "title" attribute. + * @protected + * @param {String} p_nTabIndex Number indicating the value for + * the button's "title" attribute. + */ + _setTitle: function (p_sTitle) { + + var sTitle = p_sTitle; + + if (this.get("type") != "link") { + + if (!sTitle) { + + switch (this.get("type")) { + + case "radio": + + sTitle = this.RADIO_DEFAULT_TITLE; + + break; + + case "checkbox": + + sTitle = this.CHECKBOX_DEFAULT_TITLE; + + break; + + case "menu": + + sTitle = this.MENUBUTTON_DEFAULT_TITLE; + + break; + + case "split": + + sTitle = this.SPLITBUTTON_DEFAULT_TITLE; + + break; + + case "submit": + + sTitle = this.SUBMIT_TITLE; + + break; + + } + + } + + this._button.title = sTitle; + + } + + }, + + + /** + * @method _setDisabled + * @description Sets the value of the button's "disabled" attribute. + * @protected + * @param {Boolean} p_bDisabled Boolean indicating the value for + * the button's "disabled" attribute. + */ + _setDisabled: function (p_bDisabled) { + + if (this.get("type") != "link") { + + if (p_bDisabled) { + + if (this._menu) { + + this._menu.hide(); + + } + + if (this.hasFocus()) { + + this.blur(); + + } + + this._button.setAttribute("disabled", "disabled"); + + this.addStateCSSClasses("disabled"); + + this.removeStateCSSClasses("hover"); + this.removeStateCSSClasses("active"); + this.removeStateCSSClasses("focus"); + + } + else { + + this._button.removeAttribute("disabled"); + + this.removeStateCSSClasses("disabled"); + + } + + } + + }, + + + /** + * @method _setHref + * @description Sets the value of the button's "href" attribute. + * @protected + * @param {String} p_sHref String indicating the value for the button's + * "href" attribute. + */ + _setHref: function (p_sHref) { + + if (this.get("type") == "link") { + + this._button.href = p_sHref; + + } + + }, + + + /** + * @method _setTarget + * @description Sets the value of the button's "target" attribute. + * @protected + * @param {String} p_sTarget String indicating the value for the button's + * "target" attribute. + */ + _setTarget: function (p_sTarget) { + + if (this.get("type") == "link") { + + this._button.setAttribute("target", p_sTarget); + + } + + }, + + + /** + * @method _setChecked + * @description Sets the value of the button's "target" attribute. + * @protected + * @param {Boolean} p_bChecked Boolean indicating the value for + * the button's "checked" attribute. + */ + _setChecked: function (p_bChecked) { + + var sType = this.get("type"), + sTitle; + + if (sType == "checkbox" || sType == "radio") { + + if (p_bChecked) { + + this.addStateCSSClasses("checked"); + + sTitle = (sType == "radio") ? + this.RADIO_CHECKED_TITLE : + this.CHECKBOX_CHECKED_TITLE; + + } + else { + + this.removeStateCSSClasses("checked"); + + sTitle = (sType == "radio") ? + this.RADIO_DEFAULT_TITLE : + this.CHECKBOX_DEFAULT_TITLE; + + } + + + if (!this._hasDefaultTitle) { + + this.set("title", sTitle); + + } + + } + + }, + + + /** + * @method _setMenu + * @description Sets the value of the button's "menu" attribute. + * @protected + * @param {Object} p_oMenu Object indicating the value for the button's + * "menu" attribute. + */ + _setMenu: function (p_oMenu) { + + var bLazyLoad = this.get("lazyloadmenu"), + oButtonElement = this.get("element"), + sMenuCSSClassName, + + /* + Boolean indicating if the value of p_oMenu is an instance + of YAHOO.widget.Menu or YAHOO.widget.Overlay. + */ + + bInstance = false, + oMenu, + oMenuElement, + oSrcElement; + + + function onAppendTo() { + + oMenu.render(oButtonElement.parentNode); + + this.removeListener("appendTo", onAppendTo); + + } + + + function setMenuContainer() { + + oMenu.cfg.queueProperty("container", oButtonElement.parentNode); + + this.removeListener("appendTo", setMenuContainer); + + } + + + function initMenu() { + + var oContainer; + + if (oMenu) { + + Dom.addClass(oMenu.element, this.get("menuclassname")); + Dom.addClass(oMenu.element, "yui-" + this.get("type") + "-button-menu"); + + oMenu.showEvent.subscribe(this._onMenuShow, null, this); + oMenu.hideEvent.subscribe(this._onMenuHide, null, this); + oMenu.renderEvent.subscribe(this._onMenuRender, null, this); + + + if (Menu && oMenu instanceof Menu) { + + if (bLazyLoad) { + + oContainer = this.get("container"); + + if (oContainer) { + + oMenu.cfg.queueProperty("container", oContainer); + + } + else { + + this.on("appendTo", setMenuContainer); + + } + + } + + oMenu.cfg.queueProperty("clicktohide", false); + + oMenu.keyDownEvent.subscribe(this._onMenuKeyDown, this, true); + oMenu.subscribe("click", this._onMenuClick, this, true); + + this.on("selectedMenuItemChange", this._onSelectedMenuItemChange); + + oSrcElement = oMenu.srcElement; + + if (oSrcElement && oSrcElement.nodeName.toUpperCase() == "SELECT") { + + oSrcElement.style.display = "none"; + oSrcElement.parentNode.removeChild(oSrcElement); + + } + + } + else if (Overlay && oMenu instanceof Overlay) { + + if (!m_oOverlayManager) { + + m_oOverlayManager = new YAHOO.widget.OverlayManager(); + + } + + m_oOverlayManager.register(oMenu); + + } + + + this._menu = oMenu; + + + if (!bInstance && !bLazyLoad) { + + if (Dom.inDocument(oButtonElement)) { + + oMenu.render(oButtonElement.parentNode); + + } + else { + + this.on("appendTo", onAppendTo); + + } + + } + + } + + } + + + if (Overlay) { + + if (Menu) { + + sMenuCSSClassName = Menu.prototype.CSS_CLASS_NAME; + + } + + if (p_oMenu && Menu && (p_oMenu instanceof Menu)) { + + oMenu = p_oMenu; + bInstance = true; + + initMenu.call(this); + + } + else if (Overlay && p_oMenu && (p_oMenu instanceof Overlay)) { + + oMenu = p_oMenu; + bInstance = true; + + oMenu.cfg.queueProperty("visible", false); + + initMenu.call(this); + + } + else if (Menu && Lang.isArray(p_oMenu)) { + + oMenu = new Menu(Dom.generateId(), { lazyload: bLazyLoad, itemdata: p_oMenu }); + + this._menu = oMenu; + + this.on("appendTo", initMenu); + + } + else if (Lang.isString(p_oMenu)) { + + oMenuElement = Dom.get(p_oMenu); + + if (oMenuElement) { + + if (Menu && Dom.hasClass(oMenuElement, sMenuCSSClassName) || + oMenuElement.nodeName.toUpperCase() == "SELECT") { + + oMenu = new Menu(p_oMenu, { lazyload: bLazyLoad }); + + initMenu.call(this); + + } + else if (Overlay) { + + oMenu = new Overlay(p_oMenu, { visible: false }); + + initMenu.call(this); + + } + + } + + } + else if (p_oMenu && p_oMenu.nodeName) { + + if (Menu && Dom.hasClass(p_oMenu, sMenuCSSClassName) || + p_oMenu.nodeName.toUpperCase() == "SELECT") { + + oMenu = new Menu(p_oMenu, { lazyload: bLazyLoad }); + + initMenu.call(this); + + } + else if (Overlay) { + + if (!p_oMenu.id) { + + Dom.generateId(p_oMenu); + + } + + oMenu = new Overlay(p_oMenu, { visible: false }); + + initMenu.call(this); + + } + + } + + } + + }, + + + /** + * @method _setOnClick + * @description Sets the value of the button's "onclick" attribute. + * @protected + * @param {Object} p_oObject Object indicating the value for the button's + * "onclick" attribute. + */ + _setOnClick: function (p_oObject) { + + /* + Remove any existing listeners if a "click" event handler + has already been specified. + */ + + if (this._onclickAttributeValue && + (this._onclickAttributeValue != p_oObject)) { + + this.removeListener("click", this._onclickAttributeValue.fn); + + this._onclickAttributeValue = null; + + } + + + if (!this._onclickAttributeValue && + Lang.isObject(p_oObject) && + Lang.isFunction(p_oObject.fn)) { + + this.on("click", p_oObject.fn, p_oObject.obj, p_oObject.scope); + + this._onclickAttributeValue = p_oObject; + + } + + }, + + + + // Protected methods + + + + /** + * @method _isActivationKey + * @description Determines if the specified keycode is one that toggles + * the button's "active" state. + * @protected + * @param {Number} p_nKeyCode Number representing the keycode to + * be evaluated. + * @return {Boolean} + */ + _isActivationKey: function (p_nKeyCode) { + + var sType = this.get("type"), + aKeyCodes = (sType == "checkbox" || sType == "radio") ? + this.CHECK_ACTIVATION_KEYS : this.ACTIVATION_KEYS, + + nKeyCodes = aKeyCodes.length, + bReturnVal = false, + i; + + + if (nKeyCodes > 0) { + + i = nKeyCodes - 1; + + do { + + if (p_nKeyCode == aKeyCodes[i]) { + + bReturnVal = true; + break; + + } + + } + while (i--); + + } + + return bReturnVal; + + }, + + + /** + * @method _isSplitButtonOptionKey + * @description Determines if the specified keycode is one that toggles + * the display of the split button's menu. + * @protected + * @param {Event} p_oEvent Object representing the DOM event object + * passed back by the event utility (YAHOO.util.Event). + * @return {Boolean} + */ + _isSplitButtonOptionKey: function (p_oEvent) { + + var bShowMenu = (Event.getCharCode(p_oEvent) == 40); + + + var onKeyPress = function (p_oEvent) { + + Event.preventDefault(p_oEvent); + + this.removeListener("keypress", onKeyPress); + + }; + + + // Prevent the browser from scrolling the window + if (bShowMenu) { + + if (UA.opera) { + + this.on("keypress", onKeyPress); + + } + + Event.preventDefault(p_oEvent); + } + + return bShowMenu; + + }, + + + /** + * @method _addListenersToForm + * @description Adds event handlers to the button's form. + * @protected + */ + _addListenersToForm: function () { + + var oForm = this.getForm(), + onFormKeyPress = YAHOO.widget.Button.onFormKeyPress, + bHasKeyPressListener, + oSrcElement, + aListeners, + nListeners, + i; + + + if (oForm) { + + Event.on(oForm, "reset", this._onFormReset, null, this); + Event.on(oForm, "submit", this._onFormSubmit, null, this); + + oSrcElement = this.get("srcelement"); + + + if (this.get("type") == "submit" || + (oSrcElement && oSrcElement.type == "submit")) + { + + aListeners = Event.getListeners(oForm, "keypress"); + bHasKeyPressListener = false; + + if (aListeners) { + + nListeners = aListeners.length; + + if (nListeners > 0) { + + i = nListeners - 1; + + do { + + if (aListeners[i].fn == onFormKeyPress) { + + bHasKeyPressListener = true; + break; + + } + + } + while (i--); + + } + + } + + + if (!bHasKeyPressListener) { + + Event.on(oForm, "keypress", onFormKeyPress); + + } + + } + + } + + }, + + + + /** + * @method _showMenu + * @description Shows the button's menu. + * @protected + * @param {Event} p_oEvent Object representing the DOM event object + * passed back by the event utility (YAHOO.util.Event) that triggered + * the display of the menu. + */ + _showMenu: function (p_oEvent) { + + if (YAHOO.widget.MenuManager) { + YAHOO.widget.MenuManager.hideVisible(); + } + + + if (m_oOverlayManager) { + m_oOverlayManager.hideAll(); + } + + + var oMenu = this._menu, + aMenuAlignment = this.get("menualignment"), + bFocusMenu = this.get("focusmenu"), + fnFocusMethod; + + + if (this._renderedMenu) { + + oMenu.cfg.setProperty("context", + [this.get("element"), aMenuAlignment[0], aMenuAlignment[1]]); + + oMenu.cfg.setProperty("preventcontextoverlap", true); + oMenu.cfg.setProperty("constraintoviewport", true); + + } + else { + + oMenu.cfg.queueProperty("context", + [this.get("element"), aMenuAlignment[0], aMenuAlignment[1]]); + + oMenu.cfg.queueProperty("preventcontextoverlap", true); + oMenu.cfg.queueProperty("constraintoviewport", true); + + } + + + /* + Refocus the Button before showing its Menu in case the call to + YAHOO.widget.MenuManager.hideVisible() resulted in another element in the + DOM being focused after another Menu was hidden. + */ + + this.focus(); + + + if (Menu && oMenu && (oMenu instanceof Menu)) { + + // Since Menus automatically focus themselves when made visible, temporarily + // replace the Menu focus method so that the value of the Button's "focusmenu" + // attribute determines if the Menu should be focus when made visible. + + fnFocusMethod = oMenu.focus; + + oMenu.focus = function () {}; + + if (this._renderedMenu) { + + oMenu.cfg.setProperty("minscrollheight", this.get("menuminscrollheight")); + oMenu.cfg.setProperty("maxheight", this.get("menumaxheight")); + + } + else { + + oMenu.cfg.queueProperty("minscrollheight", this.get("menuminscrollheight")); + oMenu.cfg.queueProperty("maxheight", this.get("menumaxheight")); + + } + + + oMenu.show(); + + oMenu.focus = fnFocusMethod; + + oMenu.align(); + + + /* + Stop the propagation of the event so that the MenuManager + doesn't blur the menu after it gets focus. + */ + + if (p_oEvent.type == "mousedown") { + Event.stopPropagation(p_oEvent); + } + + + if (bFocusMenu) { + oMenu.focus(); + } + + } + else if (Overlay && oMenu && (oMenu instanceof Overlay)) { + + if (!this._renderedMenu) { + oMenu.render(this.get("element").parentNode); + } + + oMenu.show(); + oMenu.align(); + + } + + }, + + + /** + * @method _hideMenu + * @description Hides the button's menu. + * @protected + */ + _hideMenu: function () { + + var oMenu = this._menu; + + if (oMenu) { + + oMenu.hide(); + + } + + }, + + + + + // Protected event handlers + + + /** + * @method _onMouseOver + * @description "mouseover" event handler for the button. + * @protected + * @param {Event} p_oEvent Object representing the DOM event object + * passed back by the event utility (YAHOO.util.Event). + */ + _onMouseOver: function (p_oEvent) { + + var sType = this.get("type"), + oElement, + nOptionRegionX; + + + if (sType === "split") { + + oElement = this.get("element"); + nOptionRegionX = + (Dom.getX(oElement) + (oElement.offsetWidth - this.OPTION_AREA_WIDTH)); + + this._nOptionRegionX = nOptionRegionX; + + } + + + if (!this._hasMouseEventHandlers) { + + if (sType === "split") { + + this.on("mousemove", this._onMouseMove); + + } + + this.on("mouseout", this._onMouseOut); + + this._hasMouseEventHandlers = true; + + } + + + this.addStateCSSClasses("hover"); + + + if (sType === "split" && (Event.getPageX(p_oEvent) > nOptionRegionX)) { + + this.addStateCSSClasses("hoveroption"); + + } + + + if (this._activationButtonPressed) { + + this.addStateCSSClasses("active"); + + } + + + if (this._bOptionPressed) { + + this.addStateCSSClasses("activeoption"); + + } + + + if (this._activationButtonPressed || this._bOptionPressed) { + + Event.removeListener(document, "mouseup", this._onDocumentMouseUp); + + } + + }, + + + /** + * @method _onMouseMove + * @description "mousemove" event handler for the button. + * @protected + * @param {Event} p_oEvent Object representing the DOM event object + * passed back by the event utility (YAHOO.util.Event). + */ + _onMouseMove: function (p_oEvent) { + + var nOptionRegionX = this._nOptionRegionX; + + if (nOptionRegionX) { + + if (Event.getPageX(p_oEvent) > nOptionRegionX) { + + this.addStateCSSClasses("hoveroption"); + + } + else { + + this.removeStateCSSClasses("hoveroption"); + + } + + } + + }, + + /** + * @method _onMouseOut + * @description "mouseout" event handler for the button. + * @protected + * @param {Event} p_oEvent Object representing the DOM event object + * passed back by the event utility (YAHOO.util.Event). + */ + _onMouseOut: function (p_oEvent) { + + var sType = this.get("type"); + + this.removeStateCSSClasses("hover"); + + + if (sType != "menu") { + + this.removeStateCSSClasses("active"); + + } + + + if (this._activationButtonPressed || this._bOptionPressed) { + + Event.on(document, "mouseup", this._onDocumentMouseUp, null, this); + + } + + + if (sType === "split" && (Event.getPageX(p_oEvent) > this._nOptionRegionX)) { + + this.removeStateCSSClasses("hoveroption"); + + } + + }, + + + /** + * @method _onDocumentMouseUp + * @description "mouseup" event handler for the button. + * @protected + * @param {Event} p_oEvent Object representing the DOM event object + * passed back by the event utility (YAHOO.util.Event). + */ + _onDocumentMouseUp: function (p_oEvent) { + + this._activationButtonPressed = false; + this._bOptionPressed = false; + + var sType = this.get("type"), + oTarget, + oMenuElement; + + if (sType == "menu" || sType == "split") { + + oTarget = Event.getTarget(p_oEvent); + oMenuElement = this._menu.element; + + if (oTarget != oMenuElement && + !Dom.isAncestor(oMenuElement, oTarget)) { + + this.removeStateCSSClasses((sType == "menu" ? + "active" : "activeoption")); + + this._hideMenu(); + + } + + } + + Event.removeListener(document, "mouseup", this._onDocumentMouseUp); + + }, + + + /** + * @method _onMouseDown + * @description "mousedown" event handler for the button. + * @protected + * @param {Event} p_oEvent Object representing the DOM event object + * passed back by the event utility (YAHOO.util.Event). + */ + _onMouseDown: function (p_oEvent) { + + var sType, + bReturnVal = true; + + + function onMouseUp() { + + this._hideMenu(); + this.removeListener("mouseup", onMouseUp); + + } + + + if ((p_oEvent.which || p_oEvent.button) == 1) { + + + if (!this.hasFocus()) { + + this.focus(); + + } + + + sType = this.get("type"); + + + if (sType == "split") { + + if (Event.getPageX(p_oEvent) > this._nOptionRegionX) { + + this.fireEvent("option", p_oEvent); + bReturnVal = false; + + } + else { + + this.addStateCSSClasses("active"); + + this._activationButtonPressed = true; + + } + + } + else if (sType == "menu") { + + if (this.isActive()) { + + this._hideMenu(); + + this._activationButtonPressed = false; + + } + else { + + this._showMenu(p_oEvent); + + this._activationButtonPressed = true; + + } + + } + else { + + this.addStateCSSClasses("active"); + + this._activationButtonPressed = true; + + } + + + + if (sType == "split" || sType == "menu") { + + this._hideMenuTimer = Lang.later(250, this, this.on, ["mouseup", onMouseUp]); + + } + + } + + return bReturnVal; + + }, + + + /** + * @method _onMouseUp + * @description "mouseup" event handler for the button. + * @protected + * @param {Event} p_oEvent Object representing the DOM event object + * passed back by the event utility (YAHOO.util.Event). + */ + _onMouseUp: function (p_oEvent) { + + var sType = this.get("type"), + oHideMenuTimer = this._hideMenuTimer, + bReturnVal = true; + + + if (oHideMenuTimer) { + + oHideMenuTimer.cancel(); + + } + + + if (sType == "checkbox" || sType == "radio") { + + this.set("checked", !(this.get("checked"))); + + } + + + this._activationButtonPressed = false; + + + if (sType != "menu") { + + this.removeStateCSSClasses("active"); + + } + + + if (sType == "split" && Event.getPageX(p_oEvent) > this._nOptionRegionX) { + + bReturnVal = false; + + } + + return bReturnVal; + + }, + + + /** + * @method _onFocus + * @description "focus" event handler for the button. + * @protected + * @param {Event} p_oEvent Object representing the DOM event object + * passed back by the event utility (YAHOO.util.Event). + */ + _onFocus: function (p_oEvent) { + + var oElement; + + this.addStateCSSClasses("focus"); + + if (this._activationKeyPressed) { + + this.addStateCSSClasses("active"); + + } + + m_oFocusedButton = this; + + + if (!this._hasKeyEventHandlers) { + + oElement = this._button; + + Event.on(oElement, "blur", this._onBlur, null, this); + Event.on(oElement, "keydown", this._onKeyDown, null, this); + Event.on(oElement, "keyup", this._onKeyUp, null, this); + + this._hasKeyEventHandlers = true; + + } + + + this.fireEvent("focus", p_oEvent); + + }, + + + /** + * @method _onBlur + * @description "blur" event handler for the button. + * @protected + * @param {Event} p_oEvent Object representing the DOM event object + * passed back by the event utility (YAHOO.util.Event). + */ + _onBlur: function (p_oEvent) { + + this.removeStateCSSClasses("focus"); + + if (this.get("type") != "menu") { + + this.removeStateCSSClasses("active"); + + } + + if (this._activationKeyPressed) { + + Event.on(document, "keyup", this._onDocumentKeyUp, null, this); + + } + + + m_oFocusedButton = null; + + this.fireEvent("blur", p_oEvent); + + }, + + + /** + * @method _onDocumentKeyUp + * @description "keyup" event handler for the document. + * @protected + * @param {Event} p_oEvent Object representing the DOM event object + * passed back by the event utility (YAHOO.util.Event). + */ + _onDocumentKeyUp: function (p_oEvent) { + + if (this._isActivationKey(Event.getCharCode(p_oEvent))) { + + this._activationKeyPressed = false; + + Event.removeListener(document, "keyup", this._onDocumentKeyUp); + + } + + }, + + + /** + * @method _onKeyDown + * @description "keydown" event handler for the button. + * @protected + * @param {Event} p_oEvent Object representing the DOM event object + * passed back by the event utility (YAHOO.util.Event). + */ + _onKeyDown: function (p_oEvent) { + + var oMenu = this._menu; + + + if (this.get("type") == "split" && + this._isSplitButtonOptionKey(p_oEvent)) { + + this.fireEvent("option", p_oEvent); + + } + else if (this._isActivationKey(Event.getCharCode(p_oEvent))) { + + if (this.get("type") == "menu") { + + this._showMenu(p_oEvent); + + } + else { + + this._activationKeyPressed = true; + + this.addStateCSSClasses("active"); + + } + + } + + + if (oMenu && oMenu.cfg.getProperty("visible") && + Event.getCharCode(p_oEvent) == 27) { + + oMenu.hide(); + this.focus(); + + } + + }, + + + /** + * @method _onKeyUp + * @description "keyup" event handler for the button. + * @protected + * @param {Event} p_oEvent Object representing the DOM event object + * passed back by the event utility (YAHOO.util.Event). + */ + _onKeyUp: function (p_oEvent) { + + var sType; + + if (this._isActivationKey(Event.getCharCode(p_oEvent))) { + + sType = this.get("type"); + + if (sType == "checkbox" || sType == "radio") { + + this.set("checked", !(this.get("checked"))); + + } + + this._activationKeyPressed = false; + + if (this.get("type") != "menu") { + + this.removeStateCSSClasses("active"); + + } + + } + + }, + + + /** + * @method _onClick + * @description "click" event handler for the button. + * @protected + * @param {Event} p_oEvent Object representing the DOM event object + * passed back by the event utility (YAHOO.util.Event). + */ + _onClick: function (p_oEvent) { + + var sType = this.get("type"), + sTitle, + oForm, + oSrcElement, + bReturnVal; + + + switch (sType) { + + case "radio": + case "checkbox": + + if (!this._hasDefaultTitle) { + + if (this.get("checked")) { + + sTitle = (sType == "radio") ? + this.RADIO_CHECKED_TITLE : + this.CHECKBOX_CHECKED_TITLE; + + } + else { + + sTitle = (sType == "radio") ? + this.RADIO_DEFAULT_TITLE : + this.CHECKBOX_DEFAULT_TITLE; + + } + + this.set("title", sTitle); + + } + + break; + + case "submit": + + if (p_oEvent.returnValue !== false) { + + this.submitForm(); + + } + + break; + + case "reset": + + oForm = this.getForm(); + + if (oForm) { + + oForm.reset(); + + } + + break; + + case "menu": + + sTitle = this._menu.cfg.getProperty("visible") ? + this.MENUBUTTON_MENU_VISIBLE_TITLE : + this.MENUBUTTON_DEFAULT_TITLE; + + this.set("title", sTitle); + + break; + + case "split": + + if (this._nOptionRegionX > 0 && + (Event.getPageX(p_oEvent) > this._nOptionRegionX)) { + + bReturnVal = false; + + } + else { + + this._hideMenu(); + + oSrcElement = this.get("srcelement"); + + if (oSrcElement && oSrcElement.type == "submit" && + p_oEvent.returnValue !== false) { + + this.submitForm(); + + } + + } + + sTitle = this._menu.cfg.getProperty("visible") ? + this.SPLITBUTTON_OPTION_VISIBLE_TITLE : + this.SPLITBUTTON_DEFAULT_TITLE; + + this.set("title", sTitle); + + break; + + } + + return bReturnVal; + + }, + + + /** + * @method _onDblClick + * @description "dblclick" event handler for the button. + * @protected + * @param {Event} p_oEvent Object representing the DOM event object + * passed back by the event utility (YAHOO.util.Event). + */ + _onDblClick: function (p_oEvent) { + + var bReturnVal = true; + + if (this.get("type") == "split" && Event.getPageX(p_oEvent) > this._nOptionRegionX) { + + bReturnVal = false; + + } + + return bReturnVal; + + }, + + + /** + * @method _onAppendTo + * @description "appendTo" event handler for the button. + * @protected + * @param {Event} p_oEvent Object representing the DOM event object + * passed back by the event utility (YAHOO.util.Event). + */ + _onAppendTo: function (p_oEvent) { + + /* + It is necessary to call "_addListenersToForm" using + "setTimeout" to make sure that the button's "form" property + returns a node reference. Sometimes, if you try to get the + reference immediately after appending the field, it is null. + */ + + Lang.later(0, this, this._addListenersToForm); + + }, + + + /** + * @method _onFormReset + * @description "reset" event handler for the button's form. + * @protected + * @param {Event} p_oEvent Object representing the DOM event + * object passed back by the event utility (YAHOO.util.Event). + */ + _onFormReset: function (p_oEvent) { + + var sType = this.get("type"), + oMenu = this._menu; + + if (sType == "checkbox" || sType == "radio") { + + this.resetValue("checked"); + + } + + + if (Menu && oMenu && (oMenu instanceof Menu)) { + + this.resetValue("selectedMenuItem"); + + } + + }, + + + /** + * @method _onFormSubmit + * @description "submit" event handler for the button's form. + * @protected + * @param {Event} p_oEvent Object representing the DOM event + * object passed back by the event utility (YAHOO.util.Event). + */ + _onFormSubmit: function (p_oEvent) { + + this.createHiddenFields(); + + }, + + + /** + * @method _onDocumentMouseDown + * @description "mousedown" event handler for the document. + * @protected + * @param {Event} p_oEvent Object representing the DOM event object + * passed back by the event utility (YAHOO.util.Event). + */ + _onDocumentMouseDown: function (p_oEvent) { + + var oTarget = Event.getTarget(p_oEvent), + oButtonElement = this.get("element"), + oMenuElement = this._menu.element; + + + if (oTarget != oButtonElement && + !Dom.isAncestor(oButtonElement, oTarget) && + oTarget != oMenuElement && + !Dom.isAncestor(oMenuElement, oTarget)) { + + this._hideMenu(); + + Event.removeListener(document, "mousedown", + this._onDocumentMouseDown); + + } + + }, + + + /** + * @method _onOption + * @description "option" event handler for the button. + * @protected + * @param {Event} p_oEvent Object representing the DOM event object + * passed back by the event utility (YAHOO.util.Event). + */ + _onOption: function (p_oEvent) { + + if (this.hasClass("yui-split-button-activeoption")) { + + this._hideMenu(); + + this._bOptionPressed = false; + + } + else { + + this._showMenu(p_oEvent); + + this._bOptionPressed = true; + + } + + }, + + + /** + * @method _onMenuShow + * @description "show" event handler for the button's menu. + * @private + * @param {String} p_sType String representing the name of the event + * that was fired. + */ + _onMenuShow: function (p_sType) { + + Event.on(document, "mousedown", this._onDocumentMouseDown, + null, this); + + var sTitle, + sState; + + if (this.get("type") == "split") { + + sTitle = this.SPLITBUTTON_OPTION_VISIBLE_TITLE; + sState = "activeoption"; + + } + else { + + sTitle = this.MENUBUTTON_MENU_VISIBLE_TITLE; + sState = "active"; + + } + + this.addStateCSSClasses(sState); + this.set("title", sTitle); + + }, + + + /** + * @method _onMenuHide + * @description "hide" event handler for the button's menu. + * @private + * @param {String} p_sType String representing the name of the event + * that was fired. + */ + _onMenuHide: function (p_sType) { + + var oMenu = this._menu, + sTitle, + sState; + + + if (this.get("type") == "split") { + + sTitle = this.SPLITBUTTON_DEFAULT_TITLE; + sState = "activeoption"; + + } + else { + + sTitle = this.MENUBUTTON_DEFAULT_TITLE; + sState = "active"; + } + + + this.removeStateCSSClasses(sState); + this.set("title", sTitle); + + + if (this.get("type") == "split") { + + this._bOptionPressed = false; + + } + + }, + + + /** + * @method _onMenuKeyDown + * @description "keydown" event handler for the button's menu. + * @private + * @param {String} p_sType String representing the name of the event + * that was fired. + * @param {Array} p_aArgs Array of arguments sent when the event + * was fired. + */ + _onMenuKeyDown: function (p_sType, p_aArgs) { + + var oEvent = p_aArgs[0]; + + if (Event.getCharCode(oEvent) == 27) { + + this.focus(); + + if (this.get("type") == "split") { + + this._bOptionPressed = false; + + } + + } + + }, + + + /** + * @method _onMenuRender + * @description "render" event handler for the button's menu. + * @private + * @param {String} p_sType String representing the name of the + * event thatwas fired. + */ + _onMenuRender: function (p_sType) { + + var oButtonElement = this.get("element"), + oButtonParent = oButtonElement.parentNode, + oMenu = this._menu, + oMenuElement = oMenu.element, + oSrcElement = oMenu.srcElement; + + + if (oButtonParent != oMenuElement.parentNode) { + + oButtonParent.appendChild(oMenuElement); + + } + + this._renderedMenu = true; + + // If the user has designated an